為您解碼網(wǎng)站建設(shè)的點(diǎn)點(diǎn)滴滴
發(fā)表日期:2018-05 文章編輯:小燈 瀏覽次數(shù):4867
這篇文章主要介紹了Flutter Plugin開發(fā)流程,包括如何利用Android Studio開發(fā)以及發(fā)布等。
今天這篇文章,給大家介紹如何開發(fā)Flutter Plugin中Android的部分。有關(guān)Flutter以及Flutter Plugin的概念,感興趣的可以從官網(wǎng)查看相關(guān)資料。
筆者的環(huán)境是Mac下Android Studio進(jìn)行的開發(fā),AS也是谷歌官推的,安裝flutter插件后,開發(fā)起來(lái)相對(duì)于其他IDE來(lái)說(shuō),方便很多,自帶了三種模板:
Plugin其實(shí)就是一個(gè)特殊的Package
。Flutter Plugin提供Android或者iOS的底層封裝,在Flutter層提供組件功能,使Flutter可以較方便的調(diào)取Native的模塊。很多平臺(tái)相關(guān)性或者對(duì)于Flutter實(shí)現(xiàn)起來(lái)比較復(fù)雜的部分,都可以封裝成Plugin。其原理如下
消息在client和host之間通過(guò)平臺(tái)通道(platform channels)來(lái)進(jìn)行的,之間的通訊都是異步
的。
直接在Android Studio中新建一個(gè)Flutter Plugin的工程,當(dāng)然也可以使用命令行來(lái)進(jìn)行,例如創(chuàng)建一個(gè)flutter_text_plugin。
flutter create --org com.example --plugin flutter_text_plugin
如果想支持swift或者kotlin,可以用如下命令進(jìn)行創(chuàng)建:
flutter create --org com.example --plugin -i swift -a kotlin flutter_text_plugin
更多的參數(shù)選項(xiàng),大家可以 查看幫助文檔,當(dāng)然還是比較推薦直接用AS進(jìn)行創(chuàng)建,簡(jiǎn)單直觀。用AS打開項(xiàng)目,可以看到項(xiàng)目的組織結(jié)構(gòu)
root android example ios lib ...
android以及ios文件夾是我們將要編寫插件的native層的地方,lib文件夾是編寫與native層映射的地方,native與flutter之間不能直接通信,必須通過(guò)MethodChannel來(lái)間接調(diào)用。example文件夾則是例子工程,編寫的插件可以直接在這個(gè)項(xiàng)目中進(jìn)行驗(yàn)證。在本文中,我們主要在android目錄下進(jìn)行,也就是android部分。
用AS打開flutter_text_plugin/android項(xiàng)目,這樣子開發(fā)起來(lái)比較方便。但是打開過(guò)后,會(huì)發(fā)現(xiàn)出現(xiàn)了很多錯(cuò)誤,提示找不到flutter相關(guān)的東西,我們仔細(xì)看這個(gè)項(xiàng)目,會(huì)發(fā)現(xiàn)跟我們平時(shí)用AS建的Android項(xiàng)目有所不同,少了很多部分,目錄也有所不同。這是因?yàn)檫@個(gè)android項(xiàng)目不需要能夠直接去運(yùn)行,因此減少了很多東西。但是對(duì)于初次接觸的人來(lái)說(shuō),可能是一頭懵逼,例如該如何添加第三方庫(kù),如何添加proguard rule等等。
android插件工程是沒(méi)有引入flutter庫(kù)的,所以才會(huì)出現(xiàn)錯(cuò)誤提示,我們?cè)陧?xiàng)目根目錄建立一個(gè)libs文件夾,用來(lái)存放flutter庫(kù)。
flutter庫(kù)就在我們的flutter sdk中,路徑如下
<SDK Project>/bin/cache/artifacts/engine
engine下面包含了各種平臺(tái)的flutter庫(kù),我們隨便拷貝一個(gè)Android平臺(tái)的庫(kù)到libs文件夾下,右鍵flutter.jar,彈出菜單選擇Add As Library...
。
經(jīng)過(guò)這一步,項(xiàng)目中不會(huì)再報(bào)錯(cuò)了,但是,由于整個(gè)flutter plugin包含了flutter庫(kù),因此不能只是簡(jiǎn)單的添加就了事了,點(diǎn)擊菜單Project Structure...
,找到flutter_text_plugin的Dependencies中,將flutter庫(kù)的Scope從Implementation改成Compile Only
。至此,引入flutter庫(kù)的工作完成了,可以進(jìn)行插件的編寫操作了。
添加第三方庫(kù)有兩種,一種是jar包引入,另一種通過(guò)gradle的方式進(jìn)行。由于進(jìn)行了第一步flutter庫(kù)的引入,這一步就簡(jiǎn)單多了。查看build.gradle文件,可以看到最下面出現(xiàn)了如下的信息。
dependencies { compileOnly files('libs/flutter.jar') }
看到這個(gè),是不是就明朗多了,添加靜態(tài)庫(kù)以及添加在線庫(kù)都可以在這個(gè)地方進(jìn)行。例如我添加一個(gè)bugly靜態(tài)庫(kù)以及okhttp3庫(kù):
dependencies { compileOnly files('libs/flutter.jar') implementation 'com.squareup.okhttp3:okhttp:3.10.0' implementation files('libs/bugly_crash_release.jar') }
由于了bugly以及okhttp3庫(kù),因此需要添加progurad rule。我們發(fā)現(xiàn)項(xiàng)目中沒(méi)有proguard-rules.pro文件,因此這一步也需要我們自己去創(chuàng)建,在根目錄下,建立proguard-rules.pro文件,將混淆規(guī)則添加進(jìn)去,然后修改build.gradle文件,添加如下信息,跟普通Android項(xiàng)目差不多:
buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
添加了bugly以及okhttp3庫(kù),需要對(duì)應(yīng)的權(quán)限申明,才能正常運(yùn)行。直接在manifest文件下,添加對(duì)應(yīng)的權(quán)限
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_LOGS"/>
至此,準(zhǔn)備工作都已就緒,你可以把這個(gè)項(xiàng)目當(dāng)做一個(gè)獨(dú)立的Android項(xiàng)目,在上面進(jìn)行各種封裝操作,然后在FlutterTestPlugin文件下,將接口暴露出來(lái)。通過(guò)platform channels與flutter層關(guān)聯(lián)起來(lái)。
當(dāng)插件開發(fā)完畢,可以將插件發(fā)布讓其他人使用,在發(fā)布之前,確保pubspec.yaml,、README.md以及CHANGELOG.md文件的內(nèi)容都正確填寫完畢??梢酝ㄟ^(guò)dry-run命令來(lái)看準(zhǔn)備是否就緒。
flutter packages pub publish --dry-run
檢查無(wú)誤后,可以執(zhí)行下面的命令,發(fā)布到Pub上。
flutter packages pub publish
對(duì)插件的引用有兩種,已經(jīng)發(fā)布的和未發(fā)布的。
flutter項(xiàng)目的很多資源管理都在根目錄的pubspec.yaml下面,類似于js中的一些包管理一樣,在dependencies
加上我們需要引入的庫(kù),例如引入url_launcher庫(kù):
dependencies: url_launcher: ^0.4.2
如果這個(gè)庫(kù)包含了一些平臺(tái)相關(guān)的東西,例如需要在native層進(jìn)行使用的話,則需要在對(duì)應(yīng)的native項(xiàng)目單獨(dú)做引用。
修改android/build.gradle的dependencies處做引用:
dependencies { provided rootProject.findProject(":url_launcher") }
修改ios/hello.podspec文件
Pod::Spec.new do |s| # lines skipped s.dependency 'url_launcher'
引用不同的庫(kù)可能會(huì)導(dǎo)致一些沖突,例如A和B兩個(gè)插件,都包含了C插件,但是所需的版本不同。因此我們可以采取以下措施避免這種問(wèn)題:
引用未發(fā)布的庫(kù)有兩種方式,通過(guò)本地路徑和git地址的方式:
這種方式主要針對(duì)本地的未發(fā)布的庫(kù),引用的路徑可以是相對(duì)或者絕對(duì)路徑。
dependencies: plugin1: path: ../plugin1/
這種方式針對(duì)存放在git上的庫(kù),其中path是可選的,可以定位到某個(gè)子目錄
dependencies: package1: git: url: git://github.com/flutter/packages.git path: packages/package1
筆者新建了一個(gè)flutter學(xué)習(xí)相關(guān)的項(xiàng)目,github地址,里面包含了筆者寫的關(guān)于flutter學(xué)習(xí)相關(guān)的一些文章,后期也會(huì)定期更新,也會(huì)上傳一些學(xué)習(xí)demo,歡迎大家關(guān)注。
日期:2018-10 瀏覽次數(shù):7265
日期:2018-12 瀏覽次數(shù):4341
日期:2018-07 瀏覽次數(shù):4889
日期:2018-12 瀏覽次數(shù):4186
日期:2018-09 瀏覽次數(shù):5512
日期:2018-12 瀏覽次數(shù):9934
日期:2018-11 瀏覽次數(shù):4821
日期:2018-07 瀏覽次數(shù):4593
日期:2018-05 瀏覽次數(shù):4866
日期:2018-12 瀏覽次數(shù):4334
日期:2018-10 瀏覽次數(shù):5148
日期:2018-12 瀏覽次數(shù):6225
日期:2018-11 瀏覽次數(shù):4478
日期:2018-08 瀏覽次數(shù):4601
日期:2018-11 瀏覽次數(shù):12652
日期:2018-09 瀏覽次數(shù):5593
日期:2018-12 瀏覽次數(shù):4846
日期:2018-10 瀏覽次數(shù):4200
日期:2018-11 瀏覽次數(shù):4539
日期:2018-12 瀏覽次數(shù):6075
日期:2018-06 瀏覽次數(shù):4016
日期:2018-08 瀏覽次數(shù):5448
日期:2018-10 瀏覽次數(shù):4465
日期:2018-12 瀏覽次數(shù):4544
日期:2018-07 瀏覽次數(shù):4370
日期:2018-12 瀏覽次數(shù):4508
日期:2018-06 瀏覽次數(shù):4397
日期:2018-11 瀏覽次數(shù):4385
日期:2018-12 瀏覽次數(shù):4258
日期:2018-12 瀏覽次數(shù):5296
Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.