天天看點

android原生項目內建flutter子產品

android原生項目內建flutter子產品

  • 建立flutter子產品
使用android studio,File->New->New Flutter Project...->Flutter Module->Next->Next->Finish,即可完成,期間可以修改包名、項目名稱等。      
  • 配置settings.gradle
setBinding(new Binding(gradle: this))
evaluate(new File(settingsDir.parent, "fluttermodule/.android/include_flutter.groovy"))      //fluttermodule是flutter子產品項目名稱      
  • 配置build.gradle
//flutter是預設子產品名稱,具體看build/outputs/aar下的aar包名稱,可以通過settings.gradle裡的include(':test')和 project(':test').projectDir = new File('項目路徑')修改名稱為test并指定項目路徑
api project(path: ':flutter')      
  • 代碼
//BaseActivity必須繼承AppCompatActivity,才有ActivityLifeCycle。
class FlutterTestActivity : BaseActivity() {
    override fun setLayout() = R.layout.m_activity_flutter_test
    
    private val flutterEngineId = "flutterEngineId"
    private var engine: FlutterEngine? = null

    override fun initView(view: View) {
        setToolbarTitle("flutter測試頁面")
        engine = FlutterEngineCache.getInstance().get(flutterEngineId)
        if (engine == null) {
            engine = FlutterEngine(this)
            engine?.dartExecutor?.executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault())
            FlutterEngineCache.getInstance().put(flutterEngineId, engine)
        }
        val view = createFlutterView()
        view.attachToFlutterEngine(engine!!)
    }

    private fun createFlutterView(): FlutterView {
        val flutterView = FlutterView(this)      //預設加載flutter側的main.dart檔案
        val params = FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
        binding.flContain.addView(flutterView, params)
        return flutterView
    }

    override fun initEvent() {
    }

    override fun createPresenter() = FlutterTestPresenter()

    override fun onResume() {
        super.onResume()
        engine?.lifecycleChannel?.appIsResumed()
    }

    override fun onPause() {
        super.onPause()
        engine?.lifecycleChannel?.appIsInactive()
    }

    override fun onStop() {
        super.onStop()
        engine?.lifecycleChannel?.appIsPaused()
    }

}