flutter_boost icon indicating copy to clipboard operation
flutter_boost copied to clipboard

(该问题未完全修复)安卓app进入桌面,返回应用,动画区域会有不停地闪烁出现

Open marchlqq opened this issue 3 years ago • 36 comments

问题,见bug单 https://github.com/alibaba/flutter_boost/issues/1715

@0xZOne 我看还有一个场景,还会复现这个问题,没有完全修改。

复现方式: 前后台切换。

原因,代码如下: image

最后运行到:
FlutterBoost.instance().getPlugin().onForeground();
然后:
changeFlutterAppLifecycle(FLUTTER_APP_STATE_RESUMED);

现象:

https://user-images.githubusercontent.com/9548501/195744241-0d39c050-64b3-487b-95f2-68c4b290b9de.mp4

marchlqq avatar Oct 13 '22 12:10 marchlqq

@0xZOne ui不显示的情况下,从后台到前台,不应该调用 onForeground 方法,

出现原因,是多个fragment,flutter存在隐藏的情况。 同问题单: image 问题单: https://github.com/alibaba/flutter_boost/pull/1736

marchlqq avatar Oct 13 '22 12:10 marchlqq

「我看还有一个场景,还会复现这个问题,没有完全修改。」

—— 呃,具体是什么场景呢?与 https://github.com/alibaba/flutter_boost/pull/1736 是什么关系?

0xZOne avatar Oct 14 '22 02:10 0xZOne

问题 单: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其实是隐藏的。所以这个问题就出现假死了。

marchlqq avatar Oct 14 '22 03:10 marchlqq

「我看还有一个场景,还会复现这个问题,没有完全修改。」

—— 呃,具体是什么场景呢?与 #1736 是什么关系?

具体视频操作: 邮箱tab为 flutter, 聊天为 native,

切换到邮箱,在动画加载时,切换到聊天,然后快速前后台,触发 changeFlutterAppLifecycle(FLUTTER_APP_STATE_RESUMED); 假死现象就出现了。

https://user-images.githubusercontent.com/9548501/195756638-f1a7c15d-6cba-46c1-9bef-9bedccad2c66.mp4

marchlqq avatar Oct 14 '22 03:10 marchlqq

按照之前的修改逻辑,是想要

  1. FlutterFragment被hide的时候,停止帧调度
  2. App切到前台,如果FlutterFragment没有show,那么不要恢复帧调度,等真正可见了再恢复

应该是这个意思吧 @marchlqq @0xZOne

joechan-cq avatar Oct 14 '22 03:10 joechan-cq

按照之前的修改逻辑,是想要

  1. FlutterFragment被hide的时候,停止帧调度
  2. App切到前台,如果FlutterFragment没有show,那么不要恢复帧调度,等真正可见了再恢复

应该是这个意思吧 @marchlqq @0xZOne

是的。不然还是会出现假死。 请问一下,这个假死,是什么原因造成的,为什么 [注意] 应用「务必」确保前后台通知事件(onBackground/onForeground)的准确性 会出现假死?

marchlqq avatar Oct 14 '22 03:10 marchlqq

+1

mosentest avatar Oct 14 '22 03:10 mosentest

  1. 停止帧调度

停止帧调度,具体要怎么操作@joechan-cq

mosentest avatar Oct 14 '22 03:10 mosentest

  1. 停止帧调度

停止帧调度,具体要怎么操作@joechan-cq

目前并没有直接的方法停止帧调度。之前是通过发送给Flutter “切后台”和“回前台”的事件,来触发WidgetsFlutterBinding.handleAppLifecycleStateChanged方法,进而更里面调用“SchedulerBinding._setFramesEnabledState”方法停止和恢复帧调度。

单引擎,一个界面多个FlutterFragment的情况下,很不推荐自己去手动发送前后台事件,一旦弄错,就会导致Flutter的渲染出现异常。

joechan-cq avatar Oct 14 '22 05:10 joechan-cq

#1725 可以问问 @JunhuaLin 这个兄弟,看那个issue,应该是同一个问题,可以问问他有什么办法。

joechan-cq avatar Oct 14 '22 07:10 joechan-cq

  1. 停止帧调度

停止帧调度,具体要怎么操作@joechan-cq

目前并没有直接的方法停止帧调度。之前是通过发送给Flutter “切后台”和“回前台”的事件,来触发WidgetsFlutterBinding.handleAppLifecycleStateChanged方法,进而更里面调用“SchedulerBinding._setFramesEnabledState”方法停止和恢复帧调度。

单引擎,一个界面多个FlutterFragment的情况下,很不推荐自己去手动发送前后台事件,一旦弄错,就会导致Flutter的渲染出现异常。

那框架可以处理这个问题吗? 我发现 FlutterFragment 和其他tab切换,等加载完成,也是会出现这个问题。 所以在 onHiddenChanged,添加了前后台的控制, image

但是,如果我是多个 FlutterFragment 的tab,那就没办法了,我其中一个tab onBackground,另一个 onForeground,这 前后台通知事件(onBackground/onForeground)的准确性 就不好处理了。

那就只能框架去控制这个准确性,端上就自身控制就乱了,所以框架这边这种情况可以考虑如何处理不?

marchlqq avatar Oct 14 '22 07:10 marchlqq

#1725 可以问问 @JunhuaLin 这个兄弟,看那个issue,应该是同一个问题,可以问问他有什么办法。

