Как мне вспомнить будущего провайдера (riverpod) на сборке

У меня есть простая страница, на которой показан продукт, и я пытаюсь использовать riverpod и futureprovider, но будущее называется только при первом переходе на страницу?

      final productInfo = FutureProvider<Map<String, dynamic>>((ref) async {
  final response =
      await http.get('https://www.api.com/$clickedID');
  final content = json.decode(response.body) as Map<String, dynamic>;
  return content;
});

4 ответа

С недавним Riverpod вы можете ref.refresh(userProvider) обновить провайдера.

Есть два варианта.

  1. ref.refresh(поставщик)
  2. ref.invalidate(поставщик)

Обратите внимание, что если вы используете AsyncValue, старый результат будет возвращен при обновлении FutureProvider, а для AsyncValue.isRefreshing будет установлено значение true:

      final notificationRepositoryProvider = FutureProvider<bool?>((ref) async {
  Future<bool> approveDocument() => Future.delayed(Duration(seconds: 1), () => Future.value(Random().nextBool()));

  return approveDocument();
});

class HomeView extends ConsumerStatefulWidget {
  const HomeView({Key? key}) : super(key: key);

  @override
  HomeViewState createState() => HomeViewState();
}

class HomeViewState extends ConsumerState<HomeView> {
  @override
  Widget build(BuildContext context) {
    AsyncValue<bool?> rejectResponse = ref.watch(notificationRepositoryProvider);
    return ElevatedButton(
        onPressed: () {
          // ref.refresh(notificationRepositoryProvider);
          ref.watch(notificationRepositoryProvider).;
        },
        child: rejectResponse.when(
          loading: () => const CircularProgressIndicator(
            color: Colors.white,
          ),
          skipLoadingOnRefresh: false,
          error: (err, stack) => Text('Error'),
          data: (data) => Text('Yes: $data'),
        ));
  }
}

Пожалуйста, используйте

      final userProvider = StreamProvider<User>(
 final response =
      await http.get('https://www.api.com/$clickedID');
  final content = json.decode(response.body) as Map<String, dynamic>;
  return content;
);

теперь вы можете слушать провайдера, используя watch,

        AsyncValue<User> user = watch(userProvider);

Нет встроенных функций, но вы можете переопределить значение с таким же будущим позже.

      recallProductInfoFutureProvider() {
final response = http.get('https://www.api.com/$clickedID');
  final content = json.decode(response.body) as Map<String, dynamic>;
productInfo.overrideWithValue(content)
}

Рассмотрите возможность использования с StreamProvider и наблюдения внутри Consumer для обновления пользовательского интерфейса overrideWithValue.

Другие вопросы по тегам