前言
這里以原生有多個入口,打開不同的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è)計
- 一個全局變量
private var enginGrouping: FlutterEngineGroup? = null
- 在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)
}
- 在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()
}
- 使用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與原生的交互網(wǎng)址借鑒
app只有一個入口打開一個flutter主頁面
app多個入口打開flutter頁面1
app多個入口打開flutter頁面2