Flutter跨Widget访问报错:无法调用task_screen中定义的tasks列表
问题原因
你遇到的Undefined name 'tasks'报错本质是两个问题:
tasks是TaskScreen组件的私有状态(定义在带下划线的_TaskScreenState类内部),Dart中带下划线的类/属性仅能在定义它的文件内访问,跨文件就算导入了也无法直接调用。- 你已经给
AddTaskScreen设计了addTaskCallBack回调参数用来传递新增的任务内容,但实际没有用到,反而尝试直接访问父组件的私有变量。
修复步骤
1. 修正task_screen.dart中回调和setState的语法错误
找到悬浮按钮的onPressed回调代码,修改为如下内容:
floatingActionButton: FloatingActionButton( backgroundColor:Colors.lightBlueAccent, child: const Icon(Icons.add), onPressed: (){ showModalBottomSheet( context: context, builder:(context)=>AddTaskScreen( (newTaskTitle) { // setState是方法,需要传入函数执行状态更新 setState(() { tasks.add(Task(name: newTaskTitle)); }); // 新增完成后自动关闭底部弹窗 Navigator.pop(context); } ) ); }, ),
2. 修正add_task_screen.dart中提交逻辑,改用回调传递数据
首先优化addTaskCallBack的类型声明(避免动态类型隐患),然后把按钮点击事件里直接操作tasks的代码换成调用回调:
import 'package:flutter/material.dart'; import 'package:todoey_flutter/Models/task.dart'; class AddTaskScreen extends StatelessWidget { late String newTaskTitle; // 明确指定回调接收字符串类型的任务标题 final Function(String) addTaskCallBack; AddTaskScreen( this.addTaskCallBack, {Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.all(20.0), child: Container( decoration:const BoxDecoration( color: Colors.white, borderRadius: BorderRadius.only(topLeft:Radius.circular(20.0) ,topRight:Radius.circular(20.0)), ), child:Column( crossAxisAlignment: CrossAxisAlignment.stretch, children:[ const Center( child: Text('Add Task', style: TextStyle( fontSize:30.0, color:Colors.lightBlueAccent, ), ), ), TextField( autofocus: true, autocorrect: true, textAlign: TextAlign.center, onChanged: (newText){ newTaskTitle = newText; }, ), // 注:FlatButton已在新版Flutter中废弃,替换为TextButton即可 TextButton( style: TextButton.styleFrom(backgroundColor: Colors.lightBlueAccent), onPressed: (){ // 加个非空校验,避免提交空白任务 if(newTaskTitle.trim().isNotEmpty) { addTaskCallBack(newTaskTitle); } }, child: const Text('Add', style: TextStyle(color: Colors.white)), ) ] ) ), ); } }
做完以上修改就能正常新增任务了。
内容的提问来源于stack exchange,提问作者Karthik KK
相关产品推荐
相关产品推荐

