You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 07:57:11