Skip to content
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

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

Open
marchlqq opened this issue Oct 13, 2022 · 36 comments

Comments

@marchlqq
Copy link

marchlqq commented Oct 13, 2022

问题,见bug单
#1715

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

复现方式:
前后台切换。

原因,代码如下:
image

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

现象:

Record_2022-10-11-17-29-55_20d5840949c765d87a54257.mp4
@marchlqq
Copy link
Author

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

出现原因,是多个fragment,flutter存在隐藏的情况。
同问题单:
image
问题单:
#1736

@0xZOne
Copy link
Collaborator

0xZOne commented Oct 14, 2022

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

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

@marchlqq
Copy link
Author

问题 单:#1715
修复了前后台切换,可以解决动画区域不停闪烁的问题。

但是假如现在有一个首页,同问题 1736,
进入首页home,有多个fragment,
假如tab1 是 native的fragment,tab2 是 FlutterFragment;
我们先展示tab2,然后快速切换到tab1,

这个时候,在进行切后台切换,从后台到前台的时候,tab2就会运行,
FlutterBoost.instance().getPlugin().onForeground();

就会出现假死的现象了。因为tab2现在虽然在前台,但是view其实是隐藏的。所以这个问题就出现假死了。

@marchlqq
Copy link
Author

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

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

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

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

Record_2022-10-14-11-34-15.mp4

@joechan-cq
Copy link
Collaborator

joechan-cq commented Oct 14, 2022

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

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

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

@marchlqq
Copy link
Author

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

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

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

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

@mosentest
Copy link

+1

@mosentest
Copy link

mosentest commented Oct 14, 2022

  1. 停止帧调度

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

@joechan-cq
Copy link
Collaborator

  1. 停止帧调度

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

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

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

@joechan-cq
Copy link
Collaborator

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

@marchlqq
Copy link
Author

  1. 停止帧调度

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

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

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

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

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

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

@marchlqq
Copy link
Author

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

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

@marchlqq
Copy link
Author

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

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

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

@0xZOne
Copy link
Collaborator

0xZOne commented Oct 14, 2022

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

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

@0xZOne
Copy link
Collaborator

0xZOne commented Oct 14, 2022

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

@marchlqq
Copy link
Author

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

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

@0xZOne
Copy link
Collaborator

0xZOne commented Oct 14, 2022

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

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

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

@marchlqq
Copy link
Author

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

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

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

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

@zhaoxinming
Copy link

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

@leo0017
Copy link

leo0017 commented Nov 24, 2022

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

@zhangjun920912
Copy link

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

@gtbluesky
Copy link

gtbluesky commented Dec 1, 2022

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

@mosentest
Copy link

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

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

@Suirui-Simon
Copy link

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

@GGMU1987
Copy link

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

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

请问你们是怎么解决的?

@leileiChenGentleman
Copy link

leileiChenGentleman commented Mar 1, 2023

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

@yyzl0418
Copy link

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

@stateofzhao
Copy link

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

@yyzl0418
Copy link

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

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

@stateofzhao
Copy link

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

@OnClickListener2048
Copy link

@0xZOne hi 能否给个联系方式 有个问题请教

@maxwell-nc
Copy link

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

我已经初始化时暂停帧调度了,感觉还是有一定概率出现,而且包括切出程序,再进去,虽然已经处理了暂停恢复调度,但是还是有概率出现(大概1/10概率)

有人知道到底是什么原因导致闪烁吗?

@maxwell-nc
Copy link

#onPause: n{2f9c37a} (e9f8cdb1-3386-4364-a969-b6b97292bf90 id=0x7f09042c), isFinshing=false
#didFragmentHide: n{2f9c37a} (e9f8cdb1-3386-4364-a969-b6b97292bf90 id=0x7f09042c), isOpaque=true
#onContainerDisappeared: 7446b1b5-8f40-46f9-8cf2-a44f08d68c1f_/main_page, com.idlefish.flutterboost.j0@49f1b8d
#onContainerHide start: 7446b1b5-8f40-46f9-8cf2-a44f08d68c1f_/main_page, com.idlefish.flutterboost.j0@49f1b8d