你说的,也有考虑,但是 onBackground,是系统的方法,没有针对单个view,有办法单个view的控制? 因为现在是多个 FlutterFragment,如果自身控制,总是会存在错别的。

marchlqq avatar Oct 14 '22 10:10 marchlqq

@0xZOne 怎么停止当前widget的帧调度,

现在多个 FlutterFragment,不好处理,因为只要有view隐藏的情况下,运行动画,就会出现闪屏。

所以如果我在当前view,执行 onPageHide 的时候,暂停帧调度,onPageShow的时候,在执行帧调度,应该就没这个问题了。

marchlqq avatar Oct 14 '22 11:10 marchlqq

@0xZOne 怎么停止当前widget的帧调度,

你在FlutterBoost代码里搜索一下:changeFlutterAppLifecycle这个函数

0xZOne avatar Oct 14 '22 11:10 0xZOne

是暂停整个root isolate的帧调度哈

0xZOne avatar Oct 14 '22 11:10 0xZOne

是暂停整个root isolate的帧调度哈

这个闪烁,是不是widget 在隐藏的时候运行,就会出现呢? 可见的情况下,是没问题的。

marchlqq avatar Oct 14 '22 11:10 marchlqq

是暂停整个root isolate的帧调度哈

这个闪烁,是不是widget 在隐藏的时候运行,就会出现呢? 可见的情况下,是没问题的。

目前收集到的信息是这样的~

0xZOne avatar Oct 14 '22 11:10 0xZOne

是暂停整个root isolate的帧调度哈

这个闪烁,是不是widget 在隐藏的时候运行,就会出现呢? 可见的情况下,是没问题的。

目前收集到的信息是这样的~

那有办法对单个widget操作吗?例如控制原生flutterView停止渲染,或者,在flutter页面,在show和hide,暂停整个view的绘制,或者暂停整个页面的动画。

marchlqq avatar Oct 14 '22 12:10 marchlqq

打开原生页面前有个加载动画,打开原生页面后关闭动画,在从原生页面返回flutter页面也会有闪烁问题。

zhaoxinming avatar Nov 23 '22 06:11 zhaoxinming

同样的问题,首次进入页面还是闪动,有解决了的吗

leo0017 avatar Nov 24 '22 02:11 leo0017

相同的问题,在Fragment中添加了代码中说的resume/pause可以解决界面不可见刷新闪动的问题,但是首次进入页面闪动还是有问题,还在闪动,求作者们解决

zhangjun920912 avatar Nov 25 '22 08:11 zhangjun920912

欢迎大家试用Fusion 3.0,彻底解决混合栈框架普遍存在的黑屏、闪屏、白屏等疑难杂症

gtbluesky avatar Dec 01 '22 02:12 gtbluesky

欢迎大家试用Fusion 3.0,彻底解决混合栈框架普遍存在的黑屏、闪屏、白屏等疑难杂症

你好牛,我们团队已经解决了这个问题,这单可以关了

mosentest avatar Dec 01 '22 02:12 mosentest

同样遇到闪,各位怎么解决呢 @mosentest @marchlqq @0xZOne

Suirui-Simon avatar Dec 02 '22 01:12 Suirui-Simon

欢迎大家试用Fusion 3.0,彻底解决混合栈框架普遍存在的黑屏、闪屏、白屏等疑难杂症

你好牛,我们团队已经解决了这个问题,这单可以关了

请问你们是怎么解决的?

GGMU1987 avatar Dec 12 '22 13:12 GGMU1987

经常性发生闪屏,已经自己接管生命周期了,还是偶发性发生闪屏,目前是进入一个flutter页面,在数据还没渲染出来之前,快速切到后台,或者跳转原生页面回来,有偶发现象

leileiChenGentleman avatar Mar 01 '23 12:03 leileiChenGentleman

大佬们有办法解决吗,经常性发生闪屏,已经自己接管生命周期了,还是会有几率闪屏

yyzl0418 avatar Apr 19 '23 10:04 yyzl0418

@yyzl0418 自己接管的话,如果只有首次进去时会有概率闪屏,那么大概率是Flutter默认帧调度是开启的,首次进入时如果被弹窗或者其他原生Fragment盖住(此时没有执行FlutterFragment的onPause()方法),再次回到FlutterFragment时就闪了,可以尝试下在Flutter初始化后,直接暂停帧调度。

stateofzhao avatar Apr 23 '23 10:04 stateofzhao

@yyzl0418 自己接管的话,如果只有首次进去时会有概率闪屏,那么大概率是Flutter默认帧调度是开启的,首次进入时如果被弹窗或者其他原生Fragment盖住(此时没有执行FlutterFragment的onPause()方法),再次回到FlutterFragment时就闪了,可以尝试下在Flutter初始化后,直接暂停帧调度。

不是首次,我这边的情况是如果一个flutter页面的动画没有结束,快速切换到一个非flutter页面,再切换回来就有一定概率会闪屏

yyzl0418 avatar Apr 24 '23 09:04 yyzl0418

@yyzl0418 这种情况只能自己接管帧调度了,我是自己完全接管帧调度搞定的,你把Fragment的生命周期好好缕缕,只在Fragment的onResume() / onPause() 来开启/关闭Flutter帧调度。

stateofzhao avatar Apr 25 '23 07:04 stateofzhao