Вызов кода Dart из родной iOS не работает с использованием invokeMethod

#ios #flutter #dart #flutter-method-channel

#iOS #flutter #dart #flutter-method-channel

Вопрос:

В моем приложении Flutter я хочу вызвать метод dart из собственного кода iOS (из получателя уведомлений в классе AppDelegate), и я использую channel с invokeMethod для достижения этого, со стороны dart все настроено правильно, а со стороны iOS все настроено правильно, и вызов выполняется правильно, но dartобработчик вызова метода никогда не вызывается, и обратный вызов вызова invokeMethod в iOS никогда не принимается, не знаю, не хватает ли мне чего-то, вот мой код с обеих сторон:

на стороне Swift:

 var channel = FlutterMethodChannel()

// channel is created when registering app plugins
func registerPlugins(with registry: FlutterPluginRegistry) {
    
    let mainStoryBoard = UIStoryboard(name: "Main", bundle: nil)
    let redViewController = mainStoryBoard.instantiateViewController(withIdentifier: "AppIdentifier") as! FlutterViewController
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    appDelegate.window?.rootViewController = redViewController
     
    let controller : FlutterViewController = self.window.rootViewController as! FlutterViewController;
    self.channel = FlutterMethodChannel(name: "myApp.main/backgroundNotifications",
                                                      binaryMessenger: 
    controller.binaryMessenger);
}


// the background notification receiver
override func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void){

  // comes here    
  DispatchQueue.main.async {
      self.channel.invokeMethod("toTo", arguments: userInfo, result: {(r:Any?) -> () in
          print(r.debugDescription);  // Never comes here
      })
  }
  // comes here with no errors of execution to previous call

}
  

на стороне Dart: (в одном из моих классов виджетов)

 class _HomeState extends State<Home> with SingleTickerProviderStateMixin {

  MethodChannel _channel =
  const MethodChannel('myApp.main/backgroundNotifications');

  @override
  void initState() {
    super.initState();
    .
    .
    .
    _channel.setMethodCallHandler(toTo);
  }

  Future<dynamic> toTo(MethodCall call) async {
    print("init state setMethodCallHandler ${call.method}"); // Never comes here
    switch (call.method) {
      case 'toTo':
        return 145.0;
      case 'bar':
        return 123.0;
      default:
        throw MissingPluginException('notImplemented');
    }
  }

}
  

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

1. Я столкнулся с такой же проблемой, вы нашли какое-либо решение?