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
相关产品推荐
相关产品推荐

