RiverPod - как ждать, используя FutureProvider на AsyncValue не в виджете
Мне нужно получить 1 поле 1 раз из Firebase 9X_dart Cloud Firestore. Как мне добиться этого 9X_flutter-provider с поставщиками, не входящими в сборку виджетов?
Ниже 9X_flutter-provider приведены мои объединенные поставщики. appStartupProvider
- это 9X_flutter-appbar FutureProvider, и я хочу получить значение 9X_dart bool
из этого поля 1 в firestore. Однако ожидание 9X_flutter в appStartupProvider
гласит, что «ожидание применено к AsyncValue, что 9X_flutter-sdk не является будущим».
final accountStreamProvider = StreamProvider((ref) { final database = ref.watch(databaseProvider); return database != null ? database.accountStream() : const Stream.empty(); }); final _accountSetupCompleteProvider = Provider>((ref) { return ref .watch(accountStreamProvider) .whenData((account) => account?.accountSetupComplete ?? false); }); final appStartupProvider = FutureProvider((ref) async { final accountSetupComplete = await ref.watch(_accountSetupCompleteProvider); return accountSetupComplete; });
Здесь явно не хватает 9X_dart некоторых ключевых знаний о расчесывании 9X_flutter поставщиков и AsyncValue, но я пытаюсь выполнить 9X_dart ситуацию, указанную на странице RiverPod Combining Providers, где, как 9X_flutter-listview я вижу, используется ожидание.
Ответ #1
Ответ на вопрос: RiverPod - как ждать, используя FutureProvider на AsyncValue не в виджете
Пример в документации был неверным на момент 9X_flutter-sdk публикации. С тех пор он был обновлен и 9X_dart теперь верен.
Вот как вы могли бы это написать:
final accountStreamProvider = StreamProvider((ref) { final database = ref.watch(databaseProvider); return database != null ? database.accountStream() : const Stream.empty(); }); final _accountSetupCompleteProvider = FutureProvider((ref) async { final account = await ref.watch(accountStreamProvider.last); return account?.accountSetupComplete ?? false; }); final appStartupProvider = FutureProvider((ref) async { final accountSetupComplete = await ref.watch(_accountSetupCompleteProvider.future); return accountSetupComplete; });
Или:
final accountStreamProvider = StreamProvider((ref) { final database = ref.watch(databaseProvider); return database != null ? database.accountStream() : const Stream.empty(); }); final _accountSetupCompleteProvider = Provider>((ref) { return ref .watch(accountStreamProvider) .whenData((account) => account?.accountSetupComplete ?? false); }); final appStartupProvider = Provider((ref) { final accountSetupComplete = ref.watch(_accountSetupCompleteProvider).maybeWhen( data: (data) => data, orElse: () => false, ); return accountSetupComplete; });
Ответ #2
Ответ на вопрос: RiverPod - как ждать, используя FutureProvider на AsyncValue не в виджете
await
можно использовать через:
.future
вFutureProvider
documentation.last
вStreamProvider
documentation
пример
final carsListFutureProvider = FutureProvider>((ref) { final backend = ref.watch(backendProvider); return backend.getList(pathName, (json) => Car.fromJson(json)); }); final carFutureProvider = FutureProvider.family((ref,id) async { final list = await ref.watch(carsListFutureProvider.future); return list.firstWhereOrNull((e) => e.id == id); });
Похоже, что 9X_flutter-layout на данный момент документация содержит некорректные 9X_flutter-sdk примеры кода. issue
-
1
-
2
-
4
-
2
-
2
-
1
-
2
-
5
-
2
-
3
-
3
-
1
-
1
-
2
-
6
-
2
-
5
-
2
-
2
-
5
-
2
-
2
-
1
-
2
-
2
-
3
-
3
-
2
-
3
-
5
-
2
-
3
-
4
-
2
-
1
-
7
-
5
-
8
-
13
-
26
-
11
-
2
-
4
-
17
-
6
-
4
-
3
-
7
-
5
-
5