【问题标题】:How to wait until keyboard is opened in flutter?如何等到键盘在颤动中打开?
【发布时间】:2020-12-23 23:38:12
【问题描述】:

当文本框获得焦点时,我需要滚动页面。
所以我使用了 scroll_to_index 插件(https://pub.dev/packages/scroll_to_index)。
但是只有在键盘已经打开的情况下才能正常运行。
如果我在未打开键盘时点击文本字段,它不会滚动页面。 我认为是因为在打开键盘之前页面已滚动。

在我看来,问题似乎是因为代码是这样工作的。

1.点击一个文本字段(链接的 Focusnode 有焦点)
2.它尝试将页面滚动到目标。但是因为现在键盘还没有打开,所以目标已经在视野中了。所以看起来什么也没发生。
3. 打开键盘,隐藏内容。

auto_scroll.dart

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:scroll_to_index/scroll_to_index.dart';

class MyCustomScrollView extends StatefulWidget {
  @override
  _MyCustomScrollViewState createState() => _MyCustomScrollViewState();
}

class _MyCustomScrollViewState extends State<MyCustomScrollView> {

  AutoScrollController _autoScrollController = new AutoScrollController();
  List<FocusNode> nodes = List<FocusNode>.generate(3, (index) => FocusNode());

  Future _scrollToIndex(int index) async {
    await _autoScrollController.scrollToIndex(index,
        preferPosition: AutoScrollPosition.end);
  }

  @override
  void initState() {
    super.initState();
    for(var i  =0;i<3;i++) {
      nodes[i].addListener(() {
        if(nodes[i].hasFocus) _scrollToIndex(i);
      });
    }
  }  

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      resizeToAvoidBottomInset: true,
      body: CustomScrollView(
        controller: _autoScrollController,
    slivers: [
      SliverToBoxAdapter(
        child: Container(
          child: Column(
            children: [
              SizedBox(height: 100),
              CupertinoTextField(
                focusNode: nodes[0],
                onEditingComplete: (){
                  FocusScope.of(context).requestFocus(nodes[1]);
                },
              ),
              AutoScrollTag(
                key: ValueKey(0),
                controller: _autoScrollController,
                index: 0,
                child: Container(height: 300, color : Colors.green)
              ),
              CupertinoTextField(
                focusNode: nodes[1],
                onEditingComplete: (){
                  FocusScope.of(context).requestFocus(nodes[2]);
                },
              ),
              AutoScrollTag(
                  key: ValueKey(1),
                  controller: _autoScrollController,
                  index: 1,
                  child: Container(
                    height: 300,
                    color : Colors.green,
                    child: Center(
                      child: Text("Here should be visible!!!!"),
                    ),
                  )
              ),
              CupertinoTextField(
                focusNode: nodes[2],
              ),
              AutoScrollTag(
                  key: ValueKey(2),
                  controller: _autoScrollController,
                  index: 2,
                  child: Container(height: 300, color : Colors.green)
              ),
            ],
          ),
        )
      )
    ],
  ),
    );
    }
}

这是代码。当我点击第二个文本字段时,它应该滚动以显示第二个文本字段下方的所有红色容器,但事实并非如此。 但是当键盘启动时,点击第二个文本字段会按需要工作。

点击第二个文本字段时的预期效果

实际发生了什么

我知道只关注文本字段就足以滚动到文本字段。但是在我的应用程序中,我在键盘上方有一个定位栏,所以我遇到了定位栏覆盖文本字段的情况。这就是我使用 scroll_to_index 的原因。

所以我要做的是等待键盘出现,然后当键盘出现时,运行_scrollToIndex函数。我怎样才能等到键盘打开?或者这个问题有什么好的解决方案?感谢您的阅读。

【问题讨论】:

  • 嗨!我在这里遇到同样的问题。您是否设法通过使用 flutter_keyboard_visibility 解决了这个问题?该插件帮助我对键盘可见性的变化做出反应,但它仍然不能让我正确滚动

标签: flutter keyboard flutter-layout


【解决方案1】:

您可以使用flutter_keyboard_visibility。有两种实现方式:with providerwith listener

【讨论】:

    猜你喜欢
    • 2020-02-09
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多