местоположение: ^ 3.2.1, невозможно уничтожить активность

#flutter

#флаттер

Вопрос:

Обновление 1

Найдена причина, проблема в location: ^3.2.1 том, чтобы воссоздать проблему, просто создайте проект flutter из Android Studio, добавьте эту зависимость в pubspec.yaml или в свой конфигурационный файл. Просто запустите приложение и нажмите кнопку «Назад», проверьте logcat , вы получите исключение, подобное,

 E/AndroidRuntime(21857): java.lang.RuntimeException: Unable to destroy activity {com.guna.flutter_app_test/com.guna.flutter_app_test.MainActivity}: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter activity
E/AndroidRuntime(21857):    at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:5111)
E/AndroidRuntime(21857):    at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:5140)
E/AndroidRuntime(21857):    at android.app.servertransaction.DestroyActivityItem.execute(DestroyActivityItem.java:44)
E/AndroidRuntime(21857):    at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
E/AndroidRuntime(21857):    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
E/AndroidRuntime(21857):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
E/AndroidRuntime(21857):    at android.os.Handler.dispatchMessage(Handler.java:106)
E/AndroidRuntime(21857):    at android.os.Looper.loop(Looper.java:223)
E/AndroidRuntime(21857):    at android.app.ActivityThread.main(ActivityThread.java:7656)
E/AndroidRuntime(21857):    at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(21857):    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
E/AndroidRuntime(21857):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
E/AndroidRuntime(21857): Caused by: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter activity
E/AndroidRuntime(21857):    at com.lyokone.location.FlutterLocationService.setActivity(Unknown Source:2)
E/AndroidRuntime(21857):    at com.lyokone.location.LocationPlugin.deinitialize(LocationPlugin.java:121)
E/AndroidRuntime(21857):    at com.lyokone.location.LocationPlugin.detachActivity(LocationPlugin.java:56)
E/AndroidRuntime(21857):    at com.lyokone.location.LocationPlugin.onDetachedFromActivity(LocationPlugin.java:69)
E/AndroidRuntime(21857):    at io.flutter.embedding.engine.FlutterEnginePluginRegistry.detachFromActivity(FlutterEnginePluginRegistry.java:346)
E/AndroidRuntime(21857):    at io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.onDetach(FlutterActivityAndFragmentDelegate.java:512)
E/AndroidRuntime(21857):    at io.flutter.embedding.android.FlutterActivity.onDestroy(FlutterActivity.java:577)
E/AndroidRuntime(21857):    at android.app.Activity.performDestroy(Activity.java:8245)
E/AndroidRuntime(21857):    at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1344)
E/AndroidRuntime(21857):    at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:5096)
 

Старый пост

У меня есть два экрана с именем Login и Dashboard .

Я хочу закрыть приложение, не переходя к Login нему, пока нажимаю назад на Dashboard экран.

Кроме того, при открытии приложения в следующий раз, когда приложение должно перейти на панель мониторинга, без входа в систему я управлял этим статусом входа в систему, используя общие настройки.

Но я использовал WillPopScope в своем Dashboard , в котором SystemNavigator.pop() я пропускал вход в систему и закрывал приложение. Это приводит к сбою с исключением java.lang.RuntimeException: Unable to destroy activity {com.guna.jnstores/com.guna.jnstores.MainActivity}: java.lang.NullPointerException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkNotNullParameter, parameter activity .

Я пробовал с pushNamedAndRemoveUntil , это не удаляет Login из стека, я также пробовал с pushReplacementNamed , pushAndRemoveUntil они удаляются Login из стека, но я получаю то же исключение.

Комментарии:

1. когда вы нажимаете панель мониторинга с экрана входа в систему, нажмите ее с помощью Navigator.pushReplacement , что удалит текущий экран из стека / списка и добавит панель мониторинга в качестве текущего экрана, если это не сработает, вам нужно показать нам, как вы управляете маршрутом и с помощью какого навигатора

2. @Yadu, я обновил свой пост.

3. @Gunaseelan вы смогли исправить эту проблему?

Ответ №1:

Я предполагаю, что вы разрабатываете приложение Flutter, а не собственное, в котором Flutter является только модулем. Это в значительной степени объясняет исходную ошибку, которую вы получаете: поскольку приложения Flutter имеют только одно действие MainActivity — «предыдущее» действие должно быть нулевым. Однако дайте мне знать, если я ошибаюсь.

Вы не должны использовать SystemNavigator.pop() исключительно в приложении Flutter; этот метод должен использоваться в экземплярах Flutter, которые «находятся» внутри собственных (т. Е. Не-Flutter) приложений.

Вместо этого, при переходе на панель мониторинга из входа в систему, используйте метод pushAndRemoveUntil (или его «именованный» аналог); таким образом, вам не нужно WillPopScope — нажатие аппаратной кнопки «Назад» закроет приложение.

Комментарии:

1. Ну, pushNamedAndRemoveUntil удаляет все предыдущие маршруты, если routePredicate это что-то вроде этого : (Route<dynamic> route) => false) . В любом случае, в вашем случае использования pushReplacementNamed тоже все в порядке. Что значит, что вы получаете то же исключение? Вы не должны вызывать SystemNavigator.pop() вообще. Просто удалите свой WillPopScope , и если логин был удален из стека, нажатие кнопки «Назад» на панели управления приведет к выходу из приложения, как и предполагалось.

2. Добавлено 1, потому что оно соответствует требованиям более старого сообщения.