(该问题未完全修复)安卓app进入桌面,返回应用,动画区域会有不停地闪烁出现
问题,见bug单 https://github.com/alibaba/flutter_boost/issues/1715
@0xZOne 我看还有一个场景,还会复现这个问题,没有完全修改。
复现方式: 前后台切换。
原因,代码如下:

最后运行到:
FlutterBoost.instance().getPlugin().onForeground();
然后:
changeFlutterAppLifecycle(FLUTTER_APP_STATE_RESUMED);
现象:
https://user-images.githubusercontent.com/9548501/195744241-0d39c050-64b3-487b-95f2-68c4b290b9de.mp4
@0xZOne ui不显示的情况下,从后台到前台,不应该调用 onForeground 方法,
出现原因,是多个fragment,flutter存在隐藏的情况。
同问题单:
问题单:
https://github.com/alibaba/flutter_boost/pull/1736
「我看还有一个场景,还会复现这个问题,没有完全修改。」
—— 呃,具体是什么场景呢?与 https://github.com/alibaba/flutter_boost/pull/1736 是什么关系?
问题 单:https://github.com/alibaba/flutter_boost/issues/1715 修复了前后台切换,可以解决动画区域不停闪烁的问题。
但是假如现在有一个首页,同问题 1736, 进入首页home,有多个fragment, 假如tab1 是 native的fragment,tab2 是 FlutterFragment; 我们先展示tab2,然后快速切换到tab1,
这个时候,在进行切后台切换,从后台到前台的时候,tab2就会运行, FlutterBoost.instance().getPlugin().onForeground();
就会出现假死的现象了。因为tab2现在虽然在前台,但是view其实是隐藏的。所以这个问题就出现假死了。
「我看还有一个场景,还会复现这个问题,没有完全修改。」
—— 呃,具体是什么场景呢?与 #1736 是什么关系?
具体视频操作: 邮箱tab为 flutter, 聊天为 native,
切换到邮箱,在动画加载时,切换到聊天,然后快速前后台,触发 changeFlutterAppLifecycle(FLUTTER_APP_STATE_RESUMED); 假死现象就出现了。
https://user-images.githubusercontent.com/9548501/195756638-f1a7c15d-6cba-46c1-9bef-9bedccad2c66.mp4
按照之前的修改逻辑,是想要
- FlutterFragment被hide的时候,停止帧调度
- App切到前台,如果FlutterFragment没有show,那么不要恢复帧调度,等真正可见了再恢复
应该是这个意思吧 @marchlqq @0xZOne
按照之前的修改逻辑,是想要
- FlutterFragment被hide的时候,停止帧调度
- App切到前台,如果FlutterFragment没有show,那么不要恢复帧调度,等真正可见了再恢复
应该是这个意思吧 @marchlqq @0xZOne
是的。不然还是会出现假死。 请问一下,这个假死,是什么原因造成的,为什么 [注意] 应用「务必」确保前后台通知事件(onBackground/onForeground)的非准确性 会出现假死?
+1
- 停止帧调度
停止帧调度,具体要怎么操作@joechan-cq
- 停止帧调度
停止帧调度,具体要怎么操作@joechan-cq
目前并没有直接的方法停止帧调度。之前是通过发送给Flutter “切后台”和“回前台”的事件,来触发WidgetsFlutterBinding.handleAppLifecycleStateChanged方法,进而更里面调用“SchedulerBinding._setFramesEnabledState”方法停止和恢复帧调度。
单引擎,一个界面多个FlutterFragment的情况下,很不推荐自己去手动发送前后台事件,一旦弄错,就会导致Flutter的渲染出现异常。
#1725 可以问问 @JunhuaLin 这个兄弟,看那个issue,应该是同一个问题,可以问问他有什么办法。
- 停止帧调度
停止帧调度,具体要怎么操作@joechan-cq
目前并没有直接的方法停止帧调度。之前是通过发送给Flutter “切后台”和“回前台”的事件,来触发
WidgetsFlutterBinding.handleAppLifecycleStateChanged方法,进而更里面调用“SchedulerBinding._setFramesEnabledState”方法停止和恢复帧调度。单引擎,一个界面多个FlutterFragment的情况下,很不推荐自己去手动发送前后台事件,一旦弄错,就会导致Flutter的渲染出现异常。
那框架可以处理这个问题吗?
我发现 FlutterFragment 和其他tab切换,等加载完成,也是会出现这个问题。
所以在 onHiddenChanged,添加了前后台的控制,

