Firebase、Flutter、Provider - 通过 Provider 映射和使用数据
Firebase, Flutter, Provider - Mapping, and Using Data via Provider
我是 flutter 和 firebase 的新手(是的,我知道之前有人问过这个问题)。
但是我已经看到了很多将 firebase 数据映射到提供者的不同方法,并且出于某种原因无法使单一方法起作用。
我有这个数据结构。我只希望将其映射到 class / object.
Firebase screenshot
这是我的数据model.dart:
@immutable
class Requests {
Requests({
this.name = '',
this.pairingId = 0,
});
final String name;
final double pairingId;
Requests.fromJson(Map<String, Object?> json)
: this(
name: json['name']! as String,
pairingId: json['pairingId'] as double,
);
Map<String, Object?> toJson() {
return {
'name': name,
'pairingId': pairingId,
};
}
}
@immutable
class UserDataTest with ChangeNotifier {
UserDataTest({
this.firstName = '',
this.lastName = '',
this.gender = '',
this.dateOfBirth,
this.userUID = '',
this.uidp = '',
this.pairingId = 0,
this.requests = const [],
});
UserDataTest.fromJson(Map<String, Object?> json)
: this(
firstName: json['firstName']! as String,
lastName: json['lastName']! as String,
gender: json['gender']! as dynamic,
dateOfBirth: json['dateOfBirth']! as DateTime?,
userUID: json['userUID']! as String,
uidp: json['uidp']! as String,
pairingId: json['pairingId']! as double,
requests: json['requests']! as List<Requests>,
);
late final String firstName;
final String lastName;
final dynamic gender;
final DateTime? dateOfBirth;
final String userUID;
final String uidp;
final double pairingId;
final List<Requests> requests;
Map<String, Object?> toJson() {
return {
'firstName': firstName,
'lastName': lastName,
'gender': gender,
'dateOfBirth': dateOfBirth,
'userUID': userUID,
'uidp': uidp,
'pairingId': pairingId,
'requests': requests,
};
}
}
但是从这里我没有任何只能部分工作的解决方案。
同样,我的愿望是能够写,例如。 user.firstName 并显示第一个名字。我怎么去那里?
我知道我错过了对 firebase 的呼叫,但我没有成功拨打电话。
我不知道是否必须在提供商内部做一些事情。
(是的,我的树顶有一个多供应商
并致电我正在使用或想要使用它的提供商)
我的建议:重新开始。只需使用 Firebase 中的几个字段手动创建一个简单的 class,然后逐步解决。例如使用 UserDataTest 并将其设为 class:
class UserDataTest {
String? firstName;
String? lastName;
UserDataTest({ this.firstName, this.lastName });
factory UserDataTest.fromJson(Map<String, dynamic> json) {
return UserDataTest(
firstName: json['firstName'],
lastName: json['lastName'],
);
}
}
尽量让这些 class 尽可能简单明了。为您的服务创建其他 classes,然后使它们扩展 ChangeNotifier,例如封装您的业务逻辑和触发通知。
然后,您可以从 Firebase 轻松地执行以下操作:
List<UserDataTest> userData = [];
FirebaseFirestore.instance.collection('userdata').get().then((QuerySnapshot snapshot) {
userData = snapshot.docs.map((doc) => UserDataTest.fromJson(doc.data())).toList();
});
我的两分钱。
我是 flutter 和 firebase 的新手(是的,我知道之前有人问过这个问题)。 但是我已经看到了很多将 firebase 数据映射到提供者的不同方法,并且出于某种原因无法使单一方法起作用。 我有这个数据结构。我只希望将其映射到 class / object.
Firebase screenshot
这是我的数据model.dart:
@immutable
class Requests {
Requests({
this.name = '',
this.pairingId = 0,
});
final String name;
final double pairingId;
Requests.fromJson(Map<String, Object?> json)
: this(
name: json['name']! as String,
pairingId: json['pairingId'] as double,
);
Map<String, Object?> toJson() {
return {
'name': name,
'pairingId': pairingId,
};
}
}
@immutable
class UserDataTest with ChangeNotifier {
UserDataTest({
this.firstName = '',
this.lastName = '',
this.gender = '',
this.dateOfBirth,
this.userUID = '',
this.uidp = '',
this.pairingId = 0,
this.requests = const [],
});
UserDataTest.fromJson(Map<String, Object?> json)
: this(
firstName: json['firstName']! as String,
lastName: json['lastName']! as String,
gender: json['gender']! as dynamic,
dateOfBirth: json['dateOfBirth']! as DateTime?,
userUID: json['userUID']! as String,
uidp: json['uidp']! as String,
pairingId: json['pairingId']! as double,
requests: json['requests']! as List<Requests>,
);
late final String firstName;
final String lastName;
final dynamic gender;
final DateTime? dateOfBirth;
final String userUID;
final String uidp;
final double pairingId;
final List<Requests> requests;
Map<String, Object?> toJson() {
return {
'firstName': firstName,
'lastName': lastName,
'gender': gender,
'dateOfBirth': dateOfBirth,
'userUID': userUID,
'uidp': uidp,
'pairingId': pairingId,
'requests': requests,
};
}
}
但是从这里我没有任何只能部分工作的解决方案。 同样,我的愿望是能够写,例如。 user.firstName 并显示第一个名字。我怎么去那里? 我知道我错过了对 firebase 的呼叫,但我没有成功拨打电话。 我不知道是否必须在提供商内部做一些事情。 (是的,我的树顶有一个多供应商 并致电我正在使用或想要使用它的提供商)
我的建议:重新开始。只需使用 Firebase 中的几个字段手动创建一个简单的 class,然后逐步解决。例如使用 UserDataTest 并将其设为 class:
class UserDataTest {
String? firstName;
String? lastName;
UserDataTest({ this.firstName, this.lastName });
factory UserDataTest.fromJson(Map<String, dynamic> json) {
return UserDataTest(
firstName: json['firstName'],
lastName: json['lastName'],
);
}
}
尽量让这些 class 尽可能简单明了。为您的服务创建其他 classes,然后使它们扩展 ChangeNotifier,例如封装您的业务逻辑和触发通知。
然后,您可以从 Firebase 轻松地执行以下操作:
List<UserDataTest> userData = [];
FirebaseFirestore.instance.collection('userdata').get().then((QuerySnapshot snapshot) {
userData = snapshot.docs.map((doc) => UserDataTest.fromJson(doc.data())).toList();
});
我的两分钱。