【问题标题】:Flutter firestore database returns nullFlutter firestore 数据库返回 null
【发布时间】:2023-01-16 23:49:30
【问题描述】:

我有以下代码:

我使用云 firestore 作为数据库

用户模型:

class DbUser {
  String id;
  final String authUserID;
  final String userName;
  final List<String>? itemsForSale;
  final List<String>? itemFavourites;
  final List<String>? bids;

  DbUser(
      {this.id = '',
      required this.authUserID,
      required this.userName,
      this.itemsForSale,
      this.itemFavourites,
      this.bids});

  Map<String, dynamic> toJson() => {
        'id': id,
        'authUserID': authUserID,
        'userName': userName,
        'itemsForSale': itemsForSale,
        'itemFavourites': itemFavourites,
        'bids': bids,
      };

  static DbUser fromJson(Map<String, dynamic> json) => DbUser(
        id: json['id'],
        authUserID: json['authUserID'],
        userName: json['userName'],
        itemsForSale: json['itemsForSale'] is Iterable
            ? List.from(json['itemsForSale'])
            : null,
        itemFavourites: json['itemFavourites'] is Iterable
            ? List.from(json['itemFavourites'])
            : null,
        bids: json['bids'] is Iterable ? List.from(json['bids']) : null,
      );
}

存储库类

  final _firestoreDB = FirebaseFirestore.instance;



  Future<DbUser?> getDBUserByDBUserId({required String dbUserID}) async {
    final docUser = _firestoreDB.collection('users').doc(dbUserID);
    final snapshot = await docUser.get();

    if (snapshot.exists) {
      return DbUser.fromJson(snapshot.data()!);
    }

    return null;
  }

snapshot.exists 返回 false。 我不明白为什么? 我的快照返回 null 但我不明白为什么会这样,有人可以帮我吗?

谢谢

【问题讨论】:

    标签: flutter firebase dart google-cloud-firestore


    【解决方案1】:

    Space

    发现了我的问题,我的 Id 之前有一个空格被取回了,我一定是在创建数据库时不小心把它放在那里的……

    【讨论】:

      【解决方案2】:

      看你分享的文档截图,第二列的文档ID和第三列的authUserID 的值不一样。因此,您似乎是通过调用add 添加了文档,这意味着 Firestore 会为您生成一个唯一 ID。

      然后使用以下代码创建对文档的引用:

      _firestoreDB.collection('users').doc(dbUserID)
      

      但是在这里您指定dbUserID 作为文档 ID,这与您创建文档时所做的不匹配。 Firestore 现在查找 ID 与用户 ID 相同的文档,该文档不存在,因此为您提供 existsfalse 的快照。

      如果要在当前结构中查找用户的文档,可以使用查询来实现:

      Future<DbUser?> getDBUserByDBUserId({required String dbUserID}) async {
        final query = _firestoreDB.collection('users').where('authUserID', isEqualTo: dbUserID)
      
        final snapshot = await query.get();
      
        if (snapshot.size > 0) {
          return DbUser.fromJson(snapshot.docs[0]!.data()!);
        }
      
        return null;
      }
      

      但更好的解决方案可能是将用户文档实际存储在其用户 ID 下。您可以指定文档 ID,如 setting a document 上的文档所示。所以在这里你会打电话给.document('theuserid').set(...)而不是add(...)

      【讨论】:

        猜你喜欢
        • 2019-10-01
        • 2022-01-22
        • 2020-11-07
        • 1970-01-01
        • 2021-03-17
        • 1970-01-01
        • 2021-06-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多