MainActivity.kt (Kotlin)
import android.content.res.Configuration
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 ) {
private val CHANNEL = "com.your.app.flutter/method1"
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"
}
}
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 {
final int result = await platform. invokeMethod ( 'method1' ) ;
} on PlatformException catch ( e )
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());
}
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のアップデートで表示されなくなったようです。
Kotlin Complier の Kotlin JVM Version を 1.6 から 1.8 に変更したところエラーがなくなりました。
こちらのサイトの情報が参考になりました。
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