Riverpod - 以更好/优雅的方式创建具有异步依赖项的服务

2024-01-05

我写了一些代码,提供了ApiService to a StateNotifier. The ApiService依赖于authenticatorclient- 身份验证客户端必须异步创建,因为它使用共享首选项来获取令牌。

我只是想弄清楚他们是否是我写这篇文章的更优雅的方式。基本上,当服务 apiService 被注入到 StateNotifier 中时,它可能可以为空......对我来说,这有点代码味道。

简而言之,这就是我正在做的事情...... 用一个FutureProvider实例化RestClientwith a Dio

authenticatorClient = FutureProvider<RestClient>((ref) async {
  final prefs = await SharedPreferences.getInstance();
  final dio = Dio();
  ...
  return RestClient(dio);
}

然后我观看并使用 MaybeWhen 返回服务

final clientCreatorWatchProvider = Provider<ApiService?>((ref) => ref
    .watch(authenticatorClient)
    .whenData((value) => ApiService(value))
    .maybeWhen(
      data: (service) => service,
      orElse: () => null,
    ));

所以我不喜欢的是 orElse 返回 null

然后我的StateNotifier正在看...

final AppState = StateNotifierProvider<AppNotifier, String>(
    (ref) => AppNotifier(ref.watch(clientCreatorWatchProvider)));

class AppNotifier extends StateNotifier<String> {
  final ApiService? apiService;

  AppNotifier(this.apiService) : super("loading") {
    init();
  }
...
}

对上述方法有什么想法吗?

Thanks


解决这个问题的一种方法是初始化SharedPreferences在提供商之外。然后你可以使用ProviderScope覆盖同步提供者,无需使用AsyncValue.

初始化应用程序时,请执行以下操作:

final sharedPreferences = Provider<SharedPreferences>((_) => throw UnimplementedError());

Future<void> main() async {
  final sharedPrefs = await SharedPreferences.getInstance();

  runApp(
    ProviderScope(
      overrides: [
        sharedPreferences.overrideWithValue(sharedPrefs),
      ],
      child: MyApp(),
    ),
  );
}

现在你可以像这样编写你的提供者:

final authenticatorClient = Provider<RestClient>((ref) {
  final prefs = ref.watch(sharedPreferences);
  final dio = Dio();
  ...
  return RestClient(dio);
}

final clientCreatorWatchProvider = Provider<ApiService>((ref) {
  final authClient = ref.watch(authenticatorClient);
  return ApiService(authClient);
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Riverpod - 以更好/优雅的方式创建具有异步依赖项的服务 的相关文章

  • 打开键盘会导致有状态小部件重新初始化

    我在 Stable 分支中使用 Flutter 1 2 1 为了说明我的问题 假设我有页面 A 和 B A 使用以下命令导航到 BNavigator pushB 使用以下命令导航回 ANavigator pop 两者都是有状态的小部件 当我
  • 没有脚手架的 DefaultTabController?

    我正在尝试使用DefaultTabController在一些小部件的中间 所以我的TabBar不能在AppBar并且必须关闭一些小部件 所以我的问题是当我使用时TabBarView它崩溃了 这是一个 Flutter 示例的示例 但没有找到如
  • Flutter如何在BottomNavigationBar中添加边距或填充

    我正在尝试制作底部导航栏 但在屏幕上左右填充 现在 我用容器包裹 BottomNavigationBar 并在其中添加填充 问题是 BottomNavigationBar 默认背景仍然包裹所有图层 所以我们可以删除那里的背景颜色吗 Goal
  • 使用 Flutter 基础类型而不使用 Flutter

    我需要在没有 Flutter 的环境中使用 lib package flutter foundation dart 中存在三种类型 他们是 ByteData ReadBuffer and WriteBuffer 是否可以在不依赖整个 Flu
  • 如何在Flutter中使用多个ChangeNotifierProvider?

    我最近开始使用provider对于我的状态管理 我知道如何一次使用一个 class Home extends StatelessWidget override Widget build BuildContext context return
  • Flutter Firestore - 如何从文档字段中的文档引用获取数据?

    我正在构建一个具有不同问题类型的自学应用程序 现在 其中一个问题有一个包含文档参考列表的字段 在 Flutter 中 我有以下代码 Query
  • 已发布的 Flutter 应用程序在启动时崩溃

    编辑 此问题的解决方案是将您的 flutter 版本升级到较新的 dev 版本 then 1 7 0 您还可以上传单独的 APK 版本 但我个人不喜欢这个选项 请确保您没有从 flutter github 开发存储库下载 错误的构建 因为那
  • 配置根项目“firebase_auth”时出现问题

    my error 我无法构建 apk 发布文件 我完成了应用程序一段时间 没有出现错误 几天后 我在构建应用程序时收到此错误 请告诉我如何摆脱它 我尝试了 4 个小时 什么也没得到 FAILURE Build failed with an
  • 实施 ChangeNotifier 与 StateNotifier

    我很熟悉Provider https pub dev packages provider打包并将其与ChangeNotifier 假设我有 3 个 getter 和具有不同功能的方法 切换加载 切换图像加载 切换 ObsecurePassw
  • 在FLUTTER/DART中,为什么我们有时在声明变量时要在“String”后面加一个问号?

    在演示应用程序中 我们找到一个实例 最终字符串 标题 gt 为什么要加这个 在 String 类型之后 class MyHomePage extends StatefulWidget MyHomePage Key key this titl
  • Flutter Web 崩溃并显示无法打开文件 client.js

    我可以就这个错误请求你的帮助吗 当我第一次尝试使用 flutter run d chrome 运行 flutter web 时会发生这种情况 Launching lib main dart on Chrome in debug mode S
  • Firebase Analytics 禁用受众国家/地区跟踪

    我正在开发一个严格不允许位置跟踪的应用程序 我想使用 Firebase Analytic 的其他功能 例如 PageTransitions 和 Crashalitics 但如果我无法禁用受众位置跟踪 我就无法使用其中任何功能 这是我在 An
  • 在初始化程序中只能访问静态成员。飞镖2.0

    我在有状态小部件中使用银行列表 将列表传递给pageState using List
  • 查找文本的确切边界

    我需要知道一段文本的确切边界 相当于获取文本边界 https developer android com reference android graphics Paint html对于安卓 我意识到这在某种程度上与 Flutter 的设计背
  • dart json.encode(data) 不能接受其他语言

    我目前正在使用 Dart 进行 Web 开发 使用mockclient实现服务 但是 出现以下错误 下面的实现代码是一个继承mockClient的内存web api服务 调用client send 并返回结果的代码 test value是j
  • Flutter基于Shared Preference设置启动页面

    我一直在尝试根据我的共享首选项设置加载不同的页面 但没有成功 根据 stackoverflow 中找到的几篇文章 我最终得到了以下解决方案 import dart async import package flutter material
  • 使用 Riverpod 处理身份验证

    我正在尝试获取 Riverpod 但遇到了一些问题 我创建了一个用于登录用户的表单 并且尝试在用户登录时更改主视图 我的问题是 当我设置更改状态并导航回应用程序根目录时 新状态似乎不可用 但是 如果我保存文件或热重新加载应用程序 则新状态可
  • Flutter - 如何将用户数据传递到所有视图

    我是 Flutter 世界和移动应用程序开发的新手 并且正在努力解决如何在整个应用程序中传递用户数据的问题 我已经尝试了几件事 但似乎没有一个很好 我确信我应该遵循一些最佳实践模式 因为它使示例更容易 所以我使用 firebase 进行身份
  • 致命错误:在 flutter 中找不到“Flutter/Flutter.h”文件

    这是错误 在文件中包含来自 Users chetan pub cache hosted pub dartlang org webview flutter 1 0 7 ios Classes JavaScriptChannelHandler
  • 期待活页夹但得到空

    尽管一切正常 但我在日志中收到此消息 W Parcel Expecting binder but got null 有人遇到过这样的问题吗 如何解决 重现步骤 只需创建一个新的 Flutter 项目并在模拟器 仿真器上运行它 查看日志 您将

随机推荐

  • 更改 Bootstrap 导航选项卡行换行

    在 Bootstrap 3 中 导航选项卡行的换行方式是最宽的行位于顶部 而较短的行位于底部 这使得选项卡看起来笨拙且不平衡 有没有一种方法可以修改导航选项卡 使底部的行更宽 更多类似这样的 这是JSFiddle https jsfiddl
  • 从 NSMutableString 中删除最后一个字符

    如何从 NSMutableString 中删除最后一个字符 你可以使用删除范围内的字符 http developer apple com library mac documentation Cocoa Reference Foundatio
  • 企业数据审计[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 阻止来自多个套接字的 select()

    Unix C 问题在这里 我有多个套接字 我正在尝试轮询周期性数据 我不想选择无限期地等待 所以我有一个超时并且我正在循环中运行 我发现一旦套接字准备好读取 它随时可以阅读 例如 当没有从任何套接字读取数据时 我无法让 select 进入睡
  • 如何让应用程序等待然后开始活动或返回?

    我希望我的 Activity 显示一个屏幕 3 秒钟 然后返回到上一个屏幕 但是当我使用 protected void onCreate Bundle savedInstanceState super onCreate savedInsta
  • 实体框架上下文为静态

    在 Web 应用程序中 如果我将实体框架模型的上下文声明为静态就可以了吗 可以吗 不推荐吗 为什么 谢谢 几乎肯定不是 随着越来越多的对象被查询 保存 ObjectContext 变得越来越大 另外 不建议像您所做的那样在线程之间共享 Ob
  • express/connect 中间件,在响应发送到客户端后执行

    是否可以编写一个中间件 在将响应发送到客户端之后或在处理请求并在将响应发送到客户端之前调用之后执行 pauljz 给出了基本方法 但为了扩展这里是一个中间件的示例 module exports function return functio
  • 当前上下文中不存在名称“$exception”

    今天我正在调试工作中的一个应用程序 我继续在其中一个 catch 块中设置断点 以便更详细地检查异常 The View Detail模式窗口正常打开 但它没有向我显示异常的详细信息 而是抛出一个奇怪的错误 我从未遇到过这个错误 我也不知道这
  • 如何导入外部库并将其转换为 Typescript 中的

    当我尝试使用我定义的 React 组件时 TypeScript 给了我一个编译错误 我不知道如何修复 import App require components views app app 当我使用导入模块时 该错误消失了
  • 如何指定使用Spring Cloud Stream向RabbitMQ发送消息的超时?

    我们在发送消息的过程中遇到了网络问题 这导致所有线程都处于阻塞状态 我们正在使用org springframework cloud spring cloud stream 2 0 1 RELEASE and org springframew
  • 在 hql 脚本中,我们使用“!sh echo ---new line---”来表示相同的 .想知道 impala 中的替代方案来打印 impala 脚本中的任何行吗?

    在 hql 脚本中 我们使用 sh echo new line 来表示相同的 想知道 impala 中的替代方案来打印 impala 脚本中的任何行吗 您可以从 impala 脚本调用 shell 命令行 作为其工作原理的示例 script
  • 在正则表达式中添加变量以使其在java中动态化

    我需要形成正则表达式才能检查响应日志的输出 日志文件将始终根据输入而不同 因此 我想创建一个dynamic基于函数输入的正则表达式 我可能需要一次传递可变数量的变量进行比较 那么如何在正则表达式中插入 或 因子 是否可以在 Java 中创建
  • pthreads 与 GCD 相比有什么优势吗?

    最近学习了 Grand Central Dispatch 我发现多线程代码非常直观 使用 GCD 我喜欢这样的事实 不需要锁 并且它内部使用无锁数据结构 并且 API 非常简单 现在 我开始学习 pthreads 我不禁对它的复杂性感到有点
  • 为 MVC 生成 Resx 文件

    我们使用 resx 文件进行全球化 并使用数据库查找我们的 CS 人员可以配置的内容 例如选项卡名称 可能因产品而异 因此在设计时是未知的 我创建了一个自定义工具 可以读取 resx 文件并智能地将键 值对转储到关系数据库中 匹配值 这样我
  • PIP3 与错误的 python 版本关联

    我知道这种问题已经被问过很多次了 我什至发现了这个几乎相同的问题 如何在 python 3 6 而不是 python 3 5 中使用 pip3 https stackoverflow com questions 46820625 how t
  • QueryInterface 失败并显示 E_ACCESSDENIED

    以下方法是 DCOM 服务器方法 COM客户端和服务器运行在不同的WinXP机器上 COM 客户端调用RegisterClient方法注册回调接口 问题是QueryInterface方法失败并显示错误代码E ACCESSDENIED 问题的
  • 在 R 中,拆分数据帧,以便子集数据帧包含前一个数据帧的最后一行和后续数据帧的第一行

    关于如何分割数据框有很多答案 例如如何分割数据框 https stackoverflow com questions 3302356 how to split a data frame 但是 我想分割一个数据帧 以便较小的数据帧包含前一个数
  • 删除txt文件中的换行符

    如果我想从文本文件中删除换行符 如下所示 hello there 我使用这样的简单代码 with open words txt as text for line in text print line strip 它输出这个 hello th
  • 变量名中的问号

    在 React 自定义钩子中 我们以下面的方式返回订单号 变量后面的问号是什么receipt order id意味着反应 export const useTest props gt return orderTestNumber receip
  • Riverpod - 以更好/优雅的方式创建具有异步依赖项的服务

    我写了一些代码 提供了ApiService to a StateNotifier The ApiService依赖于authenticatorclient 身份验证客户端必须异步创建 因为它使用共享首选项来获取令牌 我只是想弄清楚他们是否是