【问题标题】:Stream providers and await in Flutter - wait till data is loadedFlutter 中的流提供程序和等待 - 等待数据加载
【发布时间】:2022-01-13 07:43:06
【问题描述】:

我在我的项目中使用 StreamProviders,目前面临一个问题,即当前设置不允许我等到僵硬加载后才显示某些屏幕。

所以在我的 Home() 中,我定义了我的提供者:

return MultiProvider(
        providers: [
          StreamProvider<PetUser?>(
            create: (context) => DatabaseService(uid: user?.uid).currentUser,
            initialData: null,
            catchError: (_, __) {},
          ),
          StreamProvider<Pet?>(
            create: (context) => DatabaseService(uid: user?.uid).petData,
            initialData: null,
            catchError: (_, __) {},
          ),
        ],
        child: Scaffold( ... ));

在我的database.dart 我有:

Stream<PetUser> get currentUser {
    return ownersCollection.doc(uid).snapshots().map(_currentUserFromSnapshot);
  }

  Stream<Pet> get petData {
    var map = petsCollection.doc(uid).snapshots().map(_petDataFromSnapshot);
    print(map);
    return map;

  PetUser _currentUserFromSnapshot(DocumentSnapshot snapshot) {
    var data = snapshot.data() as Map;
    return PetUser(uid!, data['name']);
  }

  Pet _petDataFromSnapshot(DocumentSnapshot snapshot) {
    var data = snapshot.data() as Map;
    return Pet(uid!, data['petName'], null, null);
  }

所以我想要我进一步筛选PetPetUser 的数据,只有在我知道从数据库加载完成后才知道。

如何更改此类设置才能使其成为可能。

现在我在我的个人资料屏幕中调用:

final user = Provider.of<PetUser?>(context);

如果我打印它的值,它首先是 null,然后在一段时间后填充数据。

我对这个话题非常陌生,所以我也愿意接受关于如何彻底改变我的方法的提示。

【问题讨论】:

  • 问题是:要获取相应的宠物数据,我需要用户的 uid,我只能从上下文中获取(因为使用 Provider.of),所以我不能从 init 函数中获取。 ..

标签: flutter dart state flutter-provider


【解决方案1】:

您可以使用snapshot.connectionState 来检查数据的状态。

它是一个枚举,因此您可以在某处添加 snapshot.connectionState = ConnectionState.waiting 布尔测试。

【讨论】:

    猜你喜欢
    • 2020-09-12
    • 2020-09-29
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多