天天看點

Flutter學習(9)——Flutter插件實作(Flutter調用Android原生

原文位址: Flutter學習(9)——Flutter插件實作(Flutter調用Android原生) | Stars-One的雜貨小窩

最近需要給一個Flutter項目加個apk完整性檢測,需要去拿到目前安裝apk的md5數值,由于Flutter中無法實作,需要調用原生Android代碼才能實作,于是花了些時間研究了下插件的實作,特此記錄

flutter中有個ios和android的檔案夾,分别對應的Android和Ios的原生代碼

Flutter學習(9)——Flutter插件實作(Flutter調用Android原生

我們想要實作FLutter調用原生代碼,在裡面寫原生代碼即可

在android檔案夾中,建立有個類,Android可以選擇Java或者是Kotlin代碼編寫即可

android目錄結構其實就是常見的Android項目目錄

Flutter學習(9)——Flutter插件實作(Flutter調用Android原生

然後使用Android Studio打開,右鍵菜單,選擇<code>flutter</code> -&gt; <code>Open Android module in Android Studio</code>

Flutter學習(9)——Flutter插件實作(Flutter調用Android原生

之後可以看到已經像Android開發一樣打開了一個項目(當然,這裡你也可以自己使用Android Studio去選擇那個android檔案夾,将其當做項目打開即可)

此Activity需要繼承<code>FlutterActivity</code>,并重寫<code>configureFlutterEngine</code>方法,在此方法中進行插件的初始化

那麼這裡需要插件的執行個體,插件的執行個體怎麼來呢?其實就是自己寫個類,然後實作Flutter提供的<code>FlutterPlugin</code>接口

建立一個類,實作<code>FlutterPlugin</code>接口,建立一個<code>MethodChannel</code>對象,利用此對象的<code>setMethodCallHandler</code>方法設定方法處理回調,裡面通過判斷方法名來調我們原生寫的方法

如果你想要一個Application的context上下文對象,可以在<code>onAttachedToEngine()</code>方法中使用binding的<code>getApplicationContext()</code>方法擷取,如下代碼

如果是想要擷取目前Activity的context對象,可以讓目前類實作ActivityAware接口,不過略顯繁瑣,一般用Application的context對象應該可以滿足大部分要求了,看情況選擇吧

之前在第二步中的Activity中,補上注冊的代碼

在flutter中建立一個檔案,檔案名和class名任意,隻是用來聲明和初始化上述的Java類

還記得之前寫的方法名的判斷嗎?這裡就是傳一個方法名,之後就會觸發回調,之後即可得到傳回結果

PS:注意,調Android原生的方法都是異步操作!

之後在對應的page檔案對應代碼處中調用即可

如果想使用同步代碼,可以這樣寫

PS:測試的時候注意,如果是改了原生層代碼(Java或Kotlin),最好将項目重新運作,不要使用Flutter的熱重載功能(除非你隻動了flutter的代碼)

上述的例子中,并沒有涉及到傳參,這裡再補充講解下我自己的研究使用

這裡隻講Flutter如何給Android原生傳參

FLutter中調用方法(即上述的第五步操作):

Android中的接收(上述的第三步):

在判斷方法名之後,即可通過對應的方法擷取資料(需要類型轉換)

上述的代碼隻是傳單個資料,如果是要穿多個資料要怎麼辦呢?

由于<code>invokeMethod()</code>方法裡隻支援傳單個資料,是以我們需要傳map或是json格式的資料給到Android原生

Flutter發送資料:

Android接收資料:

這裡有點要注意,call中有個arguments屬性和arguments()方法,如下圖

Flutter學習(9)——Flutter插件實作(Flutter調用Android原生

flutter中傳過來的資料是map或json的,就得用arguments()來擷取參資料;否則就是使用arguments屬性

當然,如果傳過來的資料是map或json類型,call提供了一個友善快捷的方法,我們可以直接使用<code>argument(key)</code>來直接擷取key對應的數值(注意這裡也需要類型強轉,注意類型需要對應)

最後這裡給出Flutter與Java的對應的類型表:

Dart

Android

null

bool

java.lang.Boolean

int

java.lang.Integer

int, if 32 bits not enough

java.lang.Long

double

java.lang.Double

String

java.lang.String

Uint8List

byte[]

Int32List

int[]

Int64List

long[]

Float64List

double[]

List

java.util.ArrayList

Map

java.util.HashMap

點選檢視源碼(ApkMd5CheckPlugin類)

flutter plugin之路:flutter與原生互動傳值OC/java版(一) - 簡書

Flutter調用android原生方法_guanyueliuxing的部落格-CSDN部落格_flutter 調用原生方法

提問之前,請先看提問須知

點選右側圖示發起提問

Flutter學習(9)——Flutter插件實作(Flutter調用Android原生

或者加入QQ群一起學習

Flutter學習(9)——Flutter插件實作(Flutter調用Android原生

TornadoFx學習交流群:1071184701

Flutter學習(9)——Flutter插件實作(Flutter調用Android原生
Flutter學習(9)——Flutter插件實作(Flutter調用Android原生

繼續閱讀