flutter:类型'(DocumentSnapshot<MyObject>) => MyObject' 不是类型'(DocumentSnapshot<Object>) => MyObject' 的子类型
flutter: type '(DocumentSnapshot<MyObject>) => MyObject' is not a subtype of type '(DocumentSnapshot<Object>) => MyObject'
我很难从 firebase DB 读取(和显示)数据。
我收到此警告:
类型“(DocumentSnapshot) => GivitUser”不是类型“(DocumentSnapshot) => GivitUser”的子类型
我真的不知道我做错了什么,我尝试从 DocumentSnapshot 转换为 DocumentSnapshot 但没有成功。
这是我的 database.dart 文件:
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:givit_app/models/givit_user.dart';
class DatabaseService {
final String uid;
DatabaseService({@required this.uid});
final CollectionReference userCollection =
FirebaseFirestore.instance.collection('Users');
Future<void> updateGivitUserData(
String email, String fullName, String password, int phoneNumber) async {
return await userCollection.doc(uid).set({
'Email': email,
'Full Name': fullName,
'Password': password,
'Phone Number': phoneNumber,
});
}
Future<GivitUser> getGivitUser(String uid) async {
return await userCollection.doc(uid).get().then((user) => user.data());
}
GivitUser _userDataFromSnapshot(DocumentSnapshot<GivitUser> snapshot) {
return GivitUser(
uid: uid,
email: snapshot.data().email,
fullName: snapshot.data().fullName,
phoneNumber: snapshot.data().phoneNumber,
);
}
Stream<GivitUser> get userData {
return userCollection.doc(uid).snapshots().map(_userDataFromSnapshot);
}
}
这是我尝试使用 database.dart 文件并显示数据的地方:
Widget build(BuildContext context) {
GivitUser user = Provider.of<GivitUser>(context);
final DatabaseService db = DatabaseService(uid: user.uid);
return StreamBuilder<GivitUser>(
stream: db.userData,
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Loading();
}
print('after getter');
print(snapshot.data);
GivitUser givitUser = snapshot.data;
return Scaffold(
....
....
....
提前致谢,如有任何帮助,我将不胜感激:)
编辑:错误截图:
ERROR SCREENSHOT
这一行 userCollection.doc(uid).snapshots()
returns Stream<DocumentSnapshot>
而不是你在 _userDataFromSnapshot
参数中声明的 Stream<DocumentSnapshot<GivitUser>>
。
Stream<DocumentSnapshot> snapshots({bool
includeMetadataChanges = false})
您需要更改以下代码块:
GivitUser _userDataFromSnapshot(DocumentSnapshot<GivitUser> snapshot) {
//...
}
对此:
GivitUser _userDataFromSnapshot(DocumentSnapshot snapshot) {
//...
}
snapshot.data()
returns 一个 Map<String, dynamic> 对象。
因此,您可以像从地图对象中获取数据一样获取数据。
_userDataFromSnapshot
方法可以更新为:
GivitUser _userDataFromSnapshot(DocumentSnapshot snapshot) {
var snapshotData = snapshot.data() as Map;
return GivitUser(
uid: uid,
email: snapshotData['Email'],
fullName: snapshotData['Full Name'],
phoneNumber: snapshotData['Phone Number'],
);
}
我确实遇到了这个问题,帮助我的是首先尝试获取集合然后处理这个特定文档,也许尝试更改此代码:
final DatabaseService db = DatabaseService(uid: user.uid);
return StreamBuilder<GivitUser>(
stream: db.userData,
此代码:
final DatabaseService db = DatabaseService(uid: user.uid);
return StreamBuilder<GivitUser>(
stream: db.userCollection.doc(db.uid).get(),
就像这个文件说的那样https://firebase.flutter.dev/docs/firestore/usage/#one-time-read
然后您可以像这样进入该字段:
builder: (context, snapshot) {
/...
Map<String, dynamic> data = snapshot.data.data();
希望对你也有帮助! :)
我很难从 firebase DB 读取(和显示)数据。 我收到此警告: 类型“(DocumentSnapshot) => GivitUser”不是类型“(DocumentSnapshot) => GivitUser”的子类型
我真的不知道我做错了什么,我尝试从 DocumentSnapshot 转换为 DocumentSnapshot 但没有成功。 这是我的 database.dart 文件:
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:givit_app/models/givit_user.dart';
class DatabaseService {
final String uid;
DatabaseService({@required this.uid});
final CollectionReference userCollection =
FirebaseFirestore.instance.collection('Users');
Future<void> updateGivitUserData(
String email, String fullName, String password, int phoneNumber) async {
return await userCollection.doc(uid).set({
'Email': email,
'Full Name': fullName,
'Password': password,
'Phone Number': phoneNumber,
});
}
Future<GivitUser> getGivitUser(String uid) async {
return await userCollection.doc(uid).get().then((user) => user.data());
}
GivitUser _userDataFromSnapshot(DocumentSnapshot<GivitUser> snapshot) {
return GivitUser(
uid: uid,
email: snapshot.data().email,
fullName: snapshot.data().fullName,
phoneNumber: snapshot.data().phoneNumber,
);
}
Stream<GivitUser> get userData {
return userCollection.doc(uid).snapshots().map(_userDataFromSnapshot);
}
}
这是我尝试使用 database.dart 文件并显示数据的地方:
Widget build(BuildContext context) {
GivitUser user = Provider.of<GivitUser>(context);
final DatabaseService db = DatabaseService(uid: user.uid);
return StreamBuilder<GivitUser>(
stream: db.userData,
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Loading();
}
print('after getter');
print(snapshot.data);
GivitUser givitUser = snapshot.data;
return Scaffold(
....
....
....
提前致谢,如有任何帮助,我将不胜感激:)
编辑:错误截图: ERROR SCREENSHOT
这一行 userCollection.doc(uid).snapshots()
returns Stream<DocumentSnapshot>
而不是你在 _userDataFromSnapshot
参数中声明的 Stream<DocumentSnapshot<GivitUser>>
。
Stream<DocumentSnapshot> snapshots({bool includeMetadataChanges = false})
您需要更改以下代码块:
GivitUser _userDataFromSnapshot(DocumentSnapshot<GivitUser> snapshot) {
//...
}
对此:
GivitUser _userDataFromSnapshot(DocumentSnapshot snapshot) {
//...
}
snapshot.data()
returns 一个 Map<String, dynamic> 对象。
因此,您可以像从地图对象中获取数据一样获取数据。
_userDataFromSnapshot
方法可以更新为:
GivitUser _userDataFromSnapshot(DocumentSnapshot snapshot) {
var snapshotData = snapshot.data() as Map;
return GivitUser(
uid: uid,
email: snapshotData['Email'],
fullName: snapshotData['Full Name'],
phoneNumber: snapshotData['Phone Number'],
);
}
我确实遇到了这个问题,帮助我的是首先尝试获取集合然后处理这个特定文档,也许尝试更改此代码:
final DatabaseService db = DatabaseService(uid: user.uid);
return StreamBuilder<GivitUser>(
stream: db.userData,
此代码:
final DatabaseService db = DatabaseService(uid: user.uid);
return StreamBuilder<GivitUser>(
stream: db.userCollection.doc(db.uid).get(),
就像这个文件说的那样https://firebase.flutter.dev/docs/firestore/usage/#one-time-read
然后您可以像这样进入该字段:
builder: (context, snapshot) {
/...
Map<String, dynamic> data = snapshot.data.data();
希望对你也有帮助! :)