Flutter中整合SharedPreferences与OneSignal推送通知的方案咨询
直接将两种逻辑整合到同一套代码中即可,核心是在main函数中先完成SharedPreferences的初始化,再将用户邮箱状态传递给有状态的MyApp类,同时在MyApp的状态类中完成OneSignal的初始化配置。以下是完整的整合代码:
import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:onesignal_flutter/onesignal_flutter.dart'; // 导入你的页面组件 import './login_page.dart'; import './home_page_admin.dart'; import './utilities/globals.dart' as globals; Future main() async { WidgetsFlutterBinding.ensureInitialized(); // 初始化SharedPreferences并获取用户邮箱 SharedPreferences prefs = await SharedPreferences.getInstance(); var usrEmail = prefs.getString('email'); runApp(MyApp(usrEmail: usrEmail)); } class MyApp extends StatefulWidget { final String? usrEmail; const MyApp({Key? key, required this.usrEmail}) : super(key: key); @override State<MyApp> createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { @override void initState() { super.initState(); // 初始化OneSignal推送服务 initPlatformState(); } Future<void> initPlatformState() async { OneSignal.shared.setLogLevel(OSLogLevel.verbose, OSLogLevel.none); // 处理通知点击事件 OneSignal.shared.setNotificationOpenedHandler((OSNotificationOpenedResult result) { debugPrint('NOTIFICATION OPENED HANDLER CALLED WITH: $result'); globals.appnavigator.currentState?.push( MaterialPageRoute(builder: (context) => const NotificationHome()) ); }); // 处理前台收到通知的事件 OneSignal.shared.setNotificationWillShowInForegroundHandler( (OSNotificationReceivedEvent event) { // 可根据需求自定义前台通知展示逻辑 event.complete(event.notification); }); // 初始化OneSignal App ID await OneSignal.shared.setAppId("d27b4c45-540c-41fb-b0c2-0f92cd13a664"); } @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, title: "ATDOCHUB Dev", // 保留你原有的主题配置(如果需要) // theme: ThemeData( // colorScheme: ColorScheme.fromSwatch(primarySwatch: Colors.blue) // .copyWith(secondary: Colors.white70), // ), // 根据传入的用户邮箱判断启动页面 home: widget.usrEmail == null ? LoginPage() : homePageAdmin(), ); } }
关键改动说明
- main函数:保持异步初始化逻辑,获取到
usrEmail后作为参数传递给MyApp,而非直接创建MaterialApp。 - MyApp类:修改为接收
usrEmail参数的StatefulWidget,让状态类可以通过widget.usrEmail访问用户邮箱状态。 - OneSignal初始化:保留原有的推送配置逻辑,放在
initState中执行,确保应用启动时完成推送服务初始化。 - 页面跳转判断:在
MaterialApp的home属性中,通过widget.usrEmail判断跳转登录页还是管理员首页,完全复用原有逻辑。
内容的提问来源于stack exchange,提问作者Minal Suryawanshi
相关产品推荐
相关产品推荐

