我正在尝试使用小部件从 Firestore 中的文档中检索数据。我过去用过这个,我猜是用不同版本的 Dart 或 Flutter,它奏效了。现在,当我使用 (doc.data())
时显示以下错误
参数类型“对象?”无法分配给参数类型 'Map
这是代码
DriverProvider driverProvider;
void getDriverInfo() {
Stream<DocumentSnapshot> driverStream =
driverProvider!.getbyIdStream(FirebaseAuth.instance.currentUser!.uid);
driverStream.listen((DocumentSnapshot doc) {
driver = Driver.fromJson(doc.data());
});
}
这里是 driverProvider!来自
import 'package:brokerdrivers/models/user-models.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
class DriverProvider {
CollectionReference? _ref;
DriverProvider() {
_ref = FirebaseFirestore.instance.collection('Drivers');
}
Future? create(Driver driver) {
String? errorMessage;
try {
return _ref!.doc(driver.id).set(driver.toJson());
} catch (e) {
print(e);
errorMessage = e.toString();
return Future.error(errorMessage);
}
}
Stream<DocumentSnapshot> getbyIdStream(String id) {
return _ref!.doc(id).snapshots(includeMetadataChanges: true);
}
}
这就是getbyIdStream
的来源
Stream<DocumentSnapshot> getbyIdStream(String id) {
return _ref!.doc(id).snapshots(includeMetadataChanges: true);
}
这是我的 Json 模型
import 'dart:convert';
Driver driverFromJson(String str) => Driver.fromJson(json.decode(str));
String driverToJson(Driver data) => json.encode(data.toJson());
class Driver {
Driver({
required this.id,
required this.username,
required this.email,
required this.truck,
required this.carrier,
required this.insurance,
});
String id;
String username;
String email;
String truck;
String carrier;
String insurance;
factory Driver.fromJson(Map<String, dynamic> json) => Driver(
id: json["id"],
username: json["username"],
email: json["email"],
truck: json["truck"],
carrier: json["carrier"],
insurance: json["insurance"],
);
Map<String, dynamic> toJson() => {
"id": id,
"username": username,
"email": email,
"truck": truck,
"carrier": carrier,
"insurance": insurance,
};
}
这是有错误的行
driver = Driver.fromJson(doc.data());
感谢大家的帮助。
答案 0 :(得分:1)
此错误是对 cloud_firestore
API 进行新更改的结果。
您需要指定从 DocumentSnapshot
更新这一行:
driver = Driver.fromJson(doc.data());
为此:
driver = Driver.fromJson(doc.data() as Map<String, dynamic>);
答案 1 :(得分:0)
除了维克多的回答,你还可以这样做:
Stream<DocumentSnapshot<Map<String, dynamic>> driverStream =
driverProvider!.getbyIdStream(FirebaseAuth.instance.currentUser!.uid);
driverStream.listen((DocumentSnapshot doc) {
driver = Driver.fromJson(doc.data());
});
这使得 data()
方法返回一个 Map<String, dynamic>
,因此您不必强制转换它。尽管您可能必须确保它不为空。您还必须修改您的 getIdByStream
方法以返回 Stream<DocumentSnapshot<Map<String, dynamic>>>
。
答案 2 :(得分:0)
除了 Victor 的回答之外,使用新的 null 安全性,您还需要检查 null 或(不推荐)转换不可为 null(如果您确定这些值永远不会为 null):
driver = Driver.fromJson(doc.data()! as Map<String, dynamic>);