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
相关产品推荐
相关产品推荐

