Flutter Riverpod: обновить страницу за пределами экрана с помощью State Notifier

Я использую StateNotifier и Riverpod. У меня есть страница уведомлений, которая содержит список уведомлений. Когда приходит уведомление, я запускаю обновление для уведомления. Однако когда я перехожу на страницу уведомлений, она по-прежнему использует старый (кэшированный?) Список.

Как обновить страницу за кадром?

Сообщение переднего плана

      FirebaseMessaging.onMessage.listen((RemoteMessage message) {
  _localNotification.showLocalNotification(message);
  ProviderContainer().read(notificationProvider).getNotification();
});

Фоновое сообщение

      Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  await Firebase.initializeApp();

  final LocalNotification localNotification = LocalNotification();
  await localNotification.init();
  localNotification.showLocalNotification(message);
  ProviderContainer().read(notificationProvider).getNotification();
}

NotificationProvider

      Future<void> getNotification() async {
  try {
    state = const NotificationLoadingState();
    _notificationList = await _notificationRepository.getNotification();
    state = NotificationLoadedState(_notificationList); // ==> I get a new list here
  } catch (e, s) {
    state = const NotificationErrorState('error fetching notification');
  }
}

UI

      final state = watch(notificationProvider.state);
if (state is NotificationLoadingState) {
  return _buildLoading();
} else if (state is NotificationLoadedState) {
  return _buildLoaded(state.notificationList); // ==> I still get the old list here
} else if (state is NotificationErrorState) {
  return _buildError(state.message);
}

Редактировать:

Мне удалось решить обработчик сообщений переднего плана, используя navigatorKey.currentContext.

Однако я до сих пор не решил обработчик фоновых сообщений. Я пытался изменить свой main.dart использовать UncontrolledProviderScope с глобальным ProviderContainer, который затем был вызван из обработчика фоновых сообщений. Это все еще не освежает.

1 ответ

С помощью этой строки вы создаете новый экземпляр для своих провайдеров:

       ProviderContainer().read(notificationProvider).getNotification();

вам нужно использовать контекст, чтобы получить существующий экземпляр ProviderContainer:

      context.read(notificationProvider).getNotification();

или если вы не находитесь внутри пользовательского интерфейса, установите зависимости между вашими поставщиками

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