amplify-flutter icon indicating copy to clipboard operation
amplify-flutter copied to clipboard

Сrash after completing a workmanager task

Open eslavyansky opened this issue 1 year ago • 2 comments

Description

After completing the workmanager task, the application crashes when receiving a push notification.

D/AmplifyAuthCognitoPlugin( 7925): onAttachedToEngine

I/flutter ( 7925): executeTask
I/WM-WorkerWrapper( 7925): Worker result SUCCESS for Work [ id=2457b878-41f6-4e94-a6f7-571d215f354b, tags={ dev.fluttercommunity.workmanager.BackgroundWorker } ]
D/AmplifyAuthCognitoPlugin( 7925): onDetachedFromEngine
D/AmplifyAuthCognitoPlugin( 7925): [cancelCurrentOperation] Canceling with state: signInResult=null, signOutResult=null

D/AndroidRuntime( 7925): Shutting down VM
E/AndroidRuntime( 7925): FATAL EXCEPTION: main
E/AndroidRuntime( 7925): Process: com.example.app, PID: 7925
E/AndroidRuntime( 7925): java.lang.NullPointerException
E/AndroidRuntime( 7925): 	at com.amazonaws.amplify.amplify_push_notifications.PushNotificationFirebaseMessagingService.handleMessageReceived$lambda$3(PushNotificationFirebaseMessagingService.kt:72)
E/AndroidRuntime( 7925): 	at com.amazonaws.amplify.amplify_push_notifications.PushNotificationFirebaseMessagingService.$r8$lambda$3gv-VezmiX7SI0LpF2RU5uWz5uo(Unknown Source:0)
E/AndroidRuntime( 7925): 	at com.amazonaws.amplify.amplify_push_notifications.PushNotificationFirebaseMessagingService$$ExternalSyntheticLambda1.run(Unknown Source:6)
E/AndroidRuntime( 7925): 	at android.os.Handler.handleCallback(Handler.java:942)
E/AndroidRuntime( 7925): 	at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 7925): 	at android.os.Looper.loopOnce(Looper.java:201)
E/AndroidRuntime( 7925): 	at android.os.Looper.loop(Looper.java:288)
E/AndroidRuntime( 7925): 	at android.app.ActivityThread.main(ActivityThread.java:8144)
E/AndroidRuntime( 7925): 	at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime( 7925): 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:573)
E/AndroidRuntime( 7925): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1023)

Categories

  • [ ] Analytics
  • [ ] API (REST)
  • [ ] API (GraphQL)
  • [X] Auth
  • [ ] Authenticator
  • [ ] DataStore
  • [X] Notifications (Push)
  • [ ] Storage

Steps to Reproduce

@pragma('vm:entry-point')
void callbackDispatcher() {
  Workmanager().executeTask((task, inputData) async {
    safePrint("executeTask");
    return Future.value(true);
  });
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );

  final auth = AmplifyAuthCognito();
  final pushPlugin = AmplifyPushNotificationsPinpoint();
  await Amplify.addPlugins([auth, pushPlugin]);
  await Amplify.configure(amplifyconfig);

  Amplify.Notifications.Push.onTokenReceived.listen((event) {
    safePrint("onTokenReceived: $event");
  });

  Workmanager().initialize(callbackDispatcher, isInDebugMode: true);

  // no error if you comment this
  Workmanager().registerOneOffTask("test", "test");

  runApp(const MyApp());
}

Screenshots

No response

Platforms

  • [ ] iOS
  • [X] Android
  • [ ] Web
  • [ ] macOS
  • [ ] Windows
  • [ ] Linux

Flutter Version

3.22.3

Amplify Flutter Version

2.3.0

Deployment Method

Custom Pipeline

Schema

No response

eslavyansky avatar Jul 22 '24 16:07 eslavyansky

Hello @eslavyansky - Thanks for opening the issue. We will look into this. I will let you know if we need more info.

Jordan-Nelson avatar Jul 23 '24 14:07 Jordan-Nelson

Hello @eslavyansky I was able to reproduce the issue you described. WorkManager is stopping the Flutter engine which deinitializes all of our native plugins as you can see from this stack trace:

at com.amazonaws.amplify.amplify_push_notifications.StreamHandlers$Companion.deInit(PushNotificationEventsStreamHandler.kt:199)
at com.amazonaws.amplify.amplify_push_notifications.AmplifyPushNotificationsPlugin.onDetachedFromEngine(AmplifyPushNotificationsPlugin.kt:133)
at io.flutter.embedding.engine.FlutterEngineConnectionRegistry.remove(FlutterEngineConnectionRegistry.java:272)
at io.flutter.embedding.engine.FlutterEngineConnectionRegistry.remove(FlutterEngineConnectionRegistry.java:280)
at io.flutter.embedding.engine.FlutterEngineConnectionRegistry.removeAll(FlutterEngineConnectionRegistry.java:288)
at io.flutter.embedding.engine.FlutterEngineConnectionRegistry.destroy(FlutterEngineConnectionRegistry.java:123)
at io.flutter.embedding.engine.FlutterEngine.destroy(FlutterEngine.java:470)
at dev.fluttercommunity.workmanager.BackgroundWorker.stopEngine$lambda$3(BackgroundWorker.kt:143)
at dev.fluttercommunity.workmanager.BackgroundWorker.$r8$lambda$YX_kSwcT9UnNdOdlpnrG92Wu8AY(Unknown Source:0)
at dev.fluttercommunity.workmanager.BackgroundWorker$$ExternalSyntheticLambda2.run(Unknown Source:2)
at android.os.Handler.handleCallback(Handler.java:958)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:205)
at android.os.Looper.loop(Looper.java:294)
at android.app.ActivityThread.main(ActivityThread.java:8177)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)

We currently don't support amplify isolates, but I created a feature request to support isolates and included a section for workmanager. However we shouldn't be crashing the app when the Flutter Engine is stopped, so I will mark this as a bug so we can add proper error handling and logging for this situation. Please note that push notifications still will not work since the Flutter engine will still be stopped, but the app shouldn't crash. We will get back to you once the error handling is implemented.

tyllark avatar Aug 15 '24 19:08 tyllark