X

Call Kotlin method from Flutter(FlutterからKotlinのコード内のメソッドを呼び出す)

MainActivity.kt (Kotlin)

package (your.app)

import android.content.res.Configuration
import android.os.Bundle
import android.os.PersistableBundle
import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant

import io.flutter.embedding.android.FlutterFragment
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel

import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.MethodChannel.Result

import io.flutter.plugin.platform.PlatformViewsController


class MainActivity: FlutterActivity() {
    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine)

        MethodChannel(flutterEngine.dartExecutor, CHANNEL).setMethodCallHandler { methodCall, result ->
            val args = methodCall.arguments
            when (methodCall.method) {
                "method1" -> {
                    val number = 10
                    result.success(number)
                }
            }
        }
    }

    companion object {
        private val CHANNEL = "com.your.app.flutter/method1"
    }

}

Dart

static const platform = const MethodChannel('com.your.app.flutter/method1');

Future<void> _Method1() async{
    int _number;
    try {
      final int result = await platform.invokeMethod('method1');
      _number = result;

      setState(() {
        number = _number;
      });

    } on PlatformException catch (e)
    {
      setState(() {
        number = -1;
      });
    }
}

int number;

Widget ShowNumber()
{
  Text(number.toString());
}

_Method1() を呼び出すと Kotlin側のmethod1 -> {} が実行され、結果が Flutter側の result に戻ります。

String testString = “abc”;
platform.invokeMethod(‘method1’, testString); でtestStringを引数にできます。
Kotlin側の methodCall.arguments で引数を取得できます。

io.flutter.app.FlutterActivity の FlutterActivity には FlutterEngine が存在しないのでGeneratedPluginRegistrant.registerWith(this) ではregistできません。またMethodCall の flutterView の代わり(java では getFlutterView() )に flutterEngine.dartExecutor を使用します。

2019-12-05の時点で app/build.gradle 内で Cannot resolve symbol ‘GradleException’ が、MainActivity.kt で Unresolved reference: NonNull がそれぞれ赤字で表示されます。2019-12-07のAndroid Studio アップデートとFlutter Pluginのアップデートで表示されなくなったようです。

こちらのサイトの情報が参考になりました。

https://github.com/flutter/flutter/issues/41102
https://qiita.com/tasogarei/items/bf3761139d46c43d5896
https://qiita.com/unsoluble_sugar/items/ae42b5faf52a491f6470
https://flutter.keicode.com/basics/method-channel-java.php

kawano: