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 я вижу, используется ожидание.

9X_RiverPod - как ждать, используя FutureProvider на AsyncValue не в виджете_riverpod

7
0
2
Общее количество ответов: 2

Ответ #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;
});

20
0

Ответ #2

Ответ на вопрос: RiverPod - как ждать, используя FutureProvider на AsyncValue не в виджете

await можно использовать через:

пример

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

10
0