我正在使用 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();
}
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');
}
}
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
一起使用,然后从后台消息处理程序调用它。它仍然没有令人耳目一新。
答案 0 :(得分:1)
通过这一行,您正在为您的提供者创建一个新实例:
ProviderContainer().read(notificationProvider).getNotification();
您需要使用上下文来获取 ProviderContainer 的现有实例:
context.read(notificationProvider).getNotification();
或者如果您不在 ui 中,则在您的提供者之间建立依赖关系