0

我是 Flutter 的新手,并且希望在当前 TextFormField 达到它的 maxLength 时从一个 TextFormField 移动到另一个,而无需按 Enter。这意味着我可以在小时 TextFormField 上输入 2 位数字,而聚焦的 TextFormField 将移动到分钟 TextFormField 等等。

我曾尝试使用 nextFocus(),但是这仅在按 Enter 时有效。

小时输入的示例小部件:

Widget _buildHH(){
    return Theme(
      data: Theme.of(context).copyWith(primaryColor: Colors.orange),
      child: Expanded(
        child:
        TextFormField(
          maxLength: 2,
          cursorColor: Colors.orange,
          style: TextStyle(color: Colors.orange),
          decoration: InputDecoration(
              border: OutlineInputBorder(),
              labelText: 'HH'
          ),
          onEditingComplete: () => FocusScope.of(context).nextFocus(),
          keyboardType: TextInputType.number,
          validator: (String value){
            return null;
          },
          onSaved: (String value){
            _HH = value;
          },
        ),
      )
    );
  }


4

2 回答 2

2

给你所有的TextFormFieldaFocusNode和 aTextEditingController

  TextEditingController fooController = TextEditingController();
  TextEditingController bahController = TextEditingController();

  FocusNode fooFocusNode;
  FocusNode bahFocusNode;

 @override
  void initState() {
    super.initState();

    fooFocusNode = FocusNode();
    bahFocusNode = FocusNode();
  }

@override
  void dispose() {

    fooFocusNode.dispose();
    bagFocusNode.dispose();
    fooController.dispose();
    bahController.dispose();
    super.dispose();
  }

Controller's 和FocusNode's 分配给你TextFormField的 's

在您的TextFormField监听中,onChanged这将返回您的控制器拥有的当前值。从这里你可以做一个简单的检查,看看你的参数是否得到满足。

onChanged: (value) {

  if (value.length >= 2) {
    fooFocusNode.unfocus();
    FocusScope.of(context).requestFocus(bahFocusNode);
  }
},
于 2021-02-25T20:18:22.423 回答
1
final node = FocusScope.of(context);

在 build 方法下初始化这个变量

onChanged: (value) {
                   if (value.length == 2) node.nextFocus();
                     },

将此 onChanged 方法添加到您的 TextFormField,如果 textfield 中文本的长度等于 2,它将自动转移焦点。

于 2021-02-25T20:25:12.920 回答