You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 16:18:02