【问题标题】:Flutter Cloud Firestore Map<String, dynamic> errorFlutter Cloud Firestore Map<String, dynamic> 错误
【发布时间】:2018-10-14 01:06:54
【问题描述】:

我正在尝试使用 Flutter 和 Firestore 构建应用程序。使用 StreamBuilder 从 Firestore 加载集合以在 ListView 中显示时,出现以下错误

The following assertion was thrown building StreamBuilder<QuerySnapshot>(dirty, state:
I/flutter (26287): _StreamBuilderBaseState<QuerySnapshot, AsyncSnapshot<QuerySnapshot>>#d5638):

I/flutter (26287): type '_InternalLinkedHashMap<dynamic, dynamic>' is not a subtype of type 'Map<String, dynamic>'

I/flutter (26287): where

I/flutter (26287):   _InternalLinkedHashMap is from dart:collection

I/flutter (26287):   Map is from dart:core

I/flutter (26287):   String is from dart:core

这就是我想从DocumentSnapshot获取数据的方式

class Creator {
  const Creator({this.creatorId, this.name});

  Creator.fromDoc(DocumentSnapshot doc) : this.fromMap(doc.data);

  Creator.fromMap(Map<String, dynamic> map) :
    assert(map.containsKey('creatorId'),
    assert(map.containsKey('name'),
    this ( creatorId: map['creatorId'], name: map['name'] );

  /*

  ...

  */
}

以及我想如何使用它

return Scaffold(
  appBar: AppBar(title: new Text('Creators')),
  body: StreamBuilder<QuerySnapshot>(
    stream: CreatorRepo.getCreators().map<List<Creator>>((creators) {
      return creators.documents.map<Creator>((c) => Creator.fromSnapshot(c)).toList();
    }),
    builder: (BuildContext context, snapshot) {
      if ( snapshot.hasData ) {
        return ListView.builder(
          itemCount: snapshot.data.length,
          builder: (context, index) {
            final creator = snapshot.data[index];

            return ExpansionTile(
              title: Text(creator.name),
              children: [
                Text(creator.creatorId),
              ],
            );
          },
        );
      }

      return const CircularProgressIndicator();
    },
  ),
);

依赖关系:

dependencies:
  flutter:
    sdk: flutter

  cloud_firestore: ^0.6.3
  firebase_messaging: ^0.2.4

Firestore 仅允许 String 键和 dynamic 值作为核心语言类型,Timestamp 除外。 cloud_firestore 插件将文档数据保存在 _InternalLinkedHashMap&lt;dynamic, dynamic&gt; 中。我认为所有DocumentSnapshot 中的Map 将是Map&lt;String, dynamic&gt;。我该如何解决这个问题?将所有函数更改为采用 Map&lt;dynamic, dynamic&gt; 并假设密钥是 String 是解决该问题的一个相当丑陋的解决方法。

【问题讨论】:

  • 你用的是什么 Flutter 版本?
  • 确保在lib/main.dart 中只有'package:...;` 导入
  • 首先从命令行尝试flutter clean。如果问题仍然存在,请从堆栈跟踪中发布几行,以便我们可以看到任何行号等。我也遇到过类似的问题,被告知_InternalLinkedHashMap 不是Map(尽管所有迹象都相反! ),但总是能够通过简单的副本绕过它们。如果我们能看到异常被抛出的地方,我相信我们可以想出一个解决方法。
  • @GünterZöchbauer 我目前不在我的电脑上,但我昨天运行了颤振升级。所以我会说当前的测试版。
  • 还要检查您是否拥有所有其他依赖项的最新版本。

标签: firebase dart google-cloud-firestore flutter


【解决方案1】:

我相信这是因为从 Firebase 返回的地图不是Map&lt;String, dynamic&gt;,而是Map&lt;dynamic, dynamic&gt;。

有关相关问题,请参阅 https://github.com/flutter/flutter/issues/17417。

【讨论】:

    【解决方案2】:

    Flutter 现在与 Map&lt;String,String&gt; 合作

    【讨论】:

      【解决方案3】:

      使用Map&lt;String, dynamic&gt;.from ( mapFromFirestore )。这会根据mapFromFirestore 的内容创建一个新的Map&lt;String, dynamic&gt;,如果它找到不是String 的键,则会引发错误。

      【讨论】:

        【解决方案4】:

        我也遇到了这个问题,用 -- 解决了这个问题

          Map<String, dynamic> var = {'item': 0, 'name': 'John'}  
        

        而不是未指定的地图。

          Map var = {'item': 0, 'name': 'John'}  
        

        【讨论】:

          【解决方案5】:

          你可以试试这个:

          var stringMap = mapFromFirestore.map((key,value) => MapEntry(key as String, dynamic.from(value));
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-02-11
            • 2021-03-23
            • 2021-04-06
            • 2020-12-27
            • 2019-03-23
            • 2021-11-11
            • 2021-09-11
            相关资源
            最近更新 更多