Flutter TextFormField未编辑时onChanged返回null如何获取初始值
问题原因
onChanged 回调仅在用户手动修改输入框内容时才会触发,未做编辑操作时回调不会执行。你代码里的_input变量声明时没有赋初始值,默认就是null,所以直接点按钮打印结果为null,只有用户修改输入内容触发onChanged后,_input才会被赋值为输入框的实际内容。
解决方法
两种常用方案都能满足需求,选一种即可:
方案1:初始化变量时直接绑定初始值
把输入框的初始值抽成统一常量,声明_input的时候直接赋值,避免硬写两份导致初始值不一致,示例代码:
// 统一定义输入框初始值,后续修改只需要改这一处 const _inputInitialValue = 'initial value '; class _HomeState extends State<Home> { // 声明变量时直接赋初始值,不要留空 var _input = _inputInitialValue; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('hello')), body: Column( children: [ TextFormField( initialValue: _inputInitialValue, onChanged: (text) { // 不需要实时刷新UI的话这里可以不用setState,直接赋值即可 _input = text; }, ), RaisedButton( onPressed: () { print(_input); }, child: Text('Press me'), ) ], ), ); } }
方案2:使用TextEditingController管理输入内容(官方推荐)
这是Flutter官方推荐的输入框内容管控方式,不需要依赖onChanged回调,随时可以通过控制器拿到输入框的实时内容,也不会出现初始值不同步的问题,示例代码:
class _HomeState extends State<Home> { // 初始化输入控制器,直接传入初始值 final _inputController = TextEditingController(text: 'initial value '); @override void dispose() { // 页面销毁时释放控制器,避免内存泄漏 _inputController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('hello')), body: Column( children: [ TextFormField( // 绑定控制器,注意不要和initialValue同时设置,否则会报错 controller: _inputController, ), RaisedButton( onPressed: () { // 直接读取控制器的text属性,不管用户有没有编辑都能拿到正确值 print(_inputController.text); }, child: Text('Press me'), ) ], ), ); } }
注意:使用
controller属性时,不要再给TextFormField设置initialValue,两个属性互斥,同时使用会抛出运行时异常。
内容的提问来源于stack exchange,提问作者tr1via
相关产品推荐
相关产品推荐

