SliverAppBar не плавает в тесте виджета - PullRequest
0 голосов
/ 02 апреля 2020

Я пишу тест виджета для моего экрана, и одним из требований является наличие теста для плавающего поведения 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);
  });
}
...