日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Flutter入门:application、module、package、plugin

發(fā)布時(shí)間:2024/4/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Flutter入门:application、module、package、plugin 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我們用AS創(chuàng)建flutter項(xiàng)目時(shí),會看到幾個(gè)選項(xiàng):application、module、package、plugin。

application

就是一個(gè)新flutter app,這個(gè)沒什么可說的

module

在android或ios項(xiàng)目中添加一個(gè)flutter模塊。 這個(gè)的作用是在原有的項(xiàng)目中使用flutter,不改變原項(xiàng)目結(jié)構(gòu)。所以說這個(gè)并不是在flutter項(xiàng)目使用的。

package

package和plugin都是可以發(fā)布到pub倉庫的,可以說是公開的通用庫。區(qū)別是package是純dart的,而plugin是包括android和ios的。

plugin

當(dāng)我們引用plugin到自己的項(xiàng)目里,打包的時(shí)候就會將其下的android和ios相關(guān)代碼和文件與主項(xiàng)目里對應(yīng)的平臺代碼合并到一起。

plugin也可以不發(fā)布到pub倉庫,在本地直接引用。

比如我們在一個(gè)項(xiàng)目里new -> module -> flutter plugin,創(chuàng)建一個(gè)名為flutter_core的plugin,這時(shí)候我們只要在pubspec.yaml中添加

dependencies:flutter:sdk: flutter...flutter_core:path: flutter_core

這樣就可以將plugin依賴進(jìn)來使用了

plugin中android代碼編譯問題

但是,上面這樣還有一個(gè)問題,plugin下的android目錄在本項(xiàng)目里無法按android來編譯,所以在編寫android代碼時(shí)沒有任何補(bǔ)全和錯(cuò)誤提示。

我的解決方法是不以moudle形式創(chuàng)建,而在項(xiàng)目中創(chuàng)建一個(gè)plugins目錄,然后new -> new flutter project -> flutter plugin,以項(xiàng)目的形式創(chuàng)建一個(gè)plugin,而這個(gè)plugin的項(xiàng)目路徑選在新創(chuàng)建的plugins目錄下。

在該項(xiàng)目中,這個(gè)plugin中的android目錄還是無法按android編譯,但是我們可以單獨(dú)打開這個(gè)plugin的工程,這樣就正常編譯了。

而在主項(xiàng)目中,這個(gè)plugin會被自動(dòng)識別的,所以我們只要修改依賴即可

dependencies:flutter:sdk: flutter...flutter_core:path: plugins/flutter_core

plugin中kotlin編譯問題

上面我們以工程的方式打開plugin,其下的android代碼就可以正常編譯使用了。但是還有另外一個(gè)問題,我們發(fā)現(xiàn)kotlin還無法編譯使用,也就是或kotlin標(biāo)準(zhǔn)的api,比如let函數(shù)找不到,直接報(bào)錯(cuò)。

經(jīng)過對比發(fā)現(xiàn)在plugin的根目錄下的.idea/libraries目錄下缺少KotlinJavaRuntime.xml這個(gè)文件。這個(gè)文件在pliugin的example項(xiàng)目中有,可以拷貝一份過來

然后重新打開plugin的工程,發(fā)先kotlin代碼可以正常編譯使用了。

添加前,在依賴列表External Libraries中 image 沒有KotlinJavaRuntime,添加后就出現(xiàn)了,這樣我們才可以使用kotlin標(biāo)準(zhǔn)庫

plugin中android代碼如何獲得context?

plugin的作用就是有原生實(shí)現(xiàn)一個(gè)功能,然后與flutter進(jìn)行交互。

那么在plugin中要實(shí)現(xiàn)一個(gè)安卓的功能,不可避免的需要用到Context,因?yàn)楹艽笠徊糠謅ndroid api都需要它。

但是在plugin中,因?yàn)槿肟诓皇莂ctivity也是application,那么這個(gè)context我們怎么獲取?

我們創(chuàng)建plugin后,會看到在其下的Android目錄中自動(dòng)創(chuàng)建了一個(gè)類

public class XXXX: FlutterPlugin, MethodCallHandler {override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {val channel = MethodChannel(flutterPluginBinding.getFlutterEngine().getDartExecutor(), "flutter_xxx")channel.setMethodCallHandler(XXXX());}companion object {@JvmStaticfun registerWith(registrar: Registrar) {val channel = MethodChannel(registrar.messenger(), "flutter_xxx")channel.setMethodCallHandler(XXXX())}}override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {when(call.method){"getPlatformVersion" -> result.success("Android ${android.os.Build.VERSION.RELEASE}")else -> result.notImplemented()}}override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {} }

這個(gè)類繼承FlutterPlugin這個(gè)抽象類,實(shí)現(xiàn)了onAttachedToEngine這個(gè)函數(shù),通過函數(shù)名可以知道它會最開始執(zhí)行。

它的參數(shù)是FlutterPlugin.FlutterPluginBinding,這個(gè)對象里就有我們需要的context,我們可以新建一個(gè)static變量來保存它,如下

public class XXXX: FlutterPlugin, MethodCallHandler {override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {mContext = flutterPluginBinding.applicationContext...}companion object {var mContext : Context? = null...}... }

這樣我們在plugin中就可以隨時(shí)使用context了。

關(guān)注公眾號:BennuCTech,發(fā)送“電子書”獲取經(jīng)典電子資料。

總結(jié)

以上是生活随笔為你收集整理的Flutter入门:application、module、package、plugin的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。