但是,如果我是多个 FlutterFragment 的tab,那就没办法了,我其中一个tab onBackground,另一个 onForeground,这 前后台通知事件(onBackground/onForeground)的准确性 就不好处理了。
那就只能框架去控制这个准确性,端上就自身控制就乱了,所以框架这边这种情况可以考虑如何处理不?
#1725 可以问问 @JunhuaLin 这个兄弟,看那个issue,应该是同一个问题,可以问问他有什么办法。
你说的,也有考虑,但是 onBackground,是系统的方法,没有针对单个view,有办法单个view的控制? 因为现在是多个 FlutterFragment,如果自身控制,总是会存在错别的。
@0xZOne 怎么停止当前widget的帧调度,
现在多个 FlutterFragment,不好处理,因为只要有view隐藏的情况下,运行动画,就会出现闪屏。
所以如果我在当前view,执行 onPageHide 的时候,暂停帧调度,onPageShow的时候,在执行帧调度,应该就没这个问题了。
@0xZOne 怎么停止当前widget的帧调度,
你在FlutterBoost代码里搜索一下:changeFlutterAppLifecycle这个函数
是暂停整个root isolate的帧调度哈
是暂停整个root isolate的帧调度哈
这个闪烁,是不是widget 在隐藏的时候运行,就会出现呢? 可见的情况下,是没问题的。
是暂停整个root isolate的帧调度哈
这个闪烁,是不是widget 在隐藏的时候运行,就会出现呢? 可见的情况下,是没问题的。
目前收集到的信息是这样的~
是暂停整个root isolate的帧调度哈
这个闪烁,是不是widget 在隐藏的时候运行,就会出现呢? 可见的情况下,是没问题的。
目前收集到的信息是这样的~
那有办法对单个widget操作吗?例如控制原生flutterView停止渲染,或者,在flutter页面,在show和hide,暂停整个view的绘制,或者暂停整个页面的动画。
打开原生页面前有个加载动画,打开原生页面后关闭动画,在从原生页面返回flutter页面也会有闪烁问题。
同样的问题,首次进入页面还是闪动,有解决了的吗
相同的问题,在Fragment中添加了代码中说的resume/pause可以解决界面不可见刷新闪动的问题,但是首次进入页面闪动还是有问题,还在闪动,求作者们解决
欢迎大家试用Fusion 3.0,彻底解决混合栈框架普遍存在的黑屏、闪屏、白屏等疑难杂症
同样遇到闪,各位怎么解决呢 @mosentest @marchlqq @0xZOne
经常性发生闪屏,已经自己接管生命周期了,还是偶发性发生闪屏,目前是进入一个flutter页面,在数据还没渲染出来之前,快速切到后台,或者跳转原生页面回来,有偶发现象
大佬们有办法解决吗,经常性发生闪屏,已经自己接管生命周期了,还是会有几率闪屏
@yyzl0418 自己接管的话,如果只有首次进去时会有概率闪屏,那么大概率是Flutter默认帧调度是开启的,首次进入时如果被弹窗或者其他原生Fragment盖住(此时没有执行FlutterFragment的onPause()方法),再次回到FlutterFragment时就闪了,可以尝试下在Flutter初始化后,直接暂停帧调度。
@yyzl0418 自己接管的话,如果只有首次进去时会有概率闪屏,那么大概率是Flutter默认帧调度是开启的,首次进入时如果被弹窗或者其他原生Fragment盖住(此时没有执行FlutterFragment的onPause()方法),再次回到FlutterFragment时就闪了,可以尝试下在Flutter初始化后,直接暂停帧调度。
不是首次,我这边的情况是如果一个flutter页面的动画没有结束,快速切换到一个非flutter页面,再切换回来就有一定概率会闪屏
@yyzl0418 这种情况只能自己接管帧调度了,我是自己完全接管帧调度搞定的,你把Fragment的生命周期好好缕缕,只在Fragment的onResume() / onPause() 来开启/关闭Flutter帧调度。