</>开发学习笔记
← 返回全部笔记
Flutter

Flutter 组件测试里的三个假象

2026-11-05阅读约 1 分钟

用组件测试(widget test)把页面渲染成图片来检查界面,很方便,但测试环境和真机并不完全一样。下面三个问题都花了不少时间才发现是测试环境自己造出来的。

1. 只有英文溢出

测试里看到一排按钮的英文文字溢出、中文却没事,第一反应是英文翻译太长。实际原因是:测试默认的字体把每个字形都画成一个方块,拉丁字母因此比真实字体宽了将近一倍。中文本来就是方块宽,所以看不出来。

做法:测量宽度、检查溢出之前,先加载真实字体。而且要在渲染出来的组件树里量,单独 new 一个 TextPainter 不会用上注册过的字体。

2. 只有第一个用例是真的

同一个测试文件里,第一个用例能正常读到资源文件,第二个读资源的用例却一直卡住,直到超时。

原因是 rootBundle 会缓存读取结果,缓存的是一个 Future。这个 Future 是在第一个用例的测试区域(zone)里创建的,那个区域结束后,后面的用例再去等它,就永远等不到了。

做法:每个用例开始前调用 rootBundle.clear()。

3. 透明色的渐变中途发灰

一个从透明渐变到白色的动画,截图中途是一层灰色。原因是 Colors.transparent 其实是「透明的黑色」(ARGB 0,0,0,0)。从它插值到白色,走到一半就是半透明的中灰。

做法:用目标颜色本身的透明版本作起点,例如 Colors.white.withValues(alpha: 0)。

共同的教训

测试里看到奇怪的结果,先问一句「真机上也会这样吗」。能量的就量出来,比如量渲染出的尺寸、量截图上的颜色值,再下结论;不要先认定代码错了就去改代码。