Flutter1.12官方做了很多修改,有一些是break change.
少兒詞典中,通過將flutter工程添加到現有android工程的形式來使用Flutter.\
version < 1.12時,少兒詞典Flutter工程的封裝如下:
1、Flutter頁面的構建。
直接構建FlutterView,然後將flutterview添加到佈局文件中
import io.flutter.facade
val flutterView = Flutter.createView(
activity,
lifecycle ?: activity.lifecycle,
pageInfo.toString()
)
viewgroup.addview(flutterView)
2、Flutter工程的編譯打包。
1、編譯構建flutter工程:./gradlew assembleRelease
2、解壓構建出來的apk及aar.(apk是自己的項目生成的,aar是第三方插件生成的)
3、將解壓出來的各個文件,分類規整到一個新的aar中。
4、將整合的aar複製到少兒詞典android項目中,並作爲依賴。
version1.12升級需要做的適配工作
1、Flutter頁面的構建。
包io.flutter.facade不再暴露,所以api Flutter.createView()已失效。flutter官方已經不再建議使用flutter view來構建試圖,建議通過FlutterFragment或者FlutterActivity的形式來構建Flutter頁面,少兒詞典選擇了FlutterFragment的形式來構建Flutter頁面。
val newFragment = FlutterFragment.withNewEngine().initialRoute(pageInfo.toString())
.build<FlutterFragment>()
var methodChannel:MethodChannel? = null
activity.supportFragmentManager.registerFragmentLifecycleCallbacks(object :
FragmentManager.FragmentLifecycleCallbacks(){
override fun onFragmentAttached(fm: FragmentManager, attachedFragment: Fragment, context: Context) {
super.onFragmentAttached(fm, attachedFragment, context)
if(attachedFragment is FlutterFragment){
methodChannel = MethodChannel(attachedFragment.flutterEngine?.dartExecutor, METHOD_CHANNEL_NAME).also {
it.setMethodCallHandler { methodCall, result ->
YLog.d(TAG, methodCall.toString()+result.toString())
when (methodCall.method) {
"popFlutter" -> {
activity.finish()
result.success("messageReturnToFlutter")
}
………………一些method
}
}
}
}
}
},false)
構建flutterview的同時,還需要構建對應的MethodChannel,用於Flutter調用原生的接口,構建MethodChanne對象,一個必要參數是BinaryMessenger,而只有flutterengine中才有一個實現了BinaryMessenger接口的變量,而flutterengine必須是FlutterFragment attach到Activity後纔會初始化,這就是要將使用FlutterFragment的Activity通過參數傳進來,並註冊registerFragmentLifecycleCallbacks的原因。
2、Flutter工程的編譯打包。
1.12以後,flutter工程作爲依賴被打包到主工程中就簡單很多了,flutter官方提供了打包命令
flutter build aar //用於構建出aar,並添加到原生android工程
flutter build apk //直接構建一個flutter apk
當打包完成後,flutter工程的gradle腳本會自動生成一個aar,這個aar集成了所有的項目代碼以及第三方插件的代碼,併發布到本地的一個maven倉庫。我們需要做的是,在主工程中添加這個本地maven倉庫依賴即可。
1、譬如少兒詞典的flutter工程構建腳本如下:
function mkDirNotExist() {
if [[ ! -d $1 ]]; then
mkdir -p $1
fi
}
flutter clean
flutter build aar
base_path=$PWD
repoPath=$PWD"/build/host/outputs/repo/"
dest="../kid-dict-android/flutter_repo/"
rm -fr $dest
mkDirNotExist $dest
cp -fr $repoPath $dest #將打包出來的repo目錄拷貝到少兒詞典android工程的flutter_repo目錄
echo "build aar成功,已拷貝至 $dest "
2、將flutter_repo目錄添加到少兒詞典android工程的gradle repositories中
allprojects {
repositories {
google()
jcenter()
maven {
url "$rootProject.projectDir/flutter_repo"
}
…………
}
}
參考資料鏈接:https://flutter.dev/docs/development/add-to-app/android/project-setup