前言
當(dāng)大家在開發(fā)Flutter的時候會遇到很多需要平臺特性代碼進(jìn)行支持的時候,需要使用和原生交互。這里推薦大家使用Flutter_Plugin。
實現(xiàn)
使用AS進(jìn)行創(chuàng)建的時候有三種選擇:
Flutter Application: Flutter應(yīng)用
Flutter Plugin:Flutter插件
Flutter Package:純Dart組件
Plugin其實就是一個特殊的Package。Flutter Plugin提供Android或者iOS的底層封裝,在Flutter層提供組件功能,使Flutter可以較方便的調(diào)取Native的模塊。很多平臺相關(guān)性或者對于Flutter實現(xiàn)起來比較復(fù)雜的部分,都可以封裝成Plugin。
Flutter?撰寫雙端平臺代碼(插件編寫實現(xiàn))官方鏈接https://flutter.cn/docs/development/platform-integration/platform-channels?tab=android-channel-java-tab
消息使用平臺通道在客戶端(UI)和宿主(平臺)之間傳遞,如下圖所示:

實現(xiàn)步驟
1、在終端中運行:flutter create batterylevel
默認(rèn)情況下,我們的模板使用 Kotlin 編寫 Android 或使用 Swift 編寫 iOS 代碼。要使用 Java 或 Objective-C,請使用?-i?和/或?-a?標(biāo)志:
在終端中運行:flutter create -i objc -a java batterylevel
此處盡量使用flutter create -i objc -a java batterylevel,目前大部分安卓和iOS代碼都是使用java和Objective-C,看需求進(jìn)行使用
2、創(chuàng)建 Flutter 平臺客戶端
首先,需要構(gòu)建通道。在返回單一平臺方法中使用?MethodChannel。
MethodChannel簡單的說就是Flutter提供與客戶端通信的渠道,使用時互相約定一個渠道name與對應(yīng)的調(diào)用客戶端指定方法的method
通道的客戶端和宿主端通過傳遞給通道構(gòu)造函數(shù)的通道名稱進(jìn)行連接。一個應(yīng)用中所使用的所有通道名稱必須是唯一的;使用唯一的?域前綴?為通道名稱添加前綴,比如:samples.flutter.dev/battery
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
...
class _MyHomePageState extends State<MyHomePage> {
? static const platform = const MethodChannel('samples.flutter.dev/battery');
? // Get battery level.
}
接下來,在方法通道上調(diào)用方法(指定通過 String 標(biāo)識符?getBatteryLevel?調(diào)用的具體方法)。調(diào)用可能會失敗—比如,如果平臺不支持此平臺 API(比如在模擬器中運行),所以將?invokeMethod?調(diào)用包裹在 try-catch 語句中。
// Get battery level.
? String _batteryLevel = 'Unknown battery level.';
? Future<void> _getBatteryLevel() async {
? ? String batteryLevel;
? ? try {
? ? ? final int result = await platform.invokeMethod('getBatteryLevel');
? ? ? batteryLevel = 'Battery level at $result % .';
? ? } on PlatformException catch (e) {
? ? ? batteryLevel = "Failed to get battery level: '${e.message}'.";
? ? }
? ? setState(() {
? ? ? _batteryLevel = batteryLevel;
? ? });
? }
3、添加 Android 平臺的實現(xiàn)【此處需要添加安卓端特性代碼】
打開android/app/src/main/java/MainActivity.java【注意:如默認(rèn)直接使用Flutter create創(chuàng)建的項目,默認(rèn)為Kotlin,不會創(chuàng)建此文件】

在此處MainActivity.java文件中添加平臺特性代碼
添加依賴頭
import android.content.ContextWrapper;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
import android.os.Bundle;
public class MainActivity extends FlutterActivity {
? private static final String CHANNEL = "samples.flutter.dev/battery";
? @Override
? public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
? super.configureFlutterEngine(flutterEngine);
? ? new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
? ? ? ? .setMethodCallHandler(
? ? ? ? (call, result) -> {
? ? ? ? ? ? // Note: this method is invoked on the main thread.
? ? ? ? ? ? if (call.method.equals("getBatteryLevel")) {
? ? ? ? ? ? ? int batteryLevel = getBatteryLevel();
? ? ? ? ? ? ? if (batteryLevel != -1) {
? ? ? ? ? ? ? ? result.success(batteryLevel);
? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? result.error("UNAVAILABLE", "Battery level not available.", null);
? ? ? ? ? ? ? }
? ? ? ? ? ? } else {
? ? ? ? ? ? ? result.notImplemented();
? ? ? ? ? ? }
? ? ? ? ? }
? ? ? ? );
? }
}
private int getBatteryLevel() {
? ? int batteryLevel = -1;
? ? if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) {
? ? ? BatteryManager batteryManager = (BatteryManager) getSystemService(BATTERY_SERVICE);
? ? ? batteryLevel = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);
? ? } else {
? ? ? Intent intent = new ContextWrapper(getApplicationContext()).
? ? ? ? ? registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
? ? ? batteryLevel = (intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) * 100) /
? ? ? ? ? intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
? ? }
? ? return batteryLevel;
? }
進(jìn)行運行,此處為安卓平臺特性代碼