之前项目里集成了flutter,由于我们的项目是单activity多fragment的结构(似乎google最近也开始疯狂推这个结构),理所当然的把flutterview嵌到一个fragment里。然后当渲染这个fragment的时候出现黑屏闪烁,这是由于flutterview是继承surfaceview的,surfaceview初次渲染的时候自然会产生黑屏。搜了一下解决方案可以通过setZOrderOnTop解决,然而当设置了zorder之后如果在当前fragment上再启动别的fragment会出现无效的情况。最后跟进surfaceview源码,发现只要把flutterview设置一个背景透明色就可以完美的解决这个问题。当然要配合 getWindow().setFormat(PixelFormat.TRANSLUCENT)。具体有机会后面再细说。
当这个问题解决之后我又遇到一个新的问题,那就是当我成功的从集成flutter页面的fragment跳转到原生的fragment后,再次跳转到flutter的fragment出现的却是上一次flutter页面的ui。仔细分析,感觉是surfaceview叠加导致的,因为虽然ui没有刷新,但是点击事件相关操作却是正常的。迫于时间毕竟紧,我找出了一个临时的work around方案,后续再继续跟进
override fun onResume() {
onResume()
placeHolderView.background = null
flutterView.visibility = View.VISIBLE
}
override fun onPause() {
onPause()
placeHolderView.background = BitmapDrawable(resources, flutterView.bitmap)
//这里post的原因是为了改善切换时候的闪烁
placeHolderView.post { flutterView.visibility = View.INVISIBLE }
}