flutter七android原生打開flutter頁面-不可發(fā)布

前言

這里以原生有多個入口,打開不同的flutter頁面作示例。且使用FlutterFragment 。如果不需要,直接看flutter接入現(xiàn)有app即可。當然看下面的代碼前,也建議先看下這個網(wǎng)址,網(wǎng)址有的就不講了。

一. flutter

void main() => runApp(A());

@pragma('vm:entry-point')
void openBPage() => runApp(B());

@pragma('vm:entry-point')
void openAPage() => runApp(A());

二.原生
這里使用FlutterEngineGroup

FlutterEngine 用于單個 Flutter 實例,而 FlutterEngineGroup 則用于管理多個 Flutter 實例,并通過資源共享來優(yōu)化性能和內(nèi)存使用,同時保持模塊化設(shè)計

  1. 一個全局變量
    private var enginGrouping: FlutterEngineGroup? = null
  1. 在application中預(yù)加載一個空的flutter ,可以加快速度,在application onCreate調(diào)用initFlutter。
 fun cachePage(
        applicationContext: Context,
        pageName: String//例如上述的openAPage 就是一個名字
    ) {
      if (enginGrouping == null) {
            enginGrouping = FlutterEngineGroup(context)
        }
        val flutterEngine = enginGrouping!.createAndRunEngine(
            applicationContext, DartExecutor.DartEntrypoint(
               FlutterInjector.instance().flutterLoader().findAppBundlePath(),
                pageName
            )
        )
 
        FlutterEngineCache.getInstance().put(pageName, flutterEngine)
    }
  1. 在activity中添加FlutterFragment ,生命周期的override就看前言的網(wǎng)址就行,太長了。
  private fun addFlutterView(
        pageName: String
    ) {
        // 調(diào)用封裝的cachePage
        XX.cachePage(
            this.applicationContext,
            pageName
        )
        flutterFragment = FlutterFragment.withCachedEngine(pageName).build()
        supportFragmentManager
            .beginTransaction()
            .replace(R.id.fragment_container, flutterFragment!!)
            .commitAllowingStateLoss()
    }
  1. 使用methodChannel可以進行 Flutter 與原生交互
    dart
static const MethodChannel channel = MethodChannel('xxChannel');
    try {
   final   result = await channel.invokeMethod('methodName', {"xx": true});
    } catch (e) {
    }
  1. 封裝好的methodChannel整體如下
 fun cachePage(
        applicationContext: Context,
        pageName: String,
        pageChannel: String? = null,
        activity: BaseActivity? = null,
    ) {
        if (enginGrouping == null) {
            enginGrouping = FlutterEngineGroup(applicationContext)
        }
        val flutterEngine = enginGrouping!!.createAndRunEngine(
            applicationContext, DartExecutor.DartEntrypoint(
                FlutterInjector.instance().flutterLoader().findAppBundlePath(),
                pageName
            )
        )
         FlutterXXPageCallNative.registerWith(
                       flutterEngine.dartExecutor,
                    pageChannel,
                    activity
                )
        FlutterEngineCache.getInstance().put(pageName, flutterEngine)
    }

abstract class AbstractFlutterCallNative(
    messenger: BinaryMessenger,
    channelName: String,
    val activity: BaseActivity?
) : DefaultLifecycleObserver {
    private val channel = MethodChannel(messenger, channelName)

    init {
        registerLifecycle(activity)//需要生命周期
        channel.setMethodCallHandler { p0, p1 -> methodCallHandle(p0, p1) }
    }

    abstract fun methodCallHandle(call: MethodCall, result: MethodChannel.Result)

    fun invokeMethod(method: String, arguments: Any? = null, result: MethodChannel.Result? = null) {
        channel.invokeMethod(method, arguments, result)
    }

    fun registerLifecycle(lifecycleOwner: LifecycleOwner?) {
        lifecycleOwner?.lifecycle?.addObserver(this)
    }

    override fun onResume(owner: LifecycleOwner) {
        EventBusHelper.register(this)
    }

    override fun onPause(owner: LifecycleOwner) {
        EventBusHelper.unregister(this)
    }

    @Suppress("UNUSED_PARAMETER")
    @Subscribe(threadMode = ThreadMode.MAIN)
    fun onEvent(event: DefaultEvent) {
    }
}
class FlutterxxCallNative(
    messenger: BinaryMessenger,
    channelName: String,
    activity: BaseActivity?
) : AbstractFlutterCallNative(messenger, channelName, activity) {

    override fun onDestroy(owner: LifecycleOwner) {
        super.onDestroy(owner)
      ...
    }

    override fun methodCallHandle(call: MethodCall, result: MethodChannel.Result) {
        when (call.method) {
   ...
        }
    }

    companion object {
        fun registerWith(
            messenger: BinaryMessenger?,
            channelName: String,
            activity: BaseActivity?
        ) {
            if (messenger != null) {
                FluttexxCallNative(messenger, channelName, activity)
            }
        }
    }
}

flutter與原生的交互網(wǎng)址借鑒

app只有一個入口打開一個flutter主頁面
app多個入口打開flutter頁面1
app多個入口打開flutter頁面2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容