Flutter1.12android端升級適配

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章