onBackground start: com.idlefish.flutterboost.j0@49f1b8d

MainPage handlePageLifecycleStateChange: state=PageState.disappeared
boost PageState.disappeared
#changeFlutterAppLifecycle: 2, com.idlefish.flutterboost.j0@49f1b8d
#sendEventToFlutter: app_lifecycle_changed_key, com.idlefish.flutterboost.j0@49f1b8d
#onContainerHide end: 7446b1b5-8f40-46f9-8cf2-a44f08d68c1f_/main_page, com.idlefish.flutterboost.j0@49f1b8d

onBackground end: com.idlefish.flutterboost.j0@49f1b8d

#onSaveInstanceState: n{2f9c37a} (e9f8cdb1-3386-4364-a969-b6b97292bf90 id=0x7f09042c)
#onStop: n{2f9c37a} (e9f8cdb1-3386-4364-a969-b6b97292bf90 id=0x7f09042c)
#onStart: n{2f9c37a} (e9f8cdb1-3386-4364-a969-b6b97292bf90 id=0x7f09042c)
#onResume: isHidden=false, n{2f9c37a} (e9f8cdb1-3386-4364-a969-b6b97292bf90 id=0x7f09042c)
#didFragmentShow: n{2f9c37a} (e9f8cdb1-3386-4364-a969-b6b97292bf90 id=0x7f09042c), isOpaque=true
#onContainerAppeared: 7446b1b5-8f40-46f9-8cf2-a44f08d68c1f_/main_page, com.idlefish.flutterboost.j0@49f1b8d
#activateContainer: 7446b1b5-8f40-46f9-8cf2-a44f08d68c1f_/main_page,activeContainers=1, [/main_page,]
#pushRoute start: /main_page, 7446b1b5-8f40-46f9-8cf2-a44f08d68c1f_/main_page, com.idlefish.flutterboost.j0@49f1b8d
#onContainerShow start: 7446b1b5-8f40-46f9-8cf2-a44f08d68c1f_/main_page, com.idlefish.flutterboost.j0@49f1b8d

onForeground start: com.idlefish.flutterboost.j0@49f1b8d

#changeFlutterAppLifecycle: 0, com.idlefish.flutterboost.j0@49f1b8d
#sendEventToFlutter: app_lifecycle_changed_key, com.idlefish.flutterboost.j0@49f1b8d
MainPage handlePageLifecycleStateChange: state=PageState.appeared
boost PageState.appeared
[D]BasePageState: setSystemStatusBarBrightness color=Color(0xffffffff) brightness=Brightness.light
#pushRoute end: /main_page, 7446b1b5-8f40-46f9-8cf2-a44f08d68c1f_/main_page
#attachToEngineIfNeeded: n{2f9c37a} (e9f8cdb1-3386-4364-a969-b6b97292bf90 id=0x7f09042c)
#onContainerShow end: 7446b1b5-8f40-46f9-8cf2-a44f08d68c1f_/main_page, com.idlefish.flutterboost.j0@49f1b8d

onForeground end: com.idlefish.flutterboost.j0@49f1b8d

#sendEventToNative: com.idlefish.flutterboost.j0@49f1b8d

(切到最近应用,然后再进去)这个状态,应该是没有错的?但是还是闪

@1mf2
Copy link

1mf2 commented Nov 15, 2023

升级Flutter SDK版本即可,目前升级到3.13.5后不再复现

@yogkin
Copy link

yogkin commented Apr 16, 2024

生命周期处理对了还是会闪烁,目前的处理方案是切换到flutter tab页面,让flutter页面往上滑动0.01个像素,暂时解决了。
flutter分支为3.7.12
flutterBoost分支为最新 4.5.4

@OnClickListener2048
Copy link

生命周期处理对了还是会闪烁,目前的处理方案是切换到flutter tab页面,让flutter页面往上滑动0.01个像素,暂时解决了。 flutter分支为3.7.12 flutterBoost分支为最新 4.5.4

怎么把每个页面都滑动0.01的

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests