Flutter安卓应用:实现前后台共享FireBase通知数据
解决Flutter应用前后台共享Firebase通知数据的方案
方案一:本地持久化存储(最可靠)
直接把后台收到的通知数据存到本地,前台恢复时读取即可,完全不受前后台内存区域影响,甚至应用重启也能保留数据。常用工具:
- SharedPreferences:适合存储简单键值对数据(如通知标题、内容、时间戳)
// 后台收到通知时执行存储 Future<void> saveNotification(Map<String, dynamic> data) async { final prefs = await SharedPreferences.getInstance(); List<String> savedNotifications = prefs.getStringList('notifications') ?? []; savedNotifications.add(jsonEncode(data)); await prefs.setStringList('notifications', savedNotifications); } // 前台回到活跃状态时读取数据 Future<List<Map<String, dynamic>>> getSavedNotifications() async { final prefs = await SharedPreferences.getInstance(); List<String> saved = prefs.getStringList('notifications') ?? []; return saved.map((e) => jsonDecode(e)).toList(); } - Hive/SQLite:如果通知数据结构复杂,或需要查询、排序功能,选择这两个工具更合适。
方案二:全局状态管理(内存级共享)
用状态管理工具维护全局状态,只要应用进程未被系统杀死,前后台就能访问同一个状态实例:
- 以Riverpod为例:
// 定义全局状态提供者 final notificationsProvider = StateProvider<List<Map<String, dynamic>>>((ref) => []); // 后台收到通知时更新状态 void addNotification(WidgetRef ref, Map<String, dynamic> data) { final current = ref.read(notificationsProvider); ref.read(notificationsProvider.notifier).state = [...current, data]; } // 前台页面监听状态变化展示数据 Consumer( builder: (context, ref, child) { final notifications = ref.watch(notificationsProvider); return ListView.builder( itemCount: notifications.length, itemBuilder: (context, index) => ListTile(title: Text(notifications[index]['title'])), ); }, ) - Provider、GetX等其他状态管理工具逻辑类似,核心是维护一个全局可访问的状态容器。
方案三:全局单例类(轻量内存共享)
如果不想引入状态管理库,可自行实现单例类保存通知数据:
class NotificationStore { static final NotificationStore _instance = NotificationStore._internal(); List<Map<String, dynamic>> _notifications = []; factory NotificationStore() => _instance; NotificationStore._internal(); void addNotification(Map<String, dynamic> data) { _notifications.add(data); } List<Map<String, dynamic>> getNotifications() => _notifications; void clear() => _notifications.clear(); }
后台收到通知时调用NotificationStore().addNotification(data),前台回到活跃状态时调用getNotifications()获取数据。注意:若应用被系统回收,单例内的数据会丢失,建议搭配持久化做兜底处理。
补充:Firebase消息处理要点
- 后台消息需在
FirebaseMessaging.onBackgroundMessage回调中处理,此处仅能调用隔离环境允许的代码(不能直接更新UI,需将数据存入持久化或全局状态) - 前台可监听
FirebaseMessaging.onMessage实时获取通知,结合生命周期监听(如WidgetsBinding.instance.addObserver)在应用从后台回到前台时触发数据读取或更新。
内容的提问来源于stack exchange,提问作者Assar Westman
相关产品推荐
相关产品推荐

