代码之家  ›  专栏  ›  技术社区  ›  thanhbinh84

无法用TextFormField更新文本

  •  0
  • thanhbinh84  · 技术社区  · 4 年前

    我想添加飞溅后,用户输入了2个数字为日和2个数字为月。下面的代码以前有效,但我不知道从哪个颤振版本,它开始行为奇怪。

    class MyCustomForm extends StatefulWidget {
      @override
      _MyCustomFormState createState() => _MyCustomFormState();
    }
    
    class _MyCustomFormState extends State<MyCustomForm> {
      final _dobInputController = TextEditingController();
      String _lastDobValue = '';
    
      @override
      void initState() {
        super.initState();
        _dobInputController.addListener(_onTextChange);
      }
    
      @override
      void dispose() {
        _dobInputController.dispose();
        super.dispose();
      }
    
      _onTextChange() {
        int length = _dobInputController.text.length;
        if (_lastDobValue.length < length && (length == 2 || length == 5)) {
          _dobInputController.text += '/';
          _dobInputController.selection = TextSelection.fromPosition(TextPosition(offset: length + 1));
        }
        _lastDobValue = _dobInputController.text;
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
            body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            children: <Widget>[
              TextFormField(
                controller: _dobInputController,
                decoration: InputDecoration(
                  hintText: 'MM/DD/YYYY',
                ),
              )
            ],
          ),
        ));
      }
    }
    

    就换一个 TextFormField TextField ,它将再次正常工作。

    0 回复  |  直到 4 年前
        1
  •  0
  •   thanhbinh84    4 年前

    我们应该利用 inputFormatters 而是避免使用更新文本后出现内部循环 TextEditingController

    TextFormField(
                  decoration: InputDecoration(
                    hintText: 'MM/DD/YYYY',
                  ),
                  inputFormatters: [
                    TextInputFormatter.withFunction((oldValue, newValue) {
                      String newText = newValue.text;
                      int newTextLength = newText.length;
                      if (newValue.text.length > oldValue.text.length && (newTextLength == 2 || newTextLength == 5)) {
                        return TextEditingValue(
                            text: newText + '/',
                            selection: TextSelection.fromPosition(TextPosition(offset: newTextLength + 1)));
                      }
                      return newValue;
                    })
                  ])