【发布时间】:2020-10-08 09:18:08
【问题描述】:
在部署我的 Flutter 应用之前,我想在多种屏幕尺寸上对其进行测试,以检查是否有适用于较小屏幕的 Renderflex overflow。
但是当我第一次在小部件测试期间修改屏幕尺寸以匹配我在开发期间使用的设备时,我意识到小部件测试已经抛出 Render overflow 错误,即使它在实际中没有这样的错误设备。所以我问了这个问题How to fix A RenderFlex overflowed during Widget Test
但我在进一步调查并使用从小部件测试中捕捉 png 的 Flutter 黄金功能测试后,我将问题缩小到 文本大小 的差异。
您可以在下面的可重现步骤中清楚地看到,小部件文本中的文本WAY BIGGER(右侧)比真实设备中的实际文本(左侧)要大。 p>
小部件测试期间较大的文本大小会导致我的应用中出现RenderFlex error。
重现步骤:
- 现在连接一个真实设备并使用
flutter run运行此代码
lib/main.dart
import 'package:flutter/material.dart';
void main() {
runApp(
MaterialApp(
home: TextScaleComparaison(),
),
);
}
class TextScaleComparaison extends StatelessWidget {
@override
Widget build(BuildContext context) {
final widget = Scaffold(
body: LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
final width = MediaQuery.of(context).size.width;
final height = MediaQuery.of(context).size.height;
final dpr = MediaQuery.of(context).devicePixelRatio;
final textScale = MediaQuery.of(context).textScaleFactor;
final vi = MediaQuery.of(context).viewInsets;
final vip = MediaQuery.of(context).viewPadding;
final font = DefaultTextStyle.of(context).style.fontFamily;
print("width is $width and height is $height and dpi is $dpr txtScale is $textScale vi is $vi vip is $vip font is $font");
return Center(child: Text("This cannot be that long!!"));
},
),
);
return widget;
}
}
- 检查日志,您应该会看到设备屏幕信息:
对我来说,我得到了:
I/flutter (27450): width is 411.42857142857144 and height is 797.7142857142857 and dpi is 2.625 txtScale is 1.1 vi is EdgeInsets.zero vip is EdgeInsets(0.0, 24.0, 0.0, 0.0) font is Roboto
将屏幕width和height复制到textScale和devicePixelRatio到下面代码中的下一步。
- 编辑下面的代码以添加上述设置,因为我们想在测试中模拟这个精确的屏幕尺寸。
test/test.dart
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:my_app/main.dart';
void main() {
testWidgets(
"Emulate real screen size",
(WidgetTester tester) async {
// Adjust these to match your actual device screen specs
final width = 414;
final height = 846;
tester.binding.window.devicePixelRatioTestValue = (2.625);
tester.binding.window.textScaleFactorTestValue = (1.1);
final dpi = tester.binding.window.devicePixelRatio;
tester.binding.window.physicalSizeTestValue = Size(width * dpi, height * dpi);
await tester.pumpWidget(
MediaQuery(
data: MediaQueryData(),
child: MaterialApp(
home: TextScaleComparaison(),
),
),
);
await expectLater(
find.byType(TextScaleComparaison),
matchesGoldenFile("text.png"),
);
},
);
}
运行 test.dart 和 flutter test --update-goldens test/test.dart
这将在test/text.png创建一个png文件
检查日志:对我来说是打印的:
width is 414.0 and height is 846.0 and dpi is 2.625 txtScale is 1.1 vi is EdgeInsets.zero vip is EdgeInsets.zero font is Roboto
我错过了什么?为什么文字显示的不能和真机一模一样?
【问题讨论】:
标签: unit-testing flutter testing dart