1

I want to add the Flutter platform channel in an iOS share extension ( Is this even possible?

In the main app's AppDelegate I would simply use something like this:

let controller : FlutterViewController = window?.rootViewController as! FlutterViewController

let channel = FlutterMethodChannel(name: "<channelName>",
                                                binaryMessenger: controller.binaryMessenger)

In the FlutterMethodChannel initialization, a binaryMessenger of the type FlutterBinaryMessenger is required.

In the ShareViewController I tried to create a class of the type FlutterAppDelegate, and create there FlutterViewController But turns out the controller is null.

   @objc class ExtDelegate: FlutterAppDelegate {
func invokeMethod(
    ) -> Bool {
  let controller = (window.rootViewController as! FlutterViewController)
  let methodChannel =
      FlutterMethodChannel(name: "task-identifier", binaryMessenger: controller.binaryMessenger)
        methodChannel.invokeMethod("fetchImage", arguments: "Arg-s")
      return true
    }
}

Any ideas on how to realize this?

1 Answers1

0

Step 1: Use this link https://docs.flutter.dev/development/add-to-app/ios/add-flutter-screen?tab=engine-swift-tab

Step 2: I prefer to use UIViewControllerRepresentable As this

import Flutter struct FlutterView: UIViewControllerRepresentable {

typealias UIViewControllerType = FlutterViewController

    var callbackPressBack: (() -> Void)?

func makeUIViewController(context: Context) -> FlutterViewController {

    let controller = FlutterViewController(project: nil, nibName: nil, bundle: nil)
    let mainChannel = FlutterMethodChannel(name: "com...... From flutter",
                                           binaryMessenger: controller.binaryMessenger)

    mainChannel.setMethodCallHandler({
        (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
        // This method is invoked on the UI thread.
        
        print("Method \(call.method)")
        
        if call.method == "back" {
            print("BACK")
            callbackPressBack?()
        }
    })
    return controller
}

func updateUIViewController(_ uiViewController: FlutterViewController, context: Context) {
    // Updates the state of the specified view controller with new information from SwiftUI.
}

}

Step 3: To use it using SwiftUI

struct FlutterSwiftUI : View { var body: some View { FlutterView () } }