Flutter 如何在不同的屏幕大小上测试颤振小部件?
我有一个flatter小部件,它根据屏幕大小显示额外的数据。有人知道在多个不同的屏幕大小上测试这个小部件的方法吗Flutter 如何在不同的屏幕大小上测试颤振小部件?,flutter,flutter-test,Flutter,Flutter Test,我有一个flatter小部件,它根据屏幕大小显示额外的数据。有人知道在多个不同的屏幕大小上测试这个小部件的方法吗 我查看了源代码,但找不到任何内容。您可以使用 以下代码将运行屏幕大小为42x42的测试 import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { testWidgets("foo", (tester) async { test
我查看了源代码,但找不到任何内容。您可以使用 以下代码将运行屏幕大小为42x42的测试
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets("foo", (tester) async {
tester.binding.window.physicalSizeTestValue = Size(42, 42);
// resets the screen to its orinal size after the test end
addTearDown(tester.binding.window.clearPhysicalSizeTestValue);
// TODO: do something
});
}
尽管@Rémi Rousselet的回答很有帮助,但并没有完全解决我的问题。事实证明,我可以将测试中的小部件包装在
MediaQuery
小部件中并设置大小
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
Widget makeTestableWidget({Widget child, Size size}) {
return MaterialApp(
home: MediaQuery(
data: MediaQueryData(size: size),
child: child,
),
);
}
testWidgets("tablet", (tester) async {
final testableWidget = makeTestableWidget(
child: WidgetUnderTest(),
size: Size(1024, 768),
);
...
});
testWidgets("phone", (tester) async {
final testableWidget = makeTestableWidget(
child: WidgetUnderTest(),
size: Size(375, 812),
);
...
});
}
不知道为什么,@rémi rousselet的解决方案对我不起作用。我必须使用
binding.window.physicalSizeTestValue
和binding.window.devicePixelRatioTestValue
指定屏幕大小,以便输出是完全确定的
我为像我这样的颤振初学者添加了更多的代码。选中此项:
void main() {
final TestWidgetsFlutterBinding binding =
TestWidgetsFlutterBinding.ensureInitialized();
testWidgets("Basic layout test (mobile device)", (tester) async {
binding.window.physicalSizeTestValue = Size(400, 200);
binding.window.devicePixelRatioTestValue = 1.0;
await tester.pumpWidget(new MyApp());
expect(find.byType(MyHomePage), findsOneWidget);
// etc.
});
}
@rémi rousselet的解决方案非常有效 此外,如果要测试方向更改,请尝试以下操作:
const double PORTRAIT_WIDTH = 400.0;
const double PORTRAIT_HEIGHT = 800.0;
const double LANDSCAPE_WIDTH = PORTRAIT_HEIGHT;
const double LANDSCAPE_HEIGHT = PORTRAIT_WIDTH;
final TestWidgetsFlutterBinding binding = TestWidgetsFlutterBinding.ensureInitialized();
await binding.setSurfaceSize(Size(PORTRAIT_WIDTH, PORTRAIT_HEIGHT));
await tester.pumpWidget(MyWidget());
// test in portrait
await binding.setSurfaceSize(Size(LANDSCAPE_WIDTH, LANDSCAPE_HEIGHT));
await tester.pumpAndSettle();
// OrientationBuilder gets triggered
// test in landscape
有一个名为的软件包可以模拟在不同设备上运行的颤振应用程序
您可以尝试此小部件来测试小部件实时更改屏幕大小 屏幕大小测试 预览 演示 代码示例
import'package:screen_size_test/screen_size_test.dart';
...
材料聚丙烯(
标题:“演示”,
生成器:(上下文,子项)=>ScreenSizeTest(
孩子:孩子,
),
家:脚手架(
正文:ListView(
子项:List.generate(
20,
(索引)=>容器(
填充:边缘设置。全部(10),
子:占位符(),
)),
),
),
)
通过测试,你指的是单元测试/类似测试还是手动测试?通过测试,我指的是小部件测试,就像在测试特定小部件是否可见时一样,类似于单元测试。那不完全是真的。它并没有真正改变大小,而是模拟MediaQuery。像LayoutBuilder
或RenderObjects
或golden tests之类的东西仍将基于默认大小。啊,好的,当我尝试使用TestWidgetsFlutterBinding时,它没有任何影响,因为在我的小部件中,我从MaterialApp小部件创建的MediaQuery获取屏幕大小。如果我删除MaterialApp小部件,它会抛出一个关于textDirection为null的错误,因此这似乎是最好的选项,但显然不是所有情况下的最佳选项。我建议将我的答案标记为解决方案(除非您不同意),由于模拟MediaQuery很少需要解决方案。如果一个具有Scaffold父项的小部件正在测试中,则需要添加Material app作为包装,如下所示:Wait tester.pumpWidget(new MaterialApp(home:new LoginScreen());默认尺寸是多少?我做了1200,2400,它仍然比默认的尺寸小。它的宽度是800,高度是600@RémiRousselet我听从了你的建议,但它对我来说不起作用texts@RémiRousselet签出并感谢,这一个对我有效(setSurfaceSize没有)。同样,setSurfaceSize()对我无效,但您的解决方案对我有效。谢谢。@VizGhar我听从了你的建议,但我无法正确处理文本签出,添加devicePixelRatioTestValue
效果很好!它工作得很好。谢谢你,Slider不是wokring