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

Flutter任务添加应用报错:'Null'类型不是'String'子类型

问题原因

错误'type "Null" is not a subtype of type "String"'的核心根源:

  • AddTaskScreen里的newTaskTitle是可空的String?类型,要是用户啥都没输入就点「Add」,这个变量会以null状态传给回调函数。
  • Task类的name参数要求非空String,把null直接传进去就触发了类型不匹配错误。
  • 顺带提个隐藏问题:原代码添加任务后没调用setState(),就算添加成功,任务列表UI也不会自动刷新。
修复方案

方案1:在添加按钮点击时校验输入,杜绝空值传递

修改AddTaskScreen中TextButton的onPressed逻辑,只有输入有效时才执行回调并关闭模态框:

TextButton(
  style: const ButtonStyle(
    elevation: MaterialStatePropertyAll(1.0),
    backgroundColor: MaterialStatePropertyAll(Colors.lightBlueAccent),
  ),
  onPressed: () {
    // 校验输入非空且不是纯空白字符
    if (newTaskTitle?.trim().isNotEmpty == true) {
      addTaskCallback(newTaskTitle!.trim());
      Navigator.pop(context); // 关闭添加任务的弹窗
    }
  },
  child: const Text(
    'Add',
    style: TextStyle(color: Colors.white),
  ),
),

方案2:在回调里处理空值并触发UI更新

修改TaskScreen传给AddTaskScreen的回调,加空值校验同时调用setState()刷新列表:

AddTaskScreen(
  (newTaskTitle) {
    if (newTaskTitle?.trim().isNotEmpty == true) {
      setState(() {
        tasks.add(Task(name: newTaskTitle!.trim()));
      });
    }
  },
),

方案3:把newTaskTitle设为非空类型(可选)

要是想让newTaskTitle始终是非空字符串,就在AddTaskScreen的build方法里初始化为空字符串:

@override
Widget build(BuildContext context) {
  String newTaskTitle = ''; // 改成非空类型,初始值为空字符串

  return Container(
    // 其余代码不变
    TextField(
      autofocus: true,
      textAlign: TextAlign.center,
      onChanged: (newText){
        newTaskTitle = newText;
      },
    ),
    // 其余代码不变
  );
}

这种方式还是建议配合输入校验,避免添加空白任务。

额外优化建议
  • 给TextField加个hintText,比如hintText: '输入任务内容',引导用户输入。
  • 可以在输入为空时禁用「Add」按钮,从交互层面避免空输入操作。

内容的提问来源于stack exchange,提问作者Fred_Wolfe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:13:16