背景:原生工程有5个tab,决定把第一个tab使用flutter开发,开发完成后测试发现,oppo手机android13,从第一个tab切换到第5个tab,第个1页面会有一小部分卡在屏幕上,从后台打开时,tab高亮在第5个上,但页面却完整显示第1个flutter页面。
以下是代码片段,在已有的activity中添加一个生成fragment中方法:
class MyFlutterActivity : FlutterActivity() {
fun withCachedFragmentEngine(
context: Context,
engineId: String
): FlutterFragment.CachedEngineFragmentBuilder {
this.engineId = engineId
(context.applicationContext as MyApplication).cacheFlutterEngine(engineId)
return FlutterFragment.CachedEngineFragmentBuilder(
FlutterFragment::class.java,
engineId
)
}
}
// MyApplication
lateinit var group: FlutterEngineGroup
override fun onCreate() {
super.onCreate()
group = FlutterEngineGroup(this)
}
public fun cacheFlutterEngine(engineId: String) {
if (FlutterEngineCache.getInstance().get(engineId) == null) {
val flutterEngine: FlutterEngine
if (!engineId.isNullOrEmpty()) {
val dartEntrypoint =
DartExecutor.DartEntrypoint(
FlutterInjector.instance().flutterLoader().findAppBundlePath(), engineId
)
flutterEngine = group.createAndRunEngine(this, dartEntrypoint)
} else {
flutterEngine = group.createAndRunDefaultEngine(this)
}
FlutterEngineCache.getInstance().put(engineId, flutterEngine)
}
}
// MainActivity中
private val homeFlutterFragment: FlutterFragment by lazy {
MyFlutterActivity.withCachedFragmentEngine(
this,
"homeData"
)
.renderMode(RenderMode.texture) // 重要!!!!!
.build()
}
第一个tab的初始化使用的是:homeFlutterFragment,其他不说明了,ViewPager来控制多个Fragment显示。
控制 FlutterFragment
的渲染模式
FlutterFragment
可以选择使用 SurfaceView
或者 TextureView
来渲染其内容。默认配置的 SurfaceView
在性能上明显好于 TextureView
。然而,SurfaceView
无法插入到 Android 的 View
层级之中。 SurfaceView
在视图层级中必须是最底层的 View
或者最顶层的 View
。此外,在 Android N 之前,SurfaceView
无法用于制作动画,因为它们的布局和渲染无法和视图层级中的其它 View
同步。如果上述这些用例之一在你的应用需求之中,你需要使用 TextureView
替换 SurfaceView
。要选择 TextureView
,可以在构建 FlutterFragment
时指定 RenderMode
为 texture
// With a cached FlutterEngine.
val flutterFragment = FlutterFragment.withCachedEngine("my_engine_id")
.renderMode(FlutterView.RenderMode.texture)
.build()
参照代码:当我们在设置为renderMode(FlutterView.RenderMode.texture)即可解决。