侧边栏壁纸
博主头像
钱学超博主等级

火星人,1万小时法则的忠实拥趸。技术宅,象棋和羽毛球爱好者,马拉松PB成绩:4小时零8分。坚持认为算法是计算机的灵魂。喜欢解决问题,喜欢手工,喜欢与朋友们聊天喝酒吹牛X。

  • 累计撰写 83 篇文章
  • 累计创建 464 个标签
  • 累计收到 88 条评论
标签搜索

目 录CONTENT

文章目录

flutter开发中的测不准原理

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

评论区