将Firebase文档快照映射到需要键和值并将其作为流提供的自定义模型

时间:2020-10-10 13:05:58

标签: firebase flutter dart google-cloud-firestore

我正在尝试向小部件提供文档快照流,但是在此之前,我想将返回Map 的快照映射到自定义模型,以使该模型采用键和值。每个字段并将其传递给模型,然后根据快照文档中的几个字段创建所有UserInfo对象的列表

class DatabaseService {
  final CollectionReference userCollection =
  FirebaseFirestore.instance.collection('users');

  final String uid;
  DatabaseService({this.uid});

  // the map function

  List<UserInfo> _userInfo(DocumentSnapshot snapshot) {
    //the line below is where i get the error that the expression has a type 'void' and it can't be used
    snapshot.data().forEach((key, value) {
      return UserInfo(key: key, value: value);
    }).toList();
  }

// The stream

Stream<List<UserInfo>> get userData {
  return userCollection.doc(uid).snapshots().map(_userInfo);
}

这是模型UserInfo

class UserInfo {
  final String key;
  final dynamic value;

  UserInfo({this.key, this.value});
}

我非常感谢能在这里获得的任何帮助。

我也非常清楚我可以使用流构建器将流传递给小部件,但是我试图使用这种方法。

谢谢

2 个答案:

答案 0 :(得分:1)

您需要使用map将可迭代(列表)转换为某种形式。 forEach不能用于此目的,因为它不能返回任何内容。

List<UserInfo> _userInfo(DocumentSnapshot snapshot) {
    final data = snapshot.data();
    return data.keys().map((key) {
      return UserInfo(key: key, value: data[key]);
    }).toList();
}

答案 1 :(得分:0)

这将是您的模特

class UserInfo {
      final String key;
      final dynamic value;
    
      UserInfo({this.key, this.value});
    
      UserInfo.mapping(String k, String v) : 
                      key = k,
                      value = v;
}

然后,您可以稍作调整即可得到Tirth Patel的答案:

List<UserInfo> _userInfo(DocumentSnapshot snapshot) {
    return snapshot.data().map((key, value) {
      return UserInfo.mapping(key, value);
    }).toList();
}

请注意 k v 以及 < strong>键

我真的不能测试它,但是我认为它可以工作。