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();
или если вы не находитесь внутри пользовательского интерфейса, установите зависимости между вашими поставщиками