Flutter应用在Android 13初始化OneSignal时崩溃问题求助
Flutter应用初始化OneSignal时崩溃(Android 13)
环境信息
- Flutter版本:3.3.8(stable通道,Windows 10系统)
- OneSignal插件版本:
onesignal_flutter: ^3.5.0 - Android compileSdkVersion:
33 - Flutter Doctor检测结果:
Doctor summary (to see all details, run flutter doctor -v): [√] Flutter (Channel stable, 3.3.8, on Microsoft Windows [Version 10.0.19045.2251], locale en-US) Checking Android licenses is taking an unexpectedly long time...[√] Android toolchain - develop for Android devices (Android SDK version 30.0.3) [√] Chrome - develop for the web [X] Visual Studio - develop for Windows X Visual Studio not installed; this is necessary for Windows development. Download at https://visualstudio.microsoft.com/downloads/. Please install the "Desktop development with C++" workload, including all of its default components [√] Android Studio (version 2021.3) [√] VS Code (version 1.73.1) [√] Connected device (4 available) [√] HTTP Host Availability
初始化代码
当前使用的OneSignal初始化逻辑:
static void _initOneSignal() async { // The promptForPushNotificationsWithUserResponse function will show the iOS push notification prompt. We recommend removing the following code and instead using an In-App Message to prompt for notification permission await OneSignal.shared .promptUserForPushNotificationPermission(fallbackToSettings: true); //Remove this method to stop OneSignal Debugging if (kDebugMode) OneSignal.shared.setLogLevel(OSLogLevel.verbose, OSLogLevel.none); OneSignal.shared.setAppId("${AppConstant.oneSignalId}"); // The promptForPushNotificationsWithUserResponse function will show the iOS push notification prompt. We recommend removing the following code and instead using an In-App Message to prompt for notification permission OneSignal.shared.promptUserForPushNotificationPermission().then((accepted) { debugPrint("Accepted permission: $accepted"); }); }
注意:不调用
_initOneSignal()时,应用运行完全正常。
错误日志
在Android 13设备上运行时,应用抛出致命错误直接终止:
E/AndroidRuntime(11728): FATAL EXCEPTION: main E/AndroidRuntime(11728): Process: com.band.amazfitband7, PID: 11728 E/AndroidRuntime(11728): java.lang.ExceptionInInitializerError E/AndroidRuntime(11728): at com.onesignal.OneSignal.promptForPushNotifications(OneSignal.java:2864) E/AndroidRuntime(11728): at com.onesignal.flutter.OneSignalPlugin.promptPermission(OneSignalPlugin.java:282) E/AndroidRuntime(11728): at com.onesignal.flutter.OneSignalPlugin.onMethodCall(OneSignalPlugin.java:158) E/AndroidRuntime(11728): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:262) E/AndroidRuntime(11728): at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:295) E/AndroidRuntime(11728): at io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$io-flutter-embedding-engine-dart-DartMessenger(DartMessenger.java:319) E/AndroidRuntime(11728): at io.flutter.embedding.engine.dart.DartMessenger$$ExternalSyntheticLambda0.run(Unknown Source:12) E/AndroidRuntime(11728): at android.os.Handler.handleCallback(Handler.java:942) E/AndroidRuntime(11728): at android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime(11728): at android.os.Looper.loopOnce(Looper.java:201) E/AndroidRuntime(11728): at android.os.Looper.loop(Looper.java:288) E/AndroidRuntime(11728): at android.app.ActivityThread.main(ActivityThread.java:7872) E/AndroidRuntime(11728): at java.lang.reflect.Method.invoke(Native Method) E/AndroidRuntime(11728): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) E/AndroidRuntime(11728): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936) E/AndroidRuntime(11728): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference E/AndroidRuntime(11728): at com.onesignal.OSUtils.getTargetSdkVersion(OSUtils.java:490) E/AndroidRuntime(11728): at com.onesignal.NotificationPermissionController.<clinit>(NotificationPermissionController.kt:48)
修复方案
从错误栈可以明确,崩溃根源是在OneSignal未完成初始化(未调用setAppId)之前就请求了通知权限,导致SDK内部Context对象为空,触发空指针异常。
调整初始化顺序,确保先完成SDK核心初始化,再执行权限请求和其他配置:
static void _initOneSignal() async { // 第一步:先设置AppId完成SDK初始化 OneSignal.shared.setAppId("${AppConstant.oneSignalId}"); // 仅Debug模式开启调试日志 if (kDebugMode) { OneSignal.shared.setLogLevel(OSLogLevel.verbose, OSLogLevel.none); } // 统一请求通知权限,避免重复调用 final accepted = await OneSignal.shared .promptUserForPushNotificationPermission(fallbackToSettings: true); debugPrint("Accepted permission: $accepted"); }
额外注意事项:
- 所有OneSignal功能调用必须在
setAppId之后执行,确保SDK完成初始化 - 不要重复调用
promptUserForPushNotificationPermission,一次调用即可处理权限请求 - 确认
AppConstant.oneSignalId为有效非空的OneSignal应用ID
内容的提问来源于stack exchange,提问作者Mahmoud Abu Alheja
相关产品推荐
相关产品推荐

