sách gpt4 ai đã đi

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

In lại 作者:行者123 更新时间:2023-12-05 00:44:06 33 4
mua khóa gpt4 Nike

我编写了一些代码,为 StateNotifier 提供 ApiService. ApiService Phụ thuộc vào authenticatorclient - auth 客户端必须异步创建,因为它使用 sharedprefs 获取 token 。

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

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

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

然后我观察它并使用 MaybeWhen 来返回服务

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

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

然后我的 StateNotifier 正在观看...

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

class AppNotifier extends StateNotifier {
final ApiService? apiService;

AppNotifier(this.apiService) : super("loading") {
khởi tạo();
}
...
}

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

Cảm ơn

1 Câu trả lời

解决此问题的一种方法是在提供程序之外初始化 SharedPreferences。然后,您可以使用 ProviderScope 覆盖同步提供程序,从而无需使用 AsyncValue.

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

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

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

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

现在您可以像这样编写您的提供程序:

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

final clientCreatorWatchProvider = Provider((ref) {
final authClient = ref.watch(authenticatorClient);
return ApiService(authClient);
});

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

33 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com