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

Flutter集成OneSignal 5.1.2:APP关闭时获取通知数据实现Deeplink

Flutter OneSignal 5.1.2 处理关闭状态下通知唤起的DeepLink方案

针对APP关闭状态下点击通知启动后获取附加数据的需求,直接用OneSignal 5.x提供的getInitialNotification()方法即可实现,具体步骤如下:

1. 初始化时获取启动通知数据

在OneSignal初始化完成后,调用getInitialNotification()方法,该方法会返回一个Future对象:如果APP是通过点击通知从关闭状态启动的,就能拿到对应的OSNotificationClickEvent实例,从中提取附加数据。

2. 结合全局导航键实现页面跳转

由于初始化阶段可能还没有BuildContext,建议使用全局导航键来处理页面跳转,避免上下文问题。

完整代码示例

import 'package:flutter/material.dart';
import 'package:onesignal_flutter/onesignal_flutter.dart';
import 'dart:developer' as dev;

// 定义全局导航键
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化OneSignal
  await OneSignal.initialize("你的OneSignal App ID");

  // 获取启动时的初始通知
  final OSNotificationClickEvent? initialNotification = await OneSignal.Notifications.getInitialNotification();
  
  if (initialNotification != null) {
    dev.log('APP通过通知启动,获取到初始通知数据');
    // 提取附加数据
    final Map<String, dynamic>? additionalData = initialNotification.notification.additionalData;
    
    if (additionalData != null && additionalData.containsKey('article_id')) {
      final String articleId = additionalData['article_id'];
      // 等待APP初始化完成后执行导航
      WidgetsBinding.instance.addPostFrameCallback((_) {
        navigatorKey.currentState?.pushNamed(
          '/article', // 你的文章页面路由
          arguments: {'id': articleId},
        );
      });
    }
  }

  // 保持原有的前台通知点击监听
  _setNotificationClickListener();

  runApp(MyApp());
}

void _setNotificationClickListener() {
  OneSignal.Notifications.addClickListener((OSNotificationClickEvent event) {
    dev.log('Notification clicked');
    final Map<String, dynamic>? additionalData = event.notification.additionalData;
    
    if (additionalData != null && additionalData.containsKey('article_id')) {
      final String articleId = additionalData['article_id'];
      // 前台点击时直接跳转
      navigatorKey.currentState?.pushNamed(
        '/article',
        arguments: {'id': articleId},
      );
    }
  });
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorKey: navigatorKey, // 绑定全局导航键
      initialRoute: '/',
      routes: {
        '/': (context) => HomePage(),
        '/article': (context) {
          final args = ModalRoute.of(context)?.settings.arguments as Map<String, dynamic>;
          return ArticlePage(articleId: args['id']);
        },
      },
    );
  }
}

// 示例页面
class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(appBar: AppBar(title: Text('首页')));
  }
}

class ArticlePage extends StatelessWidget {
  final String articleId;
  const ArticlePage({required this.articleId});

  @override
  Widget build(BuildContext context) {
    return Scaffold(appBar: AppBar(title: Text('文章详情')), body: Center(child: Text('文章ID: $articleId')));
  }
}

关键说明

  • getInitialNotification()仅在APP从完全关闭状态被通知唤起时返回数据,APP后台运行时被唤起的情况仍由addClickListener处理,两者结合可覆盖所有通知点击场景。
  • 确保后端发送通知时,附加数据以键值对形式传入(例如{"article_id": "xxx"}),这样才能从additionalData中正确提取。

内容的提问来源于stack exchange,提问作者Apoorv pandey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 13:46:12