Help us understand the problem. What is going on with this article?

Flutterでネイティブで作ったViewControllerを呼び出す

More than 1 year has passed since last update.

Flutterではチャンネルという概念を用いてネイティブAPIやネイティブコードを呼び出すことができます。

今回はXcode上で作ったViewControllerをFlutterから呼び出してみたいと思います。

公式ドキュメントではバッテリー情報を取得しています。
https://flutter.io/platform-channels/

チャンネルを設定

まずはFlutter側の設定を書いていきます。

MethodChannel channel =
      const MethodChannel('jp.groupsnap/SandBoxViewController');

設定はこんな感じ。
jp.group.... のところはiOSのネイティブ側と同じ文字列を設定する必要があります。

ネイティブコードを呼ぶ

チャンネルを設定したら呼び出したい箇所で下記のコードを実行します

_callViewController() async {
    try {
      await channel.invokeMethod('callViewController');
    } on PlatformException catch (e) {
      print(e);
    }
  }

callViewController はプラットフォーム側にメッセージを渡せます。
渡すことはなくてもとりあえずなにからテキストを設定しないといけないっぽいです。(?)
(ここの真相はよくわからないのでわかる方教えてください、、、)

AppDelegateにChannelを設定する

import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)

    // Channelの設定
    setiOSChannel()

    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }

こんなコードを書いて、 setiOSChannel にチャンネル設定の実装を書いていきます。

    func setiOSChannel() {
        // iosチャンネル
        let controller : FlutterViewController = window?.rootViewController as! FlutterViewController;

        // SandboxViewController
        let callSandboxChannel = FlutterMethodChannel.init(name: "jp.groupsnap/SandBoxViewController", binaryMessenger: controller)
        callSandboxChannel.setMethodCallHandler({
            (call, result) -> Void in

            let next = controller.storyboard?.instantiateViewController(withIdentifier: "SandboxViewController")
            controller.present(next!,animated: true, completion: nil)
        })
    }

あとは setMethodCallHandler の中でiOSの画面遷移の実装にしたがって実装を書いていきます。
NavigationControllerで使っていろいろしたりしたかったら window?.rootViewController とかからNavigationControllerを取得(?)してPushViewControllerとかしてください。

雑談

今回はiOSの方を書いていきましたが、Androidの方だとたぶん Intent 投げたりするのかも。
たぶん実装方法はあまり変わらないと思います。

superman9387
I love Flutter 🔥❤️ 業務ではAndroidを書いていて、個人ではFlutterを書いています。 Flutterを愛しています。
https://note.mu/shogoyamada
zozotech
70億人のファッションを技術の力で変えていく
https://tech.zozo.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした