flutter解决混合工程卡屏

背景:原生工程有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 时指定 RenderModetexture

// With a cached FlutterEngine.
val flutterFragment = FlutterFragment.withCachedEngine("my_engine_id")
    .renderMode(FlutterView.RenderMode.texture)
    .build()

参照代码:当我们在设置为renderMode(FlutterView.RenderMode.texture)即可解决。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容