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

4.2.0版本app首次安装启动进入flutter页面卡住 #1780

Open
yyzl0418 opened this issue Jan 9, 2023 · 33 comments
Open

4.2.0版本app首次安装启动进入flutter页面卡住 #1780

yyzl0418 opened this issue Jan 9, 2023 · 33 comments

Comments

@yyzl0418
Copy link

yyzl0418 commented Jan 9, 2023

4.2.0版本app首次安装启动进入flutter页面卡住,杀死进程重新就没事了,降级4.0.4版本可以解决卡住的问题,但是又出现flutterFragment盖住natvieFragment的问题

@sybil052
Copy link

我也遇到类似问题了,4.2.0版本首次安装从原生进入FlutterBoostFragment页面,flutter页面卡死,杀死重新进入就没问题

@tang5011235
Copy link

对我结合flutter_screen_utils 用也是这种情况,

static Future ensureScreenSize([
FlutterWindow? window,
Duration duration = const Duration(milliseconds: 10),
]) async {
final binding = WidgetsFlutterBinding.ensureInitialized();
window ??= binding.window;

if (window.viewConfiguration.geometry.isEmpty) {
  return Future.delayed(duration, () async {
    binding.deferFirstFrame();
    await ensureScreenSize(window, duration);
    return binding.allowFirstFrame();
  });
}

}
最终是这里出问题 window.viewConfiguration.geometry.isEmpty 这个一直为空

@xuqinzz
Copy link

xuqinzz commented Feb 10, 2023

对我结合flutter_screen_utils 用也是这种情况,

static Future ensureScreenSize([ FlutterWindow? window, Duration duration = const Duration(milliseconds: 10), ]) async { final binding = WidgetsFlutterBinding.ensureInitialized(); window ??= binding.window;

if (window.viewConfiguration.geometry.isEmpty) {
  return Future.delayed(duration, () async {
    binding.deferFirstFrame();
    await ensureScreenSize(window, duration);
    return binding.allowFirstFrame();
  });
}

} 最终是这里出问题 window.viewConfiguration.geometry.isEmpty 这个一直为空

我也碰到了这问题,兄弟你有找到解决方案吗

@1mf2
Copy link

1mf2 commented Feb 15, 2023

碰到了同样的问题,目前降级到4.0.4版本凑活用

@cuocuo
Copy link

cuocuo commented Mar 2, 2023

同样遇到这个问题了

@joechan-cq
Copy link
Collaborator

是否有能够复现的Demo可以提供?

@yyzl0418
Copy link
Author

yyzl0418 commented Mar 3, 2023

是否有能够复现的Demo可以提供?
release包,用4.2.0版本,flutter 3.0.5版本测试必现,首次安装页面卡住,主要是不能滑动,可以响应点击事件

@joechan-cq
Copy link
Collaborator

joechan-cq commented Mar 3, 2023

不能滑动,能响应点击事件,有点像 #1783 中的现象。估计是FlutterEngine渲染的Surface没绑上,或者被解绑了。

@yyzl0418
Copy link
Author

yyzl0418 commented Mar 3, 2023

不能滑动,能响应点击事件,有点像 #1783 中的现象。估计是FlutterEngine渲染的Surface没绑上,或者被解绑了。

我目前是把`changeFlutterAppLifecycle(FLUTTER_APP_STATE_RESUMED);和 changeFlutterAppLifecycle(FLUTTER_APP_STATE_PAUSED);注释了暂时没问题

@joechan-cq
Copy link
Collaborator

我用4.2的FB+3.0.5的Flutter,在3台设备上卸载了再安装,跑Debug、Release包,都没能复现问题。

@Roger110
Copy link

我也出现了

@joechan-cq
Copy link
Collaborator

我也出现了

@Roger110 是否有能重现的Demo提供?

@Roger110
Copy link

我也出现了

@Roger110 是否有能重现的Demo提供?

是在项目里面,demo不好抽出来

@joechan-cq
Copy link
Collaborator

@Roger110 能否修改flutter_boost的example项目,然后重现?感觉上像是和初始化调用顺序有关。

@sth0409
Copy link

sth0409 commented Apr 3, 2023

+1 望修复

@yyzl0418
Copy link
Author

yyzl0418 commented Apr 3, 2023

@Roger110 能否修改flutter_boost的example项目,然后重现?感觉上像是和初始化调用顺序有关。

深入代码看了下,发现是帧调度的问题,app首次启动finish页面的onstop方法比新开启页面的onstart方法后执行了,导致页面出现假死情况,自己重写帧调度解决了

@sth0409
Copy link

sth0409 commented Apr 3, 2023

不能滑动,能响应点击事件,有点像 #1783 中的现象。估计是FlutterEngine渲染的Surface没绑上,或者被解绑了。

我目前是把`changeFlutterAppLifecycle(FLUTTER_APP_STATE_RESUMED);和 changeFlutterAppLifecycle(FLUTTER_APP_STATE_PAUSED);注释了暂时没问题

目前用这个方法处理了一下,似乎正常了

@yyzl0418
Copy link
Author

yyzl0418 commented Apr 3, 2023

不能滑动,能响应点击事件,有点像 #1783 中的现象。估计是FlutterEngine渲染的Surface没绑上,或者被解绑了。

