- 使用FlutterEngine和FlutterView可以简单的将flutter 页面嵌入原生,但是会有问题
- 一次只能加载一个dart入口
- 原生加载flutter引擎需要消耗性能, 需要实现秒开
所以使用一个FlutterCacheManager来管理所有的flutter engine
package org.devio.`as`.proj.common.flutterimport android.content.Contextimport android.os.Looperimport io.flutter.embedding.engine.FlutterEngineimport io.flutter.embedding.engine.FlutterEngineCacheimport io.flutter.embedding.engine.dart.DartExecutorimport io.flutter.view.FlutterMain/*** Flutter 优化提升加载速度 实现秒开flutter模块* 1.预加载不损失首页性能* 2.实例化多个flutter引擎,并分别加载不同的dart入口文件*/class FlutterCacheManager private constructor() {//preloadfun preload(context: Context) {// 在空闲线程里预加载flutter引擎 不会影响原生页面加载Looper.myQueue().addIdleHandler {initFlutterEngine(context, MODULE_NAME_FAVORITE)initFlutterEngine(context, MODULE_NAME_RECOMMEND)false // 执行完之后出队列}}// 获取flutter enginefun getCachedFlutterEngine(moduleName: String, context: Context?): FlutterEngine {var engine = FlutterEngineCache.getInstance()[moduleName]if (engine == null && context != null) {engine = initFlutterEngine(context, moduleName)}return engine!!}// initprivate fun initFlutterEngine(context: Context, moduleName: String): FlutterEngine {val flutterEngine = FlutterEngine(context)flutterEngine.dartExecutor.executeDartEntrypoint(DartExecutor.DartEntrypoint(FlutterMain.findAppBundlePath(),moduleName))FlutterEngineCache.getInstance().put(moduleName, flutterEngine)return flutterEngine}companion object {// 对应dart端的endpointconst val MODULE_NAME_FAVORITE = "main"const val MODULE_NAME_RECOMMEND = "recommend"@JvmStatic@get: Synchronizedvar instance: HiFlutterCacheManager? = nullget() {if (field == null) {field = HiFlutterCacheManager()}return field}private set}}
package org.devio.`as`.proj.common.flutterimport android.content.Contextimport android.os.Bundleimport android.view.Viewimport android.view.ViewGroupimport android.widget.FrameLayoutimport io.flutter.embedding.android.FlutterTextureViewimport io.flutter.embedding.android.FlutterViewimport io.flutter.embedding.engine.FlutterEngineimport org.devio.`as`.proj.common.Rimport org.devio.`as`.proj.common.ui.component.HiBaseFragmentimport org.devio.`as`.proj.util.AppGlobalsabstract class HiFlutterFragment : HiBaseFragment() {private val flutterEngine: FlutterEngine?private var flutterView: FlutterView? = nullabstract val moduleName: String?init {// 在此处获取flutterEnginflutterEngine =HiFlutterCacheManager.instance!!.getCachedFlutterEngine(moduleName!!, AppGlobals.get())}override fun getLayoutId(): Int {return R.layout.fragment_flutter}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)val lp: FrameLayout.LayoutParams = FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT)(layoutView as ViewGroup).addView(createFlutterView(activity!!), lp)}// 核心代码 将flutterView add 到页面中private fun createFlutterView(context: Context): FlutterView {val flutterTextureView = FlutterTextureView(activity!!)flutterView = FlutterView(context, flutterTextureView)return flutterView!!}override fun onStart() {flutterView!!.attachToFlutterEngine(flutterEngine!!)super.onStart()}override fun onResume() {super.onResume()flutterEngine!!.lifecycleChannel.appIsResumed()}override fun onPause() {super.onPause()flutterEngine!!.lifecycleChannel.appIsInactive()}override fun onDetach() {super.onDetach()flutterEngine!!.lifecycleChannel.appIsDetached()}override fun onStop() {super.onStop()flutterEngine!!.lifecycleChannel.appIsPaused()}// override fun onDestroy() {// try {// super.onDestroy()// } catch (e: Exception) {//// }// }}
