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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:50:34