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

Flutter中整合SharedPreferences与OneSignal推送通知的方案咨询

解决方案:整合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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:01:41