2023年4月28日
開発環境
OS:Windows 11
SDK:VS Code + flutter 3.7.5
ネイティブコード
FlutterでAndroid、iOS向けのアプリ開発を行っているとどうしてもDartでは処理できないネイティブコードに依存する処理を実装する場合がでてきます。
そのような場合はどうするか?
Dart側で内部通信処理を実装し、ネイティブコード側で処理をするよう依頼します。
ネイティブコード側は内部通信の受信を行い、依頼に従い、処理を行います。
MethodChannel
内部通信を行うためにMethodChannelを使用します。
例えば、ボタンを押下したときにネイティブコードで処理を行う場合、Dart側では下記のような実装になります。
MethodChannelで使用するチャンネルと通信コードはDart側とネイティブコード側で合わせます。
チャンネル「samplesetting」、通信コード「dispSetting」
import 'package:flutter/services.dart';
child: ElevatedButton(
onPressed: () async {
const MethodChannel channel = MethodChannel('samplesetting');
await channel.invokeMethod('dispSetting');
},
)
それに対し、ネイティブコード側は内部通信の受信を行い、処理を行います。
Androidの場合だと下記のような実装となります。
処理の実装は、プロジェクト作成時に自動生成されたMainActivity.ktで行います。
(プロジェクトフォルダ)\android\app\src\main\kotlin\・・・\MainActivity.kt
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import kotlinx.coroutines.ExperimentalCoroutinesApi
import androidx.annotation.NonNull
import android.content.Intent
import android.provider.Settings
import android.net.Uri
class MainActivity: FlutterActivity() {
private val CHANNEL = "samplesetting"
@OptIn(ExperimentalCoroutinesApi::class)
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler{
call, result ->
if(call.method == "dispSetting"){
try {
val intent = Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:com.example.sample"))
startActivity(intent);
result.success("success");
} catch (e:Exception) {
result.notImplemented()
}
}else{
result.notImplemented()
}
}
}
}
今回は設定画面を表示する処理を実装してみました。
※パッケージ app_settingsをインストールすれば、Dartだけで設定画面を表示することもできます。
動作確認
実機にインストールして動かすと下記のようになりました。


iOSでも同様に内部通信を受信し、ネイティブコードで処理を実行させることができます。
今回は以上です。