我目前是把`changeFlutterAppLifecycle(FLUTTER_APP_STATE_RESUMED);和 changeFlutterAppLifecycle(FLUTTER_APP_STATE_PAUSED);注释了暂时没问题

目前用这个方法处理了一下,似乎正常了

这个只能解决假死问题,前后台切换残影闪烁的问题就会出现

@sth0409
Copy link

sth0409 commented Apr 3, 2023

不能滑动,能响应点击事件,有点像 #1783 中的现象。估计是FlutterEngine渲染的Surface没绑上,或者被解绑了。

我目前是把`changeFlutterAppLifecycle(FLUTTER_APP_STATE_RESUMED);和 changeFlutterAppLifecycle(FLUTTER_APP_STATE_PAUSED);注释了暂时没问题

目前用这个方法处理了一下,似乎正常了

这个只能解决假死问题,前后台切换残影闪烁的问题就会出现

有更好的解决方案吗?看了你楼上的回复,查了一下Flutter帧调度的资料,没太看懂

@yyzl0418
Copy link
Author

yyzl0418 commented Apr 3, 2023

可以

具体可以看看这个 #1740

@wangxiongtao
Copy link

4.2.2也是同样的问题

@1mf2
Copy link

1mf2 commented May 29, 2023

@cuocuo @joechan-cq @sybil052 @tang5011235 @Roger110 @wangxiongtao

这个提交导致页面卡主问题,临时注释掉就好了

#1724

@Roger110
Copy link

@cuocuo @joechan-cq @sybil052 @tang5011235 @Roger110 @wangxiongtao

这个提交导致页面卡主问题,临时注释掉就好了

#1724

能提个新版本解决这个问题么

@sth0409
Copy link

sth0409 commented May 29, 2023

@cuocuo @joechan-cq @sybil052 @tang5011235 @Roger110 @wangxiongtao
这个提交导致页面卡主问题,临时注释掉就好了
#1724

能提个新版本解决这个问题么

可以fork一下,然后自己修改,项目里引用自己的github仓库地址

@joechan-cq
Copy link
Collaborator

我还是看不出1724中的修改对这个问题的影响。1724中的修改,只会在onForeground和onBackground的时候触发。app启动后,如果不是直接就进入flutter页面,或者出现第一个NativeActivity先onStop,Flutter的Activity再onStart的异常情况,就并不会触发changeFlutterAppLifecycle的代码。第一次进入Flutter正常应该都是依靠FlutterBoostPlugin.onContainerCreated去发送的onResume事件。
所以,是否可以打日志检查一下BoostActivityLifecycle中的生命周期的执行情况。

@joechan-cq
Copy link
Collaborator

你们是不是都对FlutterBoost做了延迟初始化?#1742
如果做了延迟初始化,又没有自行接管ActivityLifecycleCallbacks 那的确会出现问题。参考#1652

@1mf2
Copy link

1mf2 commented May 31, 2023

刚才实验了一下,应该是延迟初始化导致,因为现在这些隐私限制,首次启动用户没有同意协议的时候不能跑流量;
FlutterBoost在application中初始化时会跑流量,在首次启动的时候是在用户点击同意之后再进行初始化的引擎;
放到application中初始化就好了,但是会导致首次启动跑流量问题

@Roger110
Copy link

刚才实验了一下,应该是延迟初始化导致,因为现在这些隐私限制,首次启动用户没有同意协议的时候不能跑流量;
FlutterBoost在application中初始化时会跑流量,在首次启动的时候是在用户点击同意之后再进行初始化的引擎;
放到application中初始化就好了,但是会导致首次启动跑流量问题

但是4.0.4是没有这个问题的

@joechan-cq
Copy link
Collaborator

刚才实验了一下,应该是延迟初始化导致,因为现在这些隐私限制,首次启动用户没有同意协议的时候不能跑流量;
FlutterBoost在application中初始化时会跑流量,在首次启动的时候是在用户点击同意之后再进行初始化的引擎;
放到application中初始化就好了,但是会导致首次启动跑流量问题

但是4.0.4是没有这个问题的

4.0.4并没有onForegroundonBackground的处理,所以正常的。卡住是因为多触发了onBackground里的pause。

@joechan-cq
Copy link
Collaborator

@1mf2 引擎可以延迟初始化,只要自行接管AppLifecycleCallback就可以了。

@0xZOne
Copy link
Collaborator

0xZOne commented Jun 9, 2023

@1mf2 引擎可以延迟初始化,只要自行接管AppLifecycleCallback就可以了。

是的,该问题的根本原因是,FlutterBoost信息不足,派发的前后台事件不准确,导致了帧调度被停掉了,现象就是假死。业务使用下面的接口自行接管前后台事件的正确派发就可以解决问题。

image

@0xZOne
Copy link
Collaborator

0xZOne commented Jun 9, 2023

刚才实验了一下,应该是延迟初始化导致,因为现在这些隐私限制,首次启动用户没有同意协议的时候不能跑流量;
FlutterBoost在application中初始化时会跑流量,在首次启动的时候是在用户点击同意之后再进行初始化的引擎;
放到application中初始化就好了,但是会导致首次启动跑流量问题

但是4.0.4是没有这个问题的

看这个提交的注释: #1724

@0xZOne 0xZOne pinned this issue Jun 9, 2023
@dreamstartLZ
Copy link

android可以通过接管AppLifecycleCallback来解决,IOS也出现了这个问题 需要怎么解决呢

@0xZOne 0xZOne unpinned this issue Apr 3, 2024
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