dart Flutter -如何将包含其id的Firestore项作为快照放在另一个表的数组中?

6yjfywim  于 2023-01-28  发布在  Flutter
关注(0)|答案(1)|浏览(134)

我如何在Flutter中获取包含其id的Firestore项目作为快照,这些项目位于另一个表的数组中?我正在附加代码,这些代码非常适合我执行“get”操作,但我无法找到一种方法将其转换为Stream,并使用StreamBuilder而不是FutureBuilder将其打印在屏幕上,并随每次更改更新它

Future<List<DocumentSnapshot<Map<String, dynamic>>>?> getPools() async {
      List<DocumentSnapshot<Map<String, dynamic>>> pools = [];
      final user = FirebaseAuth.instance.currentUser;
      final DbUser? dbUser = await dbUserAPI.getDbUser(user);
      if (dbUser != null) {
        for (var pool in dbUser.pools) {
          final result = await FirebaseFirestore.instance
              .collection('pools')
              .doc(pool)
              .get();
          pools.add(result);
        }
        return pools;
      }
      if (kDebugMode) {
        print('Error al leer el usuario de FireStore');
      }
      return null;
  }

在dbUsersAPI.getDbUsers函数中,我从“Users”表中检索用户数据,然后得到值“.pools”,它是一个String数组,其中包含我要检索的项的ID。
我已经尝试了许多方法,并发挥流,但我总是得到一个未来或流时,我只想得到一个流的项目,我正在过滤。
我尝试过where子句,但它没有更新值,我认为问题是我不知道如何管理dbUsersAPI.getDbUsers函数返回的Future。

66bbxpm5

66bbxpm51#

为了使用StreamBuilder显示数据,您需要通过生成以.snapshots()方法而不是.get()方法结尾的请求来获取流中的数据。
一个很简单的情况是,

DbUser? dbUser;

getDbUser() async {
  final user = FirebaseAuth.instance.currentUser;
  final DbUser? _dbUser = await dbUserAPI.getDbUser(user);
  if(_dbUser != null){
    dbUser = _dbUser;
  }
}

@override 
void initState(){
  super.initState();
}

@override
void build(BuildContext context){
  return ListView.builder(
   itemCount: dbUser!.pools.length,
   itemBuilder: (context, index){
     final pool = dbUser!.pools[index];
     return StreamBuilder(
      stream: FirebaseFirestore.instance
              .collection('pools')
              .doc(pool)
              .snapshots(),
      builder: (context, snapshots){
       return Container();
      }
     }
    );
  );
}

相关问题