alibaba / alibaba/flutter_boost
[Bug]: Android viewpager2加载flutterboostfragment,切换flutterboostfragment会有短暂白屏
- Dominant language
- Dart
- Stars
- 7.2k
- Forks
- 1.3k
- PR merge metrics
- No merged PRs in 30d
Description
### 请描述遇到的问题,以及您所期望的正确的结果
用viewpager2加载flutterboostfragment,并缓存所有页面,回到桌面再回来,或者打开一个二级页面再回来,第一次切换各个tab会有短暂白屏
### 请说明如何操作会遇到上述问题
1.所有tab切换一遍,缓存生效后,进入桌面,再回到app,用户数据未丢失,flutter页面也没重绘,但切换tab会闪一下,在用的安卓测试机都能复现。
2.用原始的flutterfragment并没有这个问题,目前发现flutterfragment默认使用surface模式,而boost用的是texture模式。具体原因尚未定位到,可能跟渲染模式也没关系。
### 在下面填入关键复现代码
```
class MainActivity : FragmentActivity() {
private lateinit var viewPager: ViewPager2
private lateinit var bottomNav: BottomNavigationView
private val mFragments = ArrayList()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_app_home)
viewPager = findViewById(R.id.vp_main)
bottomNav = findViewById(R.id.bottom_navigation)
mFragments.add(createFragment("page1"))
mFragments.add(createFragment("page2"))
mFragments.add(createFragment("page3"))
mFragments.add(createFragment("page4"))
viewPager.adapter = object : FragmentStateAdapter(this) {
override fun createFragment(position: Int): Fragment {
return mFragments[position]
}
override fun getItemCount(): Int {
return mFragments.size
}
}
// 可选:预加载所有页面避免白屏
viewPager.offscreenPageLimit = 4
viewPager.isUserInputEnabled = false // 设置是否响应用户滑动
// BottomNav 点击时同步 ViewPager
bottomNav.setOnItemSelectedListener { item ->
when (item.itemId) {
R.id.main -> viewPager.setCurrentItem(0, false)
R.id.gimi -> viewPager.setCurrentItem(1, false)
R.id.study -> viewPager.setCurrentItem(2, false)
R.id.mine -> viewPager.setCurrentItem(3, false)
}
true
}
// ViewPager 滑动时同步 BottomNav
viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
bottomNav.selectedItemId = when (position) {
0 -> R.id.main
1 -> R.id.gimi
2 -> R.id.study
else -> R.id.mine
}
}
})
}
fun createFragment(path: String) : FlutterFragment {
return FlutterBoostFragment.CachedEngineFragmentBuilder(FlutterBoostFragment::class.java)
.url(path)
.shouldAttachEngineToActivity(true)
.build()
}
}
```
### 复现的平台
Android
### Flutter SDK版本
3.10.6
### FlutterBoost版本
4.6.3
### 是否延迟初始化FlutterBoost
No
### 解决方案
Contributor guide
No contributing guide indexed for this repository
Research direction
Start with the MainActivity example using ViewPager2, FragmentStateAdapter, and FlutterBoostFragment.CachedEngineFragmentBuilder. Reproduce the brief white screen after returning from the desktop or a secondary page, then compare it with the reported FlutterFragment surface mode versus FlutterBoost texture mode on Android using Flutter SDK 3.10.6 and FlutterBoost 4.6.3. Done means identifying and fixing the tab-switch rendering gap without losing page state.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- android, dart, kotlin
- Domain
- mobile
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100