【问题标题】:Flutter - how to add done button in number keyboard in flutterFlutter - 如何在颤动的数字键盘中添加完成按钮
【发布时间】:2019-04-29 12:54:18
【问题描述】:

我正在尝试在颤动中为 TextFormField 添加数字类型输入中的 done 按钮,但我无法做到这一点。

TextFormField(
          key: Key(keyValue),
          initialValue: valueBuilder,
          onSaved: (text) {
            fieldsController.text = text.trim();
          },
          inputFormatters: [inputFormatters],
          keyboardType: TextInputType.phoneNumber,)

我想创建一个如下所示的键盘。用于输入文本表单字段。

【问题讨论】:

标签: dart flutter


【解决方案1】:

我用这种方式处理IOS中的完成按钮

      keyboardType: Platform.isIOS? 
                    TextInputType.numberWithOptions(signed: true, decimal: true)
                  : TextInputType.number,
// This regex for only amount (price). you can create your own regex based on your requirement
     inputFormatters: [FilteringTextInputFormatter.allow(RegExp(r'^\d+\.?\d{0,4}'))],

【讨论】:

    【解决方案2】:

    这是在打开键盘时将完成按钮添加到TextFormField 的方法:

    textInputAction: TextInputAction.done,
    

    请注意,iOS 不支持在NUMERIC 键盘上完成

    【讨论】:

      【解决方案3】:

      我使用签名选项来显示完成按钮。然后我使用 TextInputFormatter 和 RegEx 来限制用户可以输入的内容。

      new TextFormField(
                    controller: myController,
                    keyboardType: TextInputType.numberWithOptions(signed:true, decimal: true),
                    textInputAction: TextInputAction.done,
                    onFieldSubmitted: (term) {
                      _showSnackBar(context, double.parse(myController.text));
                    },
                    onEditingComplete: () {
                      _showSnackBar(context, double.parse(myController.text));
                    },
                    decoration: const InputDecoration(
                      helperText: "Actual",
                      hintText: "Units used",
                      border: UnderlineInputBorder(),
                      icon: Icon(Icons.keyboard),
                    ),
                    inputFormatters: <TextInputFormatter>[
                      FilteringTextInputFormatter.allow(RegExp(r'^\d*\.?\d*$')),
                    ],
                  ),
      

      【讨论】:

        【解决方案4】:

        将此添加到您的文本字段

        TextField(
        ...
        keyboardType: TextInputType.numberWithOptions(signed: true),
        inputFormatters: [
            FilteringTextInputFormatter.digitsOnly,
        ],
        ...
        ),
        

        【讨论】:

          【解决方案5】:

          ios 键盘中没有完成按钮。解决方案是使用“keyboard_actions”插件,否则添加键盘布局顶部检查此

          https://blog.usejournal.com/keyboard-done-button-ux-in-flutter-ios-app-3b29ad46bacc

          【讨论】:

            【解决方案6】:

            您不需要done 按钮,只需将MaterialApp 包装为GestureDetector

            GestureDetector(
              behavior: HitTestBehavior.opaque,
              onTap: () {
                FocusScopeNode currentFocus = FocusScope.of(context);
            
                if (!currentFocus.hasPrimaryFocus &&
                    currentFocus.focusedChild != null) {
                  FocusManager.instance.primaryFocus.unfocus();
                }
              },
              child: MaterialApp(
                 title: "My title",
                 home:MyHomeScreen(),
                 ),
            );
            

            【讨论】:

            • 方法'unfocus'不能被无条件调用,因为receiver可以是'null'。 - 我收到了这个错误
            • 就是这样!非常感谢。但我想再补充一件事。我认为行为应该设置为 HitTestBehavior.translucent
            • 取决于你的颤振版本。如果HitTestBehavior.translucent 适合你,那就没问题。我希望您没有这样做,因为您在控制台上看到了警告。这在flutter 1.2 上完美运行
            【解决方案7】:

            iOS 中没有done 按钮,但我们可以检查输入的长度并清除focus 以隐藏数字键盘。 如下实现,(它将与固定长度的数值一起使用)

            onChanged: (val) {
                    if (val.length == 10) { //10 is the length of the phone number you're allowing
                      FocusScope.of(context).requestFocus(FocusNode());
                    }
                  }
            

            【讨论】:

              【解决方案8】:

              改变

              keyboardType: TextInputType.number
              

              keyboardType: TextInputType.numberWithOptions(signed: true, decimal: true)
              

              【讨论】:

              • 我认为对于数字键盘上的内置完成按钮来说,这是一个很好的临时解决方法iOS.
              • 您只需要signed: true 即可触发此解决方法。
              【解决方案9】:

              我刚刚创建了一个包,用于向当前键盘添加基本操作。

              你可以看看这里:

              https://pub.dartlang.org/packages/keyboard_actions

              用法:

                  import  'package:flutter/material.dart';
                  import  'package:keyboard_actions/keyboard_actions.dart';
              
                   //...
                    FocusNode _nodeText1 = FocusNode();
                    FocusNode _nodeText2 = FocusNode();
                    FocusNode _nodeText3 = FocusNode();
                    FocusNode _nodeText4 = FocusNode();
                    FocusNode _nodeText5 = FocusNode();
              
                   @override
                    Widget build(BuildContext context) {
                      return Scaffold(
                        appBar: AppBar(
                          title: Text("Keyboard Actions Sample"),
                        ),
                        body: FormKeyboardActions(
                          keyboardActionsPlatform: KeyboardActionsPlatform.ALL, //optional
                          keyboardBarColor: Colors.grey[200], //optional
                          nextFocus: true, //optional
                          actions: [
                            KeyboardAction(
                              focusNode: _nodeText1,
                            ),
                            KeyboardAction(
                              focusNode: _nodeText2,
                              closeWidget: IconButton(
                                icon: Icon(Icons.close),
                                onPressed: () {},
                              ),
                            ),
                            KeyboardAction(
                              focusNode: _nodeText3,
                              onTapAction: () {
                                showDialog(
                                    context: context,
                                    builder: (context) {
                                      return AlertDialog(
                                        content: Text("Custom Action"),
                                        actions: <Widget>[
                                          FlatButton(
                                            child: Text("OK"),
                                            onPressed: () => Navigator.of(context).pop(),
                                          )
                                        ],
                                      );
                                    });
                              },
                            ),
                            KeyboardAction(
                              focusNode: _nodeText4,
                              displayCloseWidget: false,
                            ),
                            KeyboardAction(
                              focusNode: _nodeText5,
                              closeWidget: Padding(
                                padding: EdgeInsets.all(5.0),
                                child: Text("CLOSE"),
                              ),
                            ),
                          ],
                          child: Padding(
                            padding: const EdgeInsets.all(15.0),
                            child: SingleChildScrollView(
                              child: Column(
                                crossAxisAlignment: CrossAxisAlignment.stretch,
                                children: <Widget>[
                                  TextField(
                                    keyboardType: TextInputType.number,
                                    focusNode: _nodeText1,
                                    decoration: InputDecoration(
                                      hintText: "Input Number",
                                    ),
                                  ),
                                  TextField(
                                    keyboardType: TextInputType.text,
                                    focusNode: _nodeText2,
                                    decoration: InputDecoration(
                                      hintText: "Input Text with Custom Close Widget",
                                    ),
                                  ),
                                  TextField(
                                    keyboardType: TextInputType.number,
                                    focusNode: _nodeText3,
                                    decoration: InputDecoration(
                                      hintText: "Input Number with Custom Action",
                                    ),
                                  ),
                                  TextField(
                                    keyboardType: TextInputType.text,
                                    focusNode: _nodeText4,
                                    decoration: InputDecoration(
                                      hintText: "Input Text without Close Widget",
                                    ),
                                  ),
                                  TextField(
                                    keyboardType: TextInputType.number,
                                    focusNode: _nodeText5,
                                    decoration: InputDecoration(
                                      hintText: "Input Number with Custom Close Widget",
                                    ),
                                  ),
                                ],
                              ),
                            ),
                          ),
                        ),
                      );
                    }
              

              【讨论】:

                猜你喜欢
                • 2022-11-01
                • 2019-02-14
                • 1970-01-01
                • 2013-12-10
                • 2023-03-15
                • 2012-04-22
                • 1970-01-01
                • 2012-10-09
                相关资源
                最近更新 更多