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