- 很诡异的一个问题。
- flutter开发一个app,debug没有问题,release的时候黑屏(有时候白屏)
- 闪屏完毕后如果说没有加载后续所有页面的话,倒是情有可原,哪部分出问题了没有执行下去。
- 可是debug下没有任何问题,release下使用toast发现,后续页面和逻辑都是正常进行的。
- 比如我的flash页–>root页(判定跳转逻辑)–>login页进行登录。虽然看不到,但是login页面的构造函数、甚至initState方法都是正常调用的。
- 开始的时候在某一台手机上是偶尔出现。规律是第一次必然黑屏,然后点back键退出应用,再进就没有问题了。强行杀掉之后,再进入就是不行,黑屏。
- 后来使用一台锤子m2测试,发现每次必现。必然黑屏。这才引起了重视。找问题找了一箩筐。
- 即便到现在,也只是找到了解决方法,也不明白其中的原理。有 明白的大神请给我留言吧。多谢赐教!
- 解题思路:安卓配置的问题,gradle配置的问题,dart插件配置的问题。其他可能性。
- 按照以上思路去调整,找寻各种可疑的点,并筛查、求证。最终发现,全都不是。
- 最后一个思路,其他可能性就比较难了。
- 使用排除法,首先确认flutter版本和环境没有问题,找了另外一个工程,flutter版本,gradle版本,全都一样,打release包,发现没有任何问题。
- 再使用同样的环境,创建一个新的flutter工程,不改动任何代码,直接打release包,发现,没有任何问题。
- 然后就比较简单了,把新工程的main.dart内容拷贝过来,放到出问题的工程里边替换掉main.dart,发现也没有问题!
- 这就证明了安卓配置、dart插件和gradle配置全都没有问题。
- 那么,就是main.dart里边出问题了。这就比较好解决。一行一行把代码拷贝过来,每拷贝一行打一个包。当然,不是真的一行行,一个模块一个模块的测试,比如EasyLoading,PullToRefresh,ScreenUtils都需要在MaterialApp这里搞一些小动作。
- 就找他们麻烦吧!嗯,不出所料,跟他们没有任何关系。
- 几乎全都拷贝过来了。还是没有发现问题所在,黑屏不能复现。
- 反复对比之下,发现最后一段几乎是不可能有问题的代码,占据了全部的嫌疑!
- try catch是我加的(原来没有)
- 就是他!debug模式下,走的是else,毫无疑问,Log.d是这么说的。我们也一直这么认为的,但问题是release下没有log可以看。
- 锁定了这个之后,又去查了一下,为什么加上这个代码,就是因为有时候,如果不加这个判定的话,app在release模式下会黑屏!白屏!我的天!
- 这不是巧了么,这不是。
- 想了一下,么有琢磨明白这是什么原理。这个onMetricsChanged方法,就是在window窗体大小发生变化的时候的一个回调函数,里边是什么,有什么功能,不应该会影响到整个app的行为啊。
- 好比说我加上这个函数就是为了监控app的大小的,但是这诡异的bug,只有在release模式下,没有办法使用log的环境中,一旦你添加了监控,他就不正常。不添加这个监控,它就是正常的!
- 这有点像杨氏双缝干涉了!无法观测!量子力学测不准原理居然在flutter中也可以体现?!
- 曾经以为是启动速度快,确实没有拿到物理屏幕的大小,于是使用Future.delay方法延迟两秒钟再启动app,发现没有用。只要是放到这个回调函数里边启动app,就会出现黑屏现象。
- 但是后面逻辑还都不受影响!
- 来一张截图!(这个toast是在login页面的initState中打印的)
- 所以说,不要看那些代码忠厚善良的表面,内地里,备不住是个什么鬼!!!!
- 大神啊,救救我。这到底是是咋回事嘛,关键是,另一个工程这段代码也是存在的,居然就没有什么问题,还能正常运行!所以这个应该是没什么共性。
- 也可能是flutter版本升级了,以前需要判定的东西,现在不需要了?加上反而不行?
- flutter doctor
版权归属:
钱学超
许可协议:
本文使用《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》协议授权
评论区