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

Flutter中如何在详情页获取Firestore文档的Todo实例ID?

获取Todo对应的Firestore文档ID的实现方法

方法一:给Todo类添加文档ID字段(推荐)

首先修改Todo类,新增存储Firestore文档ID的字段,并在从Firestore转换实例时带上文档ID:

class Todo {
  final String documentId;
  final String title;
  final String description;

  Todo({
    required this.documentId,
    required this.title,
    required this.description,
  });

  // 从Firestore文档生成Todo实例时,提取文档ID
  factory Todo.fromFirestore(DocumentSnapshot doc) {
    final data = doc.data() as Map<String, dynamic>;
    return Todo(
      documentId: doc.id,
      title: data['title'] ?? '',
      description: data['description'] ?? '',
    );
  }
}

在列表页跳转到详情页时,直接传递包含文档ID的Todo实例:

Navigator.push(
  context,
  MaterialPageRoute(
    builder: (context) => const DetailScreen(),
    arguments: todo, // 此处的todo已包含documentId
  ),
);

最后在详情页就能直接访问文档ID:

const DetailScreen({super.key});

@override
Widget build(BuildContext context) {
  final todo = ModalRoute.of(context)!.settings.arguments as Todo;

  // 直接获取文档ID
  final docId = todo.documentId;

  return Scaffold(
    appBar: AppBar(
      title: Text(todo.title),
    ),
    body: Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          Text('文档ID: $docId'),
          const SizedBox(height: 16),
          Text(todo.description),
        ],
      ),
    ),
  );
}

方法二:单独传递文档ID(无需修改Todo类)

如果不想改动Todo类,可以在跳转时传递一个包含Todo和文档ID的Map:

// 列表页跳转代码
Navigator.push(
  context,
  MaterialPageRoute(
    builder: (context) => const DetailScreen(),
    arguments: {
      'todo': todo,
      'documentId': doc.id, // doc是Firestore的DocumentSnapshot实例
    },
  ),
);

然后在详情页解析参数获取文档ID:

const DetailScreen({super.key});

@override
Widget build(BuildContext context) {
  final args = ModalRoute.of(context)!.settings.arguments as Map<String, dynamic>;
  final todo = args['todo'] as Todo;
  final docId = args['documentId'] as String;

  return Scaffold(
    appBar: AppBar(
      title: Text(todo.title),
    ),
    body: Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          Text('文档ID: $docId'),
          const SizedBox(height: 16),
          Text(todo.description),
        ],
      ),
    ),
  );
}

两种方法都能实现需求,第一种将文档ID与Todo数据绑定,逻辑更连贯,更推荐使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 13:36:39