#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, потому что оно соответствует требованиям более старого сообщения.