ネイティブコードで処理する

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でも同様に内部通信を受信し、ネイティブコードで処理を実行させることができます。

今回は以上です。