1. 使用FlutterEngine和FlutterView可以简单的将flutter 页面嵌入原生,但是会有问题
      1. 一次只能加载一个dart入口
      2. 原生加载flutter引擎需要消耗性能, 需要实现秒开

    所以使用一个FlutterCacheManager来管理所有的flutter engine

    1. package org.devio.`as`.proj.common.flutter
    2. import android.content.Context
    3. import android.os.Looper
    4. import io.flutter.embedding.engine.FlutterEngine
    5. import io.flutter.embedding.engine.FlutterEngineCache
    6. import io.flutter.embedding.engine.dart.DartExecutor
    7. import io.flutter.view.FlutterMain
    8. /**
    9. * Flutter 优化提升加载速度 实现秒开flutter模块
    10. * 1.预加载不损失首页性能
    11. * 2.实例化多个flutter引擎,并分别加载不同的dart入口文件
    12. */
    13. class FlutterCacheManager private constructor() {
    14. //preload
    15. fun preload(context: Context) {
    16. // 在空闲线程里预加载flutter引擎 不会影响原生页面加载
    17. Looper.myQueue().addIdleHandler {
    18. initFlutterEngine(context, MODULE_NAME_FAVORITE)
    19. initFlutterEngine(context, MODULE_NAME_RECOMMEND)
    20. false // 执行完之后出队列
    21. }
    22. }
    23. // 获取flutter engine
    24. fun getCachedFlutterEngine(moduleName: String, context: Context?): FlutterEngine {
    25. var engine = FlutterEngineCache.getInstance()[moduleName]
    26. if (engine == null && context != null) {
    27. engine = initFlutterEngine(context, moduleName)
    28. }
    29. return engine!!
    30. }
    31. // init
    32. private fun initFlutterEngine(context: Context, moduleName: String): FlutterEngine {
    33. val flutterEngine = FlutterEngine(context)
    34. flutterEngine.dartExecutor.executeDartEntrypoint(
    35. DartExecutor.DartEntrypoint(
    36. FlutterMain.findAppBundlePath(),
    37. moduleName
    38. )
    39. )
    40. FlutterEngineCache.getInstance().put(moduleName, flutterEngine)
    41. return flutterEngine
    42. }
    43. companion object {
    44. // 对应dart端的endpoint
    45. const val MODULE_NAME_FAVORITE = "main"
    46. const val MODULE_NAME_RECOMMEND = "recommend"
    47. @JvmStatic
    48. @get: Synchronized
    49. var instance: HiFlutterCacheManager? = null
    50. get() {
    51. if (field == null) {
    52. field = HiFlutterCacheManager()
    53. }
    54. return field
    55. }
    56. private set
    57. }
    58. }
    1. package org.devio.`as`.proj.common.flutter
    2. import android.content.Context
    3. import android.os.Bundle
    4. import android.view.View
    5. import android.view.ViewGroup
    6. import android.widget.FrameLayout
    7. import io.flutter.embedding.android.FlutterTextureView
    8. import io.flutter.embedding.android.FlutterView
    9. import io.flutter.embedding.engine.FlutterEngine
    10. import org.devio.`as`.proj.common.R
    11. import org.devio.`as`.proj.common.ui.component.HiBaseFragment
    12. import org.devio.`as`.proj.util.AppGlobals
    13. abstract class HiFlutterFragment : HiBaseFragment() {
    14. private val flutterEngine: FlutterEngine?
    15. private var flutterView: FlutterView? = null
    16. abstract val moduleName: String?
    17. init {
    18. // 在此处获取flutterEngin
    19. flutterEngine =
    20. HiFlutterCacheManager.instance!!.getCachedFlutterEngine(moduleName!!, AppGlobals.get())
    21. }
    22. override fun getLayoutId(): Int {
    23. return R.layout.fragment_flutter
    24. }
    25. override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    26. super.onViewCreated(view, savedInstanceState)
    27. val lp: FrameLayout.LayoutParams = FrameLayout.LayoutParams(
    28. ViewGroup.LayoutParams.MATCH_PARENT,
    29. ViewGroup.LayoutParams.MATCH_PARENT
    30. )
    31. (layoutView as ViewGroup).addView(createFlutterView(activity!!), lp)
    32. }
    33. // 核心代码 将flutterView add 到页面中
    34. private fun createFlutterView(context: Context): FlutterView {
    35. val flutterTextureView = FlutterTextureView(activity!!)
    36. flutterView = FlutterView(context, flutterTextureView)
    37. return flutterView!!
    38. }
    39. override fun onStart() {
    40. flutterView!!.attachToFlutterEngine(flutterEngine!!)
    41. super.onStart()
    42. }
    43. override fun onResume() {
    44. super.onResume()
    45. flutterEngine!!.lifecycleChannel.appIsResumed()
    46. }
    47. override fun onPause() {
    48. super.onPause()
    49. flutterEngine!!.lifecycleChannel.appIsInactive()
    50. }
    51. override fun onDetach() {
    52. super.onDetach()
    53. flutterEngine!!.lifecycleChannel.appIsDetached()
    54. }
    55. override fun onStop() {
    56. super.onStop()
    57. flutterEngine!!.lifecycleChannel.appIsPaused()
    58. }
    59. // override fun onDestroy() {
    60. // try {
    61. // super.onDestroy()
    62. // } catch (e: Exception) {
    63. //
    64. // }
    65. // }
    66. }