在列表视图中显示多个子项时,如果某个子项不在屏幕上,则小部件测试无法找到该子项。下面是一个完整的例子:
主镖
import 'package:flutter/material.dart'; void main() => runApp(App()); class App extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp(home: Scaffold(body: Test())); } } class Test extends StatelessWidget { @override Widget build(BuildContext context) { return ListView( children: <Widget>[ Container( height: 600, color: Colors.red, ), Text("Find me!"), ], ); } }
主测试镖
import 'package:flutter_app/main.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { testWidgets("Find text", (WidgetTester tester) async { final testableWidget = App(); await tester.pumpWidget(testableWidget); expect(find.text("Find me!"), findsOneWidget); }); }
但是,如果我更改 Container 在主镖到 599 它起作用了。
Container
599
有人知道为什么会这样吗?是虫子吗?有办法解决吗?
测试应该像你的应用程序那样工作,否则,你的测试将变得无用(因为你没有测试真正的行为)。 因此,这不是一个bug。
您必须手动滚动 ListView 在您的测试中让它加载更多的小部件。
ListView
这可以用 tester
tester
final gesture = await tester.startGesture(Offset.zero /* THe position of your listview */ ); // Manual scroll await gesture.moveBy(const Offset(0, 100)); await tester.pump(); // flush the widget tree