Flutter開發(fā) Flutter與原生交互

前言

當(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)行運行,此處為安卓平臺特性代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容