dart - Flutter 检测键盘结束隐藏动画

标签 dart flutter

我在 Flutter 中有一个页面,其中包含几个小部件,包括一个 TextField(我们称之为 View1)。当用户单击 TextField 时,我重建仅显示 TextField 和键盘的页面(我们称之为 View2)。当用户完成 TextField 时,我再次重建页面,显示所有小部件,如前所述(我们称其为 View3,但请注意它与 View1 相同)。除了一件事,这工作正常。我得到一个临时的黄色/黑色指示器(在 Debug模式下),表明没有足够的空间来显示 View3 中的所有小部件。该指示器只持续很短的时间,我最终发现它出现是因为 Flutter 试图在键盘尚未完成动画处理时显示所有小部件。一旦键盘完成动画消失,黄色/黑色条就会消失,我认为这解释了为什么它只短暂出现。

在键盘完成动画化后执行的回调中请求构建 View3 会很好,但我看不到这样做的任何方式。也许我错过了什么?

我能想到的解决此问题的另一种方法是在构建 View3 之前插入延迟,以便有时间让键盘消失,但这似乎有点老套。还有其他想法吗?

编辑

我按如下方式添加了一个延迟,它起作用了。不过看起来还是有点老套。

Timer(Duration(milliseconds: 500),(){setState((){});});

最佳答案

尝试使用 WidgetsBindingObserver 并覆盖 didChangeMetrics 方法,如下所示:

  class KeyboardTogglePage extends StatefulWidget {
    @override
    _KeyboardTogglePageState createState() => _KeyboardTogglePageState();
  }

  class _KeyboardTogglePageState extends State<KeyboardTogglePage>
      with WidgetsBindingObserver {
    @override
    void initState() {
      super.initState();
      WidgetsBinding.instance.addObserver(this);
    }

    @override
    void dispose() {
      WidgetsBinding.instance.removeObserver(this);
      super.dispose();
    }

    var isKeyboardOpen = false;

    ///
    /// This routine is invoked when the window metrics have changed.
    ///
    @override
    void didChangeMetrics() {
      final value = MediaQuery.of(context).viewInsets.bottom;
      if (value > 0) {
        if (isKeyboardOpen) {
          _onKeyboardChanged(false);
        }
        isKeyboardOpen = false;
      } else {
        isKeyboardOpen = true;
        _onKeyboardChanged(true);
      }
    }

    _onKeyboardChanged(bool isVisible) {
      if (isVisible) {
        print("KEYBOARD VISIBLE");
      } else {
        print("KEYBOARD HIDDEN");
      }
    }

    @override
    Widget build(BuildContext context) {
      return Container(
        child: Center(
          child: TextField(),
        ),
      );
    }
  }

关于dart - Flutter 检测键盘结束隐藏动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52140698/

相关文章:

flutter - 如何修复此语法错误?不可为 null 的实例字段 'students' 必须初始化

dart - 比较两个字符串列表并检查它们是否至少有一个相同的字符串

visual-studio-code - Flutter Packages 进入 VS Code 失败

json - Flutter:JSON 循环

flutter - 单击按钮更改appBar

flutter - Flutter 无响应重试 Http Get 请求

dart - 聚合物元素的行为不正确,始终在顶部有纸按钮,仅在动画过程中有纸阴影

flutter - 我如何根据条件查看 FloatingActionButton

flutter - 如何在 flutter 中访问父窗口小部件的数据?

flutter - 使用 image_picker 打开图库时 iOS 应用程序崩溃