前言
这里以原生有多个入口,打开不同的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 实例,并通过资源共享来优化性能和内存使用,同时保持模块化设计
- 一个全局变量
private var enginGrouping: FlutterEngineGroup? = null
- 在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)
}
- 在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()
}
- 使用methodChannel可以进行 Flutter 与原生交互
dart
static const MethodChannel channel = MethodChannel('xxChannel');
try {
final result = await channel.invokeMethod('methodName', {"xx": true});
} catch (e) {
}
- 封装好的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
网友评论