gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:44:06 32 4
gpt4 key购买 nike

我编写了一些代码,为 StateNotifier 提供 ApiServiceApiService 依赖于 authenticatorclient - auth 客户端必须异步创建,因为它使用 sharedprefs 获取 token 。

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

简而言之,这就是我正在做的事情......使用 FutureProvider 实例化 RestClientDio

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();
}
...
}

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

谢谢

最佳答案

解决此问题的一种方法是在提供程序之外初始化 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);
});

关于flutter - Riverpod - 以更好/优雅的方式创建具有异步依赖的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68170238/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com