首页 > 解决方案 > 在 Flutter 之外使用 StreamProvider 的 RiverPod 方式是什么 - 仅限 Dart

问题描述

第一次使用 RiverPod 和一般的 Provider 概念。

目标:验证登录用户在我的帐户FireStore集合中有一个帐户信息文档

我的代码基于RiverPod站点上引用的Flutter /firebase 启动器架构,作为如何使用 RiverPod 进行状态管理的示例。

我正在使用最新的 flutter_riverpod包。

我的最小化代码:

firestore_database.dart - 实现远离 ui 的模型/服务层。

Stream<Account> accountStream() => _service.documentStream(
        path: FirestorePath.account(uid),
        builder: (data, documentId) => Account.fromMap(data, uid),
      );

account_setup_service.dart

final accountStreamProvider = StreamProvider.autoDispose((ref) {
  final database = ref.watch(databaseProvider);
  return database != null ? database.accountStream() : const Stream.empty();
});

这是我坚持的部分。其他一切都检查出来。如何accountStreamProvider在仅 Dart 的上下文中使用 Flutter 的外部?同样,我的目标是简单地评估流是否为空或是否包含文档。

Consumer(builder: (context, watch, _) {
      final accountAsyncValue = watch(accountStreamProvider);

      return accountAsyncValue.when(
        // what do I do here to validate that there is an account 
        // info document for the currently authorized user 
        // using the accountStreamProvider?
        // I don't want to return a widget...
        data: (account) => null,
        loading: () => null,
        error: (_, __) => null,
      );
    });

在 RiverPod 文档站点上,我阅读了“仅使用 Dart 读取提供程序之外的提供程序”参考,但是,我不确定在哪里使用它来使用流并评估数据(如果有的话)。

标签: flutterdartflutter-providerdart-asyncriverpod

解决方案


您发布的文档链接显示了如何StateControllerProviderContainer.

看起来这个StateController类有一个stream属性,所以你可以听一下:

https://pub.dev/documentation/riverpod/latest/riverpod/StateController-class.html

(我还没有尝试过,但这就是我可以从文档中得出的结论)


推荐阅读