gpt4 book ai didi

testing - 为什么 TestGesture.moveBy 在 TabBarView 中无法滚动?

转载 作者:IT王子 更新时间:2023-10-29 06:56:34 27 4
gpt4 key购买 nike

我在 TabBarView 中有 ListView 小部件,以允许用户滚动浏览每个选项卡的内容。我想测试一些屏幕外的小部件。我按照这个滚动 ListView 以将相关的小部件显示在屏幕上:

How to find off-screen ListView child in widget tests?

在我将 ListView 放入 TabBarView 之前,它工作正常,然后失败。

我在 TabBarView 中重建了没有 ListView 的代码并且测试通过了。将 ListView 放在 TabBarView 中会导致测试失败:

'zero widgets with text "bbb" (ignoring offstage widgets)'

debugDumpApp() 输出显示这是因为没有滚动。

我的有状态小部件:

class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> with SingleTickerProviderStateMixin {
TabController _tabController;

@override
void initState() {
super.initState();
_tabController = TabController(length: 2, vsync: this);
}

@override
void dispose() {
_tabController.dispose();
super.dispose();
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Scroll test'),
),
body: NestedScrollView(
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return [
SliverAppBar(
expandedHeight: 100.0,
bottom: TabBar(
controller: _tabController,
tabs: <Widget>[
Tab(
child: Text('Tab one'),
),
Tab(
child: Text('Tab two'),
)
],
),
)
];
},
body: TabBarView(
controller: _tabController,
children: <Widget>[
ListView(
children: <Widget>[
Container(
height: 800.0,
child: Text('aaa'),
),
Text('bbb')
],
),
ListView(
children: <Widget>[
Container(
height: 800.0,
child: Text('ccc'),
),
Text('ddd')
],
),
],
)
)
);
}
}

我的测试:

void main() {
Widget buildTestableWidget(Widget widget) {
return new MediaQuery(
data: new MediaQueryData(), child: new MaterialApp(home: widget));
}

Home home = Home();

testWidgets('scroll test', (WidgetTester tester) async {
await tester.pumpWidget(buildTestableWidget(home));

expect(find.text('aaa'), findsOneWidget);
expect(find.text('bbb'), findsNothing);

final Offset point = tester.getCenter(find.text("aaa"));
final gesture = await tester.startGesture(point);
await gesture.moveBy(const Offset(0.0, -400.0));

await tester.pump();

expect(find.text('bbb'), findsOneWidget);
});

}

这是一个错误还是我需要做一些不同的事情才能让 TestGesture.moveBy 在 TabBarView 中工作?非常感谢您的帮助。

最佳答案

我认为这个问题与拖动在可滚动区域之外结束这一事实有关,WidgetTester 有一个名为 dragFrom 的方法它会为您处理这种情况。

testWidgets('scroll test', (WidgetTester tester) async {
await tester.pumpWidget(buildTestableWidget(home));

expect(find.text('aaa'), findsOneWidget);
expect(find.text('bbb'), findsNothing);

final Offset point = tester.getCenter(find.text("aaa"));
await tester.dragFrom(point, Offset(0.0, -400.0));

await tester.pump();

expect(find.text('bbb'), findsOneWidget);
});

关于testing - 为什么 TestGesture.moveBy 在 TabBarView 中无法滚动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56631961/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com