Flutter MethodChannel от iOS до Native не работает

У меня есть проект Flutter, который пытается установить двустороннюю связь между Flutter и iOS Native. Пока он отлично работает от Flutter до iOS, но наоборот, молчит. Когда я вызываю метод из iOS, ничего не происходит. Ни сообщений, ни ошибок, ничего.

Я создаю MethodChannel на iOS следующим образом:

let channel = FlutterMethodChannel(
    name: "paymentview",
    binaryMessenger: controller.binaryMessenger
)

   channel.setMethodCallHandler({
       (call: FlutterMethodCall, result: FlutterResult) -> Void in
       if (call.method == "initialize") {

       } else if(call.method == "authorize") {

        }
   })

И вот так со стороны Flutter:

_channel = new MethodChannel('paymentview');
_channel.setMethodCallHandler(methodCallHandler);

Future<dynamic> methodCallHandler(MethodCall methodCall) async {
    switch (methodCall.method) {
      case 'authorized':
        print("authorized");
        return null;
      default:
        throw PlatformException(code: 'Not implemented', message: 'Not implemented');
    }
  }

Во Flutter я вызываю такой метод:

_channel.invokeMethod('authorize');

И это прекрасно работает. Звонок получен в iOS. Но на стороне iOS я вызываю такой метод:

DispatchQueue.main.async {
            self.channel.invokeMethod("authorized", arguments: nil)
        }

И на стороне Flutter ничего не происходит. Нет сообщений, нет ошибок, нет ничего. Я пробовал множество вариантов, с созданием нескольких каналов (по одному в каждую сторону), динамических идентификаторов каналов и так далее, но на стороне Flutter ничего не происходит. Любые идеи?

Изменить: я отладил это со стороны iOS, и он работает. Я получаю возвращаемое значение из моего кода Dart. Однако, когда я отлаживаю код Dart, точки останова не достигаются. Если я попытаюсь изменить какое-то состояние в Dart, ничего не произойдет...

Edit2: похоже, работает при запуске из XCode с использованием проекта runner, но не при запуске проекта Flutter из Android Studio.

2 ответа

Решение

Как упоминалось в комментариях, это внезапно начало работать без каких-либо изменений кода. Я несколько раз перезагрузил свой Mac, обновил Android Studio и т.д. И вдруг все заработало.

Для тех, кто сталкивается с подобными проблемами и использует пользовательскую раскадровку на стороне iOS или корневой контроллер представления: убедитесь, что FlutterViewController остается корневым VC, и вы выполняете дальнейшую нативную навигацию iOS, не заменяя его.

В моей аналогичной проблеме причина описанного поведения определенно заключалась в смене контроллера корневого представления с FlutterViewController на мой собственный iOS UIViewController (причина - в плагине была ссылка на собственный SDK, который использовал свою собственную раскадровку).

UPD: есть проблема, которая описывает возможные причины просто ожидаемого поведения: https://github.com/flutter/flutter/issues/52456

Другие вопросы по тегам