Открыть экран флаттера из вызова собственного метода

#flutter #flutter-navigation

#флаттер #flutter-навигация

Вопрос:

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

Я следую следующему шагу: 1) Из flutter я вызываю собственный экран по каналу метода. 2) После этого из native я вызываю flutter по каналу метода, но в этом процессе я получаю данные из native, но другой экран не открыт.

У меня есть такая реализация:

   Future<dynamic> searchCallHandler(MethodCall call) async {
    switch (call.method) {
      case 'openSearch':
        print('call callMe : arguments = ${call.arguments}');
     
        navigatorKey.currentState.push(
          MaterialPageRoute(builder: (context) => SearchLocation()),
        );
        return Future.value('called from platform!');
      default:
        print('Unknowm method ${call.method}');
        throw MissingPluginException();
        break;
    }
  }
  

в приведенном выше коде получите значение аргументов, но не переходите на экран поиска flutter.

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

1. то же самое (( github.com/flutter/flutter/issues/75314

Ответ №1:

Вам нужно понять, как flutter работает с native here и стеком действий.

В приложении flutter есть одно основное действие, которое расширяет FlutterActivity . Все ваши представления и экраны отображаются в этом действии. Поэтому, когда вы открываете свое приложение, в собственном стеке активности Android есть только одно действие ( FlutterActivity ).

Теперь, когда вы вызываете метод для запуска нового Activity на собственном, он запускает новый Activity , а собственный стек действий Android имеет 2 действия.

После этого, когда вы вызываете:

 navigatorKey.currentState.push(
  MaterialPageRoute(builder: (context) => SearchLocation()),
);
  

через канал метода flutter все еще переходит к новому экрану в своей собственной activity ( FlutterActivity ), которая находится за текущей видимой собственной активностью.

Итак, решение таково:

Вызовите finish() перед вызовом openSearch метода из собственного конца.

Это уничтожит текущую встроенную активность и позволит FlutterActivity выйти на передний план, и вы сможете увидеть экран поиска в flutter.

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

1. Спасибо. Завершение действия работает, но если я не хочу завершать собственное действие, потому что при обратном нажатии я хочу увидеть это действие. Можно ли добиться этого с помощью другого решения?