我有一个Flutter 的TextField,当该字段被选中时,它会被软键盘覆盖.当键盘显示时,我需要向上滚动字段,使其不挡道.这是一个非常常见的问题,在这个StackOverflow post中给出了一个解决方案.

我想我已经计算出了ScrollController个部件,但是我如何检测到 Select 了TextField个部件?似乎没有任何事件方法(例如onFocus()、onSelected()、onTap()等).

我try 将TextField包装在GestureDetector中,但也不起作用--显然事件从未被捕获.

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

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

推荐答案

我想你在找FocusNode个吧.

要收听焦点变化,您可以在FocusNode上添加一个Listner,然后指定focusNodeTextField.

示例:

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,
      ),
    );
  }
}

ThisGist表示如何确保聚焦的 node 在UI上可见.

希望有帮助!

Flutter相关问答推荐

Cupertino Buttino SheetAction on按下可触发加载指示器,然后勾选并延迟

Flutter BLoC et workmanager:如何创建独特的仓库初始化模式?

如何将带有参数的函数传递给FIFTH中的自定义小部件

Ffltter Firebase向用户添加公司

如何使listview.builder在筛选列表后实时更新

处理 flutter/dart 模型中的空值

Flutter:注册 UI 出现 UI 问题(将注册框提升到顶部并向电话号码 pin 码添加一个框)

Flutter Riverpod 对提供者状态的变化做出react

Flutter底部面板局部显示

从所有设备注销,因为用户帐户已从 firebase flutter 中删除

Flutter - firebase_auth_web 5.4.0 依赖于 intl ^0.17.0 但我必须使用更高版本 (intl ^0.18.0)

如何设置行中项目之间的空格相等?

Flutter - 展开图标无法正常工作

Android Studio - Electric Eel 2022.1.1 更新 destruct 了 dart 文件图标

flutter - 无法解析 JSON 消息:文档为空

如何根据字符串值动态构建和显示小部件?

如何在 ListView.builder 中扩展文本?

Navigator.push '!_debugLocked' 上的错误:不正确

Flutter:整个判断整个应用生命周期的通用类

既然我们已经有了 Flutter 的内置 setState,为什么还要在 Flutter 中使用 BloC 或 Provider?