Я пишу тест виджета для моего экрана, и одним из требований является наличие теста для плавающего поведения SliverAppBar
. Однако я не могу заставить тест работать, потому что SliverAppBar
не всплывает, хотя тот же код работает правильно при запуске на реальном устройстве.
Для визуализации текущего экрана во время теста я сравниваю на экране с золотым файлом (который не существует) и запустите тест с flutter test --update-goldens
, чтобы позволить тесту создать золотой файл, и, конечно же, SliverAppBar
не появится в HomePage_golden_scroll3.png
. SliverAppBar
отображается только при полной прокрутке назад (т. Е. Он ведет себя так, как будто floating
равен false
.
Поскольку на реальном устройстве он работает просто отлично, мне интересно, что не так с мой тест?
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: CustomScrollView(
slivers: [
SliverAppBar(
floating: true,
title: Text('app bar title'),
),
SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) => ListTile(title: Text('test ' * index)),
childCount: 20,
),
),
],
),
);
}
}
void main() {
testWidgets('AppBar should hide on scroll', (WidgetTester tester) async {
await tester.pumpWidget(MaterialApp(home: HomePage()));
await expectLater(find.byType(HomePage),
matchesGoldenFile('HomePage_golden_scroll1.png'));
expect(find.byType(SliverAppBar), findsOneWidget);
var scrollableWidget = find.text('test ' * 8);
var originalPosition = tester.getRect(scrollableWidget);
// Scroll down.
final position =
tester.state<ScrollableState>(find.byType(Scrollable)).position;
position.jumpTo(500.0);
await tester.pump();
await expectLater(find.byType(HomePage),
matchesGoldenFile('HomePage_golden_scroll2.png'));
var afterScrollPosition = tester.getRect(scrollableWidget);
// Make sure the scroll worked, i.e. the view is big enough to scroll.
expect(afterScrollPosition.top, lessThan(originalPosition.top));
// Now the AppBar should be hidden.
expect(find.byType(SliverAppBar), findsNothing);
// When scrolling up again, the AppBar should be immediately visible
// again, not only when scrolling up completely.
position.jumpTo(350);
await tester.pump();
await expectLater(find.byType(HomePage),
matchesGoldenFile('HomePage_golden_scroll3.png'));
// AppBar should be visible again.
expect(find.byType(SliverAppBar), findsOneWidget);
});
}