firebase Flutter Firestore数据库返回空值

mnemlml8  于 2023-01-18  发布在  Flutter
关注(0)|答案(2)|浏览(165)

我有以下代码:

我使用云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。我不明白为什么?我的snapshot返回null,但我不明白为什么它会这样做,有人能帮帮我吗?
谢谢

u4dcyp6a

u4dcyp6a1#

Space
发现我的问题,有一个空间之前,我的Id已被retreived,我一定是accedentally把它放在那里时,创建数据库...

tpgth1q7

tpgth1q72#

查看您共享的文档的屏幕截图,第二列中的文档ID与第三列中authUserID的值不同,因此您似乎是通过调用add添加文档的,这意味着Firestore为您生成了一个唯一的ID。
然后使用以下代码创建对文档的引用:

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

但是这里您指定dbUserID作为文档ID,这与您创建文档时所做的不匹配。Firestore现在查找一个ID与用户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,因此这里您将调用.document('theuserid').set(...)而不是add(...)

相关问题