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