【问题标题】:Flutter Firestore, convert list of maps to something useableFlutter Firestore,将地图列表转换为可用的东西
【发布时间】:2021-08-29 15:17:49
【问题描述】:

所以我正在尝试从 firebase 获取地图列表,如下所示

我想获取数据并将其放入我可以的列表中,例如按标题搜索正确的地图并从中获取描述,但我很难获得正确的架构。

我得到这样的数据

  final _ref = FirebaseFirestore.instance
        .collection('AllHabits')
        .snapshots()
        .map((query) =>
        query.docs.map((doc) => doc.data()['test']
            .map((testDoc)=> HabitInfo.fromDoc(testDoc))).toList());
  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
        stream: _ref,
        builder: (context, snapshot) {
          if (!snapshot.hasData) return Loading();
          final test = snapshot.data;
          print(test);
          return Container();
        });
  }

并使用模型

class  HabitInfo {
  final String description;
  final String title;

  HabitInfo({required this.description, required this.title});

  factory HabitInfo.fromDoc(DocumentSnapshot<Map<String, dynamic>> doc) {
    final data = doc.data()!;
    return HabitInfo(
      description: data['description'],
      title: data['title'],
    );
    // calendarEvents: data['calendarEvents']);
  }
}

当我停止时,我看到数据看起来像这样,但也是运行时错误

类型“_InternalLinkedHashMap”不是类型“DocumentSnapshot>”的子类型

所以我的问题是,如何将这些数据存储在我的模型中,以便我可以使用它 搜索(其中标题=测试,我想获得描述)我该怎么做 解决这个运行时错误

【问题讨论】:

  • 所以 Victors 建议修复了运行时,但仍然无法正确输入类型

标签: android firebase flutter google-cloud-firestore


【解决方案1】:

解决以下运行时错误:

type '_InternalLinkedHashMap' 不是 输入'DocumentSnapshot>'

在下面更改此代码:

   factory HabitInfo.fromDoc(DocumentSnapshot<Map<String, dynamic>> doc) {
     ...
   }

到:

   factory HabitInfo.fromDoc(Map<String, dynamic> doc) {
     ...
   }

发生错误是因为您在下面这一行中获取了字段值:

doc.data()['test']

它会根据屏幕截图中的数据库结构返回一个Map,而不是HabitInfo.fromDoc()方法中定义的DocumentSnapshot&lt;Map&lt;String, dynamic&gt;&gt;

更新:

您可以像这样更新StreamBuilder 代码:

return StreamBuilder<List<HabitInfo>>(
        stream: _ref,
        builder: (context, snapshot) {
          if (!snapshot.hasData) return Loading();
          final test = snapshot.data;
    
          test.forEach((habitInfo) {
            print(habitInfo.title);
            print(habitInfo.description);
          });
    
          return Container();
});

StreamBuilder 中将类型指定为List&lt;HabitInfo&gt; 会使snapshot.data 的类型为List&lt;HabitInfo&gt;

【讨论】:

  • 那么我应该如何通过这个更改读取数据?由于没有为“地图”类型定义“数据”。
  • 直接使用[] 运算符读取它。例如doc['description']
  • 啊,解决了它。知道如何使用从 snapshot.data 获得的这个对象值吗?那么(例如)如果我搜索标题,我可以获得描述吗?我应该从 Object 转换它吗?
  • 因为我得到的是对象,而不是地图
  • 你能改写一下吗?你想做什么?你指的是代码的哪一部分?
猜你喜欢
  • 1970-01-01
  • 2023-01-13
  • 2013-06-02
  • 2017-01-28
  • 2022-01-21
  • 2022-11-12
  • 2020-10-26
  • 2020-05-27
  • 2021-10-24
相关资源
最近更新 更多