美文网首页
flutter七android原生打开flutter页面-不可发

flutter七android原生打开flutter页面-不可发

作者: crossroads | 来源:发表于2024-11-19 17:42 被阅读0次

前言

这里以原生有多个入口,打开不同的flutter页面作示例。且使用FlutterFragment 。如果不需要,直接看flutter接入现有app即可。当然看下面的代码前,也建议先看下这个网址,网址有的就不讲了。

一. 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 实例,并通过资源共享来优化性能和内存使用,同时保持模块化设计

  1. 一个全局变量
    private var enginGrouping: FlutterEngineGroup? = null
  1. 在application中预加载一个空的flutter ,可以加快速度,在application onCreate调用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就看前言的网址就行,太长了。
  private fun addFlutterView(
        pageName: String
    ) {
        // 调用封装的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与原生的交互网址借鉴

app只有一个入口打开一个flutter主页面
app多个入口打开flutter页面1
app多个入口打开flutter页面2

相关文章

网友评论

      本文标题:flutter七android原生打开flutter页面-不可发

      本文链接:https://www.haomeiwen.com/subject/qlflzdtx.html