Vayth
Vayth

Reputation: 425

Flutter Riverpod: Refresh Page Offscreen using State Notifier

I'm using StateNotifier and Riverpod. I have a notification page, which contains a list of notification. When a notification arrives, I trigger a refresh for notification. However, when I navigate to notification page, it still using the old (cached?) list.

How do I refresh a page offscreen?

Foreground Message

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

Background Message

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);
}

Edit:

I managed to solve the foreground message handler by using navigatorKey.currentContext.

However, I still haven't solved background message handler. I've tried changing my main.dart to use UncontrolledProviderScope with a global ProviderContainer, which then was called from background message handler. It's still not refreshing.

Upvotes: 0

Views: 2006

Answers (1)

moulte
moulte

Reputation: 599

With this line you are creating a new instance for your providers :

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

you need to use a context to get the existing instance of ProviderContainer:

context.read(notificationProvider).getNotification();

or if you are not inside ui make dependencies between your providers

Upvotes: 1

Related Questions