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

Flutter跨Widget访问报错:无法调用task_screen中定义的tasks列表

问题原因

你遇到的Undefined name 'tasks'报错本质是两个问题:

  1. tasks是TaskScreen组件的私有状态(定义在带下划线的_TaskScreenState类内部),Dart中带下划线的类/属性仅能在定义它的文件内访问,跨文件就算导入了也无法直接调用。
  2. 你已经给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:06:03