-
Notifications
You must be signed in to change notification settings - Fork 1.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Bug]: 连续 push 多个页面后返回,栈底页面会 rebuild,页面上的 Image 组件会闪烁一下重新加载图片,体验非常差。 #2034
Comments
iOS我并不熟悉,不过Image控件本身是有内存缓存的,如果有内存缓存,就算build应该也不会闪。可以试着增大下 另外我记得以前在iOS上,ViewController退出时,会触发Flutter层清理图片内存缓存,不知道这个问题还在不在,你可以关注下 |
测试下了,在 ViewController 创建时,ServicesBinding 会收到 systemMessage,type 是 memoryPressure,接着 flutter 侧触发 ImageCache.clear(); 看了下 flutter_boost 的创建逻辑,每次创建新的 controller 的时候,flutter_boost 会手动清理 engine.viewController 而这个逻辑导致了 engine 发送 memoryPressure 通知, |
那可以参考下面代码,自己管理内存缓存的清理 class FixImageWidgetBinding extends WidgetsFlutterBinding {
static WidgetsBinding ensureInitialized() {
if (WidgetsBinding.instance == null)
FixImageWidgetBinding();
return WidgetsBinding.instance!;
}
@override
ImageCache createImageCache() {
return FixImageCache();
}
}
class FixImageCache extends ImageCache {
@override
void clear() {
if (Platform.isIOS) {
//这里如果是iOS系统就不去做释放了
} else {
super.clear();
}
}
void clearForIOS() {
//调用父类的clear方法
super.clear();
}
} 在
|
那真正遇到内存压力的时候,图片反而得不到清理。或者我要写一些逻辑来判断这个 memoryPressure 是不是跟页面的 push 有关。 所以我的疑问是 flutter_boost 每次都清理 engine.viewController 是不是必须的? |
我记得没错的话,iOS触发清理内存缓存这个逻辑,并不是FlutterBoost的本意,而是Flutter iOS SDK的内部设计。FlutterBoost切换ViewController时的逻辑在我看来是没有问题的,只是因为Flutter iOS SDK内部的逻辑,导致执行了内存清理。 |
在 Flutter 的单引擎设计下, 置空 viewController 就清理内存也许是合理的。 |
可能是为了防止内存泄漏吧。直接设置看着也没啥问题。 |
目前我也遇到这个问题,用这个方法可以解决图片闪烁的问题,这样写会不会导致内存占用越来越大? |
内存缓存上限还是会受ImageCache中的策略控制,只是原本iOS在内存不够时会通知Flutter清理内存缓存的逻辑没了。这个可以自己在iOS Native层实现后另外定义消息通知到Flutter,然后调用 |
func applicationDidReceiveMemoryWarning(_ application: UIApplication) 在iOS原生AppDelegate里的这个回调发个通知给fluuter调用clearForIOS吗? |
应该是吧,我并不是iOS开发,所以不清楚iOS Native上的接口。 |
@lipopli 我现在尝试把 flutter boost 中所有置空 engine.viewController 的代码去掉了,目前还没发现什么问题。你可以试试 |
这个能提交到flutter_boost吗?还是你把代码放到本地了? 我目前是按照 @joechan-cq 的方案解决的 |
你自己 fork 一份代码去改吧。他们都直接把这个 issues 关了,看起来都不想改这问题。 |
请描述遇到的问题,以及您所期望的正确的结果
问题:
使用 withContainer: true(这是我们项目的默认配置) 连续 push 多个页面,在返回时,除了倒数第二个页面,前方的页面都会 rebuild,Image 组件会闪烁。
我的 App 的首页切换成了 Flutter,当我们回到首页时,时常会触发这个问题,导致我们的用户体验非常差。
期望结果:
页面不会 rebuild,Image 组件不会重新加载。
请说明如何操作会遇到上述问题
在 example_new_for_ios 中把某个 Tab 换成一个只显示图片的页面,并且多 push 几次这种页面(图片保持不同)。
RPReplay_Final1715161073.-.Compressed.with.FlexClip.mp4
在下面填入关键复现代码
复现的平台
iOS
Flutter SDK版本
3.13.9
FlutterBoost版本
4.5.6
是否延迟初始化FlutterBoost
No
解决方案
无效的解决方案一
相关 issues: #1219
把 opaque 改为 false 后表现正常,但是会出现其他问题:
无效的解决方案二
使用 BoostCacheWidget,经测试无效。
The text was updated successfully, but these errors were encountered: