如何在 Flutter for web TextField 上触发 onSubmitted

How to trigger onSubmitted on a Flutter for web TextField

我有一个用于 web 的小型 flutter 应用程序,并且正在显示一个 TextField。

我现在需要一个类似 onSubmitted 的回调,每当用户离开 TextField(失去焦点)或按下 Enter 键时。现在我根本无法进行任何回调。

TextField(
  decoration: InputDecoration(
    labelText: 'Name',
  ),
  controller: TextEditingController(text: event.name),
  onEditingComplete: () { print("editing complete"); },
  onSubmitted: (String value) { print("submitted\n"); },
  maxLines: 1,
),

这似乎是一个问题: [web]: TextField onSubmitted is not triggered when pressing enter

这是 link 中提到的解决方法:

    body: RawKeyboardListener(
      focusNode: focusNode,
      onKey: (event) {
        if (event is RawKeyUpEvent && event.data is RawKeyEventDataAndroid) {
          var data = event.data as RawKeyEventDataAndroid;
          if (data.keyCode == 13) {
            debugPrint('onSubmitted');
          }
        }
      },
      child: TextField(),
    ),

这在 Flutter Web 上对我有用

            TextField(
              controller: _passwordController,
              decoration: InputDecoration(
                labelText: 'Password',
              ),
              obscureText: true,
              onSubmitted: (value) {
                _loginPresenter.login(
                    _usernameController.text, _passwordController.text);
              },
            ),

注意 onSubmitted 的定义。当用户在 flutter web 上按下 Enter 键时,loginPresenter.login 方法将被调用。

同时删除 maxLines: 1 似乎可以使 onsubmitted 正常工作。[在移动设备上遇到同样的问题]

您可以尝试创建一个方法,在其中对您的 TextEditingController 设置条件,并基于该条件在您的 TextField 上提交。

  • 第一个
   final entredTitle = titleController.text;
   final entredAmount = double.parse(amountController.text);
   if (entredTitle.isEmpty || entredAmount <= 0 ){
     return ;
   }
   widget.addTx(entredTitle,entredAmount);
   Navigator.of(context).pop();
 } 
  • 第二
 TextField(
                      decoration:  InputDecoration(labelText: 'Amount'),
                      controller: amountController,
                      onSubmitted: (_) => submitData(),
                    ),