본문 바로가기
Flutter

Flutter에서 네이티브 뷰 호출하기

by 붕어사랑 티스토리 2023. 11. 1.
반응형

https://docs.flutter.dev/platform-integration/android/platform-views

 

Hosting native Android views in your Flutter app with Platform Views

Learn how to host native Android views in your Flutter app with Platform Views.

docs.flutter.dev

 

 

1.  공식문서를 보기 전에 알아야 할 사실

 

위 링크의 공식문서는 네이티브 뷰를 호스팅하는 내용이다. 허나 한 가지 알아야할 사실이 있다.

 

 

저 링크의 내용은 네이티브 액티비티나 뷰 컨트롤러를 호출하는 것이 아닌, 플러터의 액티비티 or 뷰컨트롤러에 네이티브 뷰를 삽입하는 것이다.

 

한마디로 예를 들면, 안드로이드의 텍스트뷰를 플러터에다가 넣어준다는 뜻.

 

 

 

2. 엥 나는 액티비티나 뷰컨트롤러를 띄우고 싶은데 어떻게 해야하지?

 

방법은 메소드채널을 뚫어서 startActivity같은 방식으로 액티비티나 뷰컨트롤러를 띄워주어야 한다.

 

 

 

 

iOS

스토리보드에서 NavigationViewController를 추가하거나 AppDelegate에서 앱을 초기화 할 때 코드로 NavigationViewController를 추가해주어야 한다

 

override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        let FlutterViewController : FlutterViewController = window?.rootViewController as! FlutterViewController
        let channel = FlutterMethodChannel(name: channelName,
                                           binaryMessenger: FlutterViewController.binaryMessenger)
        let navigationController = UINavigationController(rootViewController: FlutterViewController)
        navigationController.setNavigationBarHidden(true, animated: false)
        self.window!.rootViewController = navigationController
        self.window!.makeKeyAndVisible()
        channel.setMethodCallHandler({
            (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
            switch call.method {
            case self.SHOW_CAMERA_VIEW:
                let 다른스토리보드 = UIStoryboard(name: "다른스토리보드", bundle: nil)
                let 호출할네이티브뷰컨트롤러 = 다른스토리보드.instantiateInitialViewController()!

                navigationController.pushViewController(호출할네이티브뷰컨트롤러, animated: true)
                break
            default:
                break
            }
        })
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }

 

 

여기서 중요한점은 navigationController생성작업을 메소드 핸들러에서 하면 안된다. 왜냐하면 application 메소드가 끝나버리면 스토리보드 hierachy가 다 구성이 완료되고, 그상태에서 무언가를 바꾸려하다가 에러가 나기 때문

반응형

댓글