Flutter关闭键盘后添加任务触发newTaskTitle未初始化错误如何解决?
错误原因
你将late String newTaskTitle变量定义在了build方法内部,Flutter每次触发UI重绘时都会重新执行build方法,该变量会被重置为未初始化的状态。关闭键盘的操作会触发系统UI重绘,此时你之前输入内容赋值的newTaskTitle会被清空,点击添加按钮调用未初始化的late变量就会抛出对应异常。
而键盘保持开启时页面没有触发重绘,变量值还保留,所以可以正常提交。
解决方案
步骤1:调整变量存储位置
将newTaskTitle从build方法移到当前页面State类的成员变量位置,同时避免使用late关键字,直接给定初始值防止空异常:
class _AddTaskScreenState extends State<AddTaskScreen> { // 定义为State的成员变量,页面重绘不会被重置 String newTaskTitle = ''; @override Widget build(BuildContext context) { // 删除原来在这里的late String newTaskTitle; // 其余原有代码保持不变 } }
步骤2:添加提交校验,优化异常场景处理
修改添加按钮的点击逻辑,增加非空校验,避免用户输入空内容或者全空格时提交无效数据:
onPressed: () { final taskTitle = newTaskTitle.trim(); if (taskTitle.isNotEmpty) { Provider.of<TaskData>(context, listen: false).addTask(taskTitle); Navigator.pop(context); } }
更稳妥的替代方案(推荐)
使用TextEditingController来管理TextField的输入内容,是Flutter官方推荐的输入框内容获取方式,无需手动维护变量存储输入值,稳定性更高:
class _AddTaskScreenState extends State<AddTaskScreen> { // 初始化控制器 final TextEditingController _titleController = TextEditingController(); // 页面销毁时销毁控制器,避免内存泄漏 @override void dispose() { _titleController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Container( // 原有外层代码不变 child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Text("Add Question", textAlign: TextAlign.center, style: TextStyle(fontSize: 30, color: myColor),), TextField( decoration: InputDecoration( enabledBorder: UnderlineInputBorder( borderSide: BorderSide(color: myColor), ), focusedBorder: UnderlineInputBorder( borderSide: BorderSide(color: myColor), ), border: UnderlineInputBorder( borderSide: BorderSide(color: myColor), ), ), autofocus: true, textAlign: TextAlign.center, // 绑定控制器,无需再实现onChanged controller: _titleController, ), FlatButton( child: Text( "Add", style: TextStyle( color: mybackgroundcColor, ), ), color: myColor, onPressed: () { final taskTitle = _titleController.text.trim(); if (taskTitle.isNotEmpty) { Provider.of<TaskData>(context, listen: false).addTask(taskTitle); Navigator.pop(context); } }, ) ], ), ); } }
内容的提问来源于stack exchange,提问作者Bn Minki
相关产品推荐
相关产品推荐

