iT邦幫忙

2021 iThome 鐵人賽

DAY 13
0
Mobile Development

Flutter - 從 Packages & Plugins 掌握原生系列 第 13

Day13 開發套件 - 範例程式碼介紹02 Android 端

  • 分享至 

  • xImage
  •  

接著來看Native 端(Android):

預設建立的android/.../BatterylevelPlugin.kt

class BatterylevelPlugin: FlutterPlugin, MethodCallHandler {
  /// The MethodChannel that will the communication between Flutter and native Android
  ///
  /// This local reference serves to register the plugin with the Flutter Engine and unregister it
  /// when the Flutter Engine is detached from the Activity
  private lateinit var channel : MethodChannel

  override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
    channel = MethodChannel(flutterPluginBinding.binaryMessenger, "batterylevel")
    channel.setMethodCallHandler(this)
  }

  override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
    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)
  }
}

這邊用來實現Native 端(Android)的功能,首先會實作**FlutterPluginMethodCallHandler**接口

  1. 實作FlutterPlugin接口,必須實作onAttachedToEngine以及onDetachedFromEngine方法
    • onAttachedToEngine:插件被FlutterEngine加載時調用,可以做一些初始化工作,預設已在這邊設置好MethodChannel的通道名稱(需要與Flutter 端使用的MethodChannel名稱相對應),並通過MethodChannel呼叫setMethodCallHandler來註冊一個MessageHandler來接收此通道訊息,設定為this是因為BatterylevelPlugin已實作MethodCallHandler接口,所以能夠處理接收通道的訊息
    • onDetachedFromEngine:插件從FlutterEngine移除時調用,可以做一些清理工作,這邊對MethodChannel呼叫setMethodCallHandler設定為null,將此通道進行註銷
  2. 實作MethodCallHandler接口,就必須實作onMethodCall,目的可讓MethodChannel調用setMethodCallHandler,實現從Flutter 端要調用的原生方法,這邊對Flutter 端呼叫的方法getPlatformVersion做功能的實現,當Flutter 端呼叫此方法,就會回傳現在Android 的版本資訊回去

上一篇
Day12 開發插件 - 範例程式碼介紹01 Flutter 端
下一篇
Day14 開發套件 - 範例程式碼介紹03 iOS 端
系列文
Flutter - 從 Packages & Plugins 掌握原生30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言