onChnaged 的​​值给我 null

value of onChnaged giving me null

当我点击凸起的按钮时,我正在打印 null。

如果用户未输入任何内容,我想查看初始值。 如果修改了 initialValue 那么 print 语句应该打印修改后的语句(它确实如此)。

代码:

class _HomeState extends State<Home> {
  var _input;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('hello')),
      body: Column(
        children: [
          TextFormField(
            initialValue: 'initial value ',
            onChanged: (text) {
              setState(() {
                _input = text;
              });
            },
          ),
          RaisedButton(
            onPressed: () {
              print(_input);
            },
            child: Text('Press me'),
          )
        ],
      ),
    );
  }
}

不编辑 TextFormField 时的输出

flutter: null

编辑 TextFormField 时的输出

flutter: initial value test

如果用TextEditingController就更好了。

 final controller =
      TextEditingController.fromValue(TextEditingValue(text: 'initial value '));

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('hello')),
      body: Column(
        children: [
          TextFormField(
            controller: controller,
            onChanged: (text) {},
          ),
          RaisedButton(
            onPressed: () {
              print(controller.text);
            },
            child: Text('Press me'),
          )
        ],
      ),
    );
  }

更多关于 TextEditingController

如果你还在使用变量,初始化变量上的文本并使用它。

 String _input = 'initial value ';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('hello')),
      body: Column(
        children: [
          TextFormField(
            initialValue: _input,
            onChanged: (text) {
              setState(() {
                _input = text;
              });
            },
          ),
          RaisedButton(
            onPressed: () {
              print(_input);
            },
            child: Text('Press me'),
          )
        ],
      ),
    );
  }

您也可以将其设置为可空并检查它是否为空,然后提供默认值,这在这种情况下似乎是不必要的。

String? _input;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('hello')),
      body: Column(
        children: [
          TextFormField(
            initialValue: 'initial value ',
            onChanged: (text) {
              setState(() {
                _input = text;
              });
            },
          ),
          RaisedButton(
            onPressed: () {
              print(_input ?? 'initial value ');
            },
            child: Text('Press me'),
          )
        ],
      ),
    );
  }