如何检测 Flutter 中何时选择 TextField?

2024-01-12

我有一个 Flutter TextField,当选择该字段时,它会被软键盘覆盖。当显示键盘时,我需要向上滚动该字段并移开。这是一个很常见的问题,这里提出了一个解决方案StackOverflow 帖子 https://stackoverflow.com/questions/47338714/flutter-texteditingcontroller-does-not-scroll-above-keyboard/49341655#49341655.

我想我有滚动控制器部分已弄清楚,但我如何检测文本域已被选中?似乎没有任何事件方法(例如 onFocus()、onSelected()、onTap() 等)。

我尝试将 TextField 包装在手势检测器但这也不起作用——显然该事件从未被捕获。

new GestureDetector(
  child: new TextField(
    decoration: const InputDecoration(labelText: 'City'),
  ),
  onTap: () => print('Text Selected'),
),

这是一个基本要求,我知道一定有一个简单的解决方案。


我想你正在寻找FocusNode https://docs.flutter.io/flutter/widgets/FocusNode-class.html.

要监听焦点变化,您可以添加一个监听器FocusNode并指定focusNode to TextField.

Example:

class TextFieldFocus extends StatefulWidget {
  @override
  _TextFieldFocusState createState() => _TextFieldFocusState();
}

class _TextFieldFocusState extends State<TextFieldFocus> {
  FocusNode _focus = FocusNode();

  TextEditingController _controller = TextEditingController();

  @override
  void initState() {
    super.initState();
    _focus.addListener(_onFocusChange);
  }

  @override
  void dispose() {
    super.dispose();
    _focus.removeListener(_onFocusChange);
    _focus.dispose();
  }

  void _onFocusChange() {
    debugPrint("Focus: ${_focus.hasFocus.toString()}");
  }
  
  @override
  Widget build(BuildContext context) {
    return new Container(
      color: Colors.white,
      child: new TextField(
        focusNode: _focus,
      ),
    );
  }
}

This https://gist.github.com/collinjackson/50172e3547e959cba77e2938f2fe5ff5gist 表示如何确保焦点节点在 ui 上可见。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检测 Flutter 中何时选择 TextField? 的相关文章

随机推荐