#概要
FlutterプラグインでAndroidネイティブ画面を利用するために、プラグイン側でActivityとContextを取得する方法を整理します。
プラグイン作成時にはthis経由でActivityを取得できず、代替手段が必要になるため、その補足記事となります。
本記事は公式ドキュメントを参考にして記載しています。
#環境
$ flutter --version
Flutter 2.5.3 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 18116933e7 (3 weeks ago) • 2021-10-15 10:46:35 -0700
Engine • revision d3ea636dc5
Tools • Dart 2.14.4
#実装
以下の手順で実装するといいかもしれません。説明の番号とコードのコメントに付与する番号は、内容を合わせています。
① プラグインのクラスにActivityAwareのインタフェースを追加する(必要なimport文は、中略ここから〜中略ここまでを参照ください)
② ActivityとContext用のメンバ変数を定義(特定のコールバック関数以外でAcitivity, Contextを使用するため)
③ Contextをメンバ変数に格納
④ onAttachedToActivityのコールバック関数の引数で渡されるbindingから取得できるActivityをメンバ変数に格納
⑤ ActivityAwareインタフェースを利用する上で、今回使用しない分の定義必須のコールバック関数を実装する。
⑥ ContextやActivityを使用して各々好きに実装する
// ✨✨①中略ここから✨✨
import io.flutter.embedding.engine.plugins.activity.ActivityAware
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding
// ✨✨①中略ここまで✨✨
/** ① AcitvityAwareのインタフェースを追加する。クラス名は適宜変更すること */
class PluginTest2Plugin: FlutterPlugin, MethodCallHandler, ActivityAware {
private lateinit var channel : MethodChannel
// ② 他のメソッドでも利用できるようにプラグイン用のクラスのメンバ変数を定義
private lateinit var activity : Activity
private lateinit var context : Context
override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
channel = MethodChannel(flutterPluginBinding.binaryMessenger, "plugin_test2")
channel.setMethodCallHandler(this)
// ✨✨ ③ Flutterエンジンにattachされたタイミングでメンバ変数にbindingされたContextを格納
context = flutterPluginBinding.applicationContext
}
override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
// ✨✨ ⑥ ContextやActivityを使用して各々好きに実装する
// 中略
if (call.method == "getPlatformVersion") {
result.success("Android ${android.os.Build.VERSION.RELEASE}")
} else {
result.notImplemented()
}
}
override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {
channel.setMethodCallHandler(null)
}
//
override fun onAttachedToActivity(binding: ActivityPluginBinding) {
// ✨✨ ④ Activityがattachされたタイミングでメンバ変数にbindingされたActivityを格納
activity = binding.activity
}
// ✨✨ ⑤ 以下のコールバック群は、ActivityAwareのインタフェースを実装する上で定義必須だが今回は使用しないため、TODOレベルで記載しておく
override fun onDetachedFromActivityForConfigChanges() {
TODO("Not yet implemented")
}
override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {
TODO("Not yet implemented")
}
override fun onDetachedFromActivity() {
TODO("Not yet implemented")
}
}