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

Flutter待办应用Firestore任务误创建于祖先文档问题修复

问题诊断与解决方案

核心问题定位

你遇到的本质问题是:listOfTaskLists数据源中,id字段被错误赋值为列表名称,而非Firestore文档的实际ID。首页打印的"正确ID"其实是列表名称,导致导航时传递的是名称而非真实文档ID,最终任务被写入错误的文档路径。


分步解决

1. 修正TaskList模型类(关键)

假设你有一个TaskList模型类用于解析Firestore数据,大概率是在转换文档时混淆了文档ID和文档内的name字段。

错误示例:

class TaskList {
  String id;
  String name;

  TaskList({required this.id, required this.name});

  factory TaskList.fromDocument(DocumentSnapshot doc) {
    return TaskList(
      id: doc.data()!['name'], // 错误:把文档的name字段当成了ID
      name: doc.data()!['name'],
    );
  }
}

修正后:

class TaskList {
  final String id;
  final String name;

  TaskList({required this.id, required this.name});

  factory TaskList.fromDocument(DocumentSnapshot doc) {
    final data = doc.data() as Map<String, dynamic>;
    return TaskList(
      id: doc.id, // 正确:获取Firestore文档的唯一ID
      name: data['name'], // 获取文档存储的列表名称
    );
  }
}

2. 验证数据源加载逻辑

确保加载taskLists集合时,使用正确的模型转换方法:

Future<void> loadTaskLists() async {
  final snapshot = await FirebaseFirestore.instance.collection('taskLists').get();
  setState(() {
    listOfTaskLists = snapshot.docs.map((doc) => TaskList.fromDocument(doc)).toList();
  });
}

3. 确认导航传递的ID正确性

在首页添加调试打印,明确区分文档ID和列表名称:

Widget buildTaskListTile(BuildContext context, int index) {
  final taskList = listOfTaskLists[index];
  print('文档ID: ${taskList.id},列表名称: ${taskList.name}'); // 确认两者不同
  return TaskListTile(
    listName: taskList.name,
    onTap: () {
      Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) => ToDoListPage(listId: taskList.id),
        ),
      );
    },
    onEdit: () => editList(taskList),
    onDelete: () => deleteList(taskList),
  );
}

4. 任务页引用修正(自动生效)

完成上述步骤后,任务页的widget.listId会自动接收正确的文档ID,无需修改现有代码:

@override
void initState() {
  super.initState();
  print('接收的文档ID: ${widget.listId}'); // 现在会打印Firestore文档的真实ID
  taskListDoc = FirebaseFirestore.instance
      .collection('taskLists')
      .doc(widget.listId);
  loadTasks();
}

验证方法

  1. 打开Firestore控制台,查看taskLists集合下的文档:
    • 每个文档的ID应为一串随机字符串(或你自定义的ID)
    • 文档内部包含name字段,存储列表名称
  2. 添加新任务后,检查对应文档的tasks子集合是否出现新任务文档

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 15:42:40