Flutter入门:application、module、package、plugin
我們用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_coreplugin中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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flutter入门:dart基础
- 下一篇: Flutter入门:自定义dialog