取消焦点后不会调用 onEditingComplete

Dan*_*ous 8 flutter

我有一个像这样的文本字段。额外的代码是必要的,以表明在不同的情况下,我会进行各种焦点操​​作。

  final node = FocusScope.of(context);
  Function cleanInput = () => {controller.text = controller.text.trim()};
  Function onEditingComplete;
  Function onSubmitted
  TextInputAction textInputAction;
  if (!isLast) {
    onEditingComplete = () => {
          cleanInput(),
          node.nextFocus(),
        };
    onSubmitted = (_) => {cleanInput()};
    textInputAction = TextInputAction.next;
  } else {
    onEditingComplete = () => {
          cleanInput(),
        };
    onSubmitted = (_) => {
          cleanInput(),
          node.unfocus(),
        };
    textInputAction = TextInputAction.done;
  }
  Widget textInput = TextField(
      textInputAction: textInputAction,
      controller: controller,
      onEditingComplete: onEditingComplete,
      onSubmitted: onSubmitted,
      keyboardType: textInputType,
      ));
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我有我想要运行的函数onEditingCompleteNext但是,只有当我按下键盘上的或Done按钮(或模拟器中的 Enter 键)时,才会调用此函数。如果我通过点击不同的字段来改变焦点,则不会调用此函数。

我尝试过使用FocusFocusNode来帮助解决此问题,但是当我这样做时,该onEditingComplete函数本身不再起作用。

当一切都很好地配合时,我怎样才能在这里获得所需的效果?

Bak*_*ker 10

焦点小部件

\n

将字段包装在小部件中Focus可能会达到目的。

\n

Focus小部件将捕获儿童的焦点丢失事件。通过它的onFocusChange参数你可以调用任意函数。

\n

同时,onEditingCompleteTextField 的参数不受影响,仍会在软件键盘“Next/Done”按键上调用。

\n

这应该可以处理“下一步/完成”按键和用户点击另一个字段时的字段焦点丢失问题。

\n
import 'package:flutter/material.dart';\n\nclass TextFieldFocusPage extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      body: SafeArea(\n        child: Container(\n          padding: EdgeInsets.symmetric(horizontal: 20),\n          child: Column(\n            mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n            children: [\n              // \xe2\x86\x93 Add this wrapper\n              Focus(\n                child: TextField(\n                  autofocus: true,\n                  decoration: InputDecoration(\n                    labelText: 'Name'\n                  ),\n                  textInputAction: TextInputAction.next,\n                  // \xe2\x86\x93 Handle focus change on Next / Done soft keyboard keys\n                  onEditingComplete: () {\n                    print('Name editing complete');\n                    FocusScope.of(context).nextFocus();\n                  },\n                ),\n                canRequestFocus: false,\n                // \xe2\x86\x93 Focus widget handler e.g. user taps elsewhere\n                onFocusChange: (hasFocus) {\n                  hasFocus ? print('Name GAINED focus') : print('Name LOST focus');\n                },\n              ),\n              TextField(\n                decoration: InputDecoration(\n                  labelText: 'Password'\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n