【发布时间】: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<dynamic, dynamic> 中。我认为所有DocumentSnapshot 中的Map 将是Map<String, dynamic>。我该如何解决这个问题?将所有函数更改为采用 Map<dynamic, dynamic> 并假设密钥是 String 是解决该问题的一个相当丑陋的解决方法。
【问题讨论】:
-
你用的是什么 Flutter 版本?
-
确保在
lib/main.dart中只有'package:...;` 导入 -
首先从命令行尝试
flutter clean。如果问题仍然存在,请从堆栈跟踪中发布几行,以便我们可以看到任何行号等。我也遇到过类似的问题,被告知_InternalLinkedHashMap不是Map(尽管所有迹象都相反! ),但总是能够通过简单的副本绕过它们。如果我们能看到异常被抛出的地方,我相信我们可以想出一个解决方法。 -
@GünterZöchbauer 我目前不在我的电脑上,但我昨天运行了颤振升级。所以我会说当前的测试版。
-
还要检查您是否拥有所有其他依赖项的最新版本。
标签: firebase dart google-cloud-firestore flutter