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();
});

我的两分钱。