flexible_space_bar_collapse_mode_test.dart 4.76 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

Dan Field's avatar
Dan Field committed
5
import 'package:flutter/foundation.dart';
6 7
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
8
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
9

10
final Key blockKey = UniqueKey();
11
const double expandedAppbarHeight = 250.0;
12
final Key appbarContainerKey = UniqueKey();
13 14

void main() {
15
  testWidgetsWithLeakTracking('FlexibleSpaceBar collapse mode none', (WidgetTester tester) async {
16
    await tester.pumpWidget(
17
      MaterialApp(
Dan Field's avatar
Dan Field committed
18
        theme: ThemeData(platform: debugDefaultTargetPlatformOverride),
19 20
        home: Scaffold(
          body: CustomScrollView(
21 22
            key: blockKey,
            slivers: <Widget>[
23
              SliverAppBar(
24 25
                expandedHeight: expandedAppbarHeight,
                pinned: true,
26 27
                flexibleSpace: FlexibleSpaceBar(
                  background: Container(
28 29 30 31 32
                    key: appbarContainerKey,
                  ),
                  collapseMode: CollapseMode.none,
                ),
              ),
33 34
              SliverToBoxAdapter(
                child: Container(
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
                  height: 10000.0,
                ),
              ),
            ],
          ),
        ),
      ),
    );

    final Finder appbarContainer = find.byKey(appbarContainerKey);
    final Offset topBeforeScroll = tester.getTopLeft(appbarContainer);
    await slowDrag(tester, blockKey, const Offset(0.0, -100.0));
    final Offset topAfterScroll = tester.getTopLeft(appbarContainer);

    expect(topBeforeScroll.dy, equals(0.0));
    expect(topAfterScroll.dy, equals(0.0));
51
  }, variant: TargetPlatformVariant.all(excluding: <TargetPlatform>{ TargetPlatform.fuchsia }));
52

53
  testWidgetsWithLeakTracking('FlexibleSpaceBar collapse mode pin', (WidgetTester tester) async {
54
    await tester.pumpWidget(
55
      MaterialApp(
Dan Field's avatar
Dan Field committed
56
        theme: ThemeData(platform: debugDefaultTargetPlatformOverride),
57 58
        home: Scaffold(
          body: CustomScrollView(
59 60
            key: blockKey,
            slivers: <Widget>[
61
              SliverAppBar(
62 63
                expandedHeight: expandedAppbarHeight,
                pinned: true,
64 65
                flexibleSpace: FlexibleSpaceBar(
                  background: Container(
66 67 68 69 70
                    key: appbarContainerKey,
                  ),
                  collapseMode: CollapseMode.pin,
                ),
              ),
71 72
              SliverToBoxAdapter(
                child: Container(
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
                  height: 10000.0,
                ),
              ),
            ],
          ),
        ),
      ),
    );

    final Finder appbarContainer = find.byKey(appbarContainerKey);
    final Offset topBeforeScroll = tester.getTopLeft(appbarContainer);
    await slowDrag(tester, blockKey, const Offset(0.0, -100.0));
    final Offset topAfterScroll = tester.getTopLeft(appbarContainer);

    expect(topBeforeScroll.dy, equals(0.0));
    expect(topAfterScroll.dy, equals(-100.0));
89
  }, variant: TargetPlatformVariant.all(excluding: <TargetPlatform>{ TargetPlatform.fuchsia }));
90

91
  testWidgetsWithLeakTracking('FlexibleSpaceBar collapse mode parallax', (WidgetTester tester) async {
92
    await tester.pumpWidget(
93
      MaterialApp(
Dan Field's avatar
Dan Field committed
94
        theme: ThemeData(platform: debugDefaultTargetPlatformOverride),
95 96
        home: Scaffold(
          body: CustomScrollView(
97 98
            key: blockKey,
            slivers: <Widget>[
99
              SliverAppBar(
100 101
                expandedHeight: expandedAppbarHeight,
                pinned: true,
102 103
                flexibleSpace: FlexibleSpaceBar(
                  background: Container(
104 105 106 107
                    key: appbarContainerKey,
                  ),
                ),
              ),
108 109
              SliverToBoxAdapter(
                child: Container(
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
                  height: 10000.0,
                ),
              ),
            ],
          ),
        ),
      ),
    );

    final Finder appbarContainer = find.byKey(appbarContainerKey);
    final Offset topBeforeScroll = tester.getTopLeft(appbarContainer);
    await slowDrag(tester, blockKey, const Offset(0.0, -100.0));
    final Offset topAfterScroll = tester.getTopLeft(appbarContainer);

    expect(topBeforeScroll.dy, equals(0.0));
    expect(topAfterScroll.dy, lessThan(10.0));
    expect(topAfterScroll.dy, greaterThan(-50.0));
127
  }, variant: TargetPlatformVariant.all(excluding: <TargetPlatform>{ TargetPlatform.fuchsia }));
128 129
}

130
Future<void> slowDrag(WidgetTester tester, Key widget, Offset offset) async {
131 132 133 134 135
  final Offset target = tester.getCenter(find.byKey(widget));
  final TestGesture gesture = await tester.startGesture(target);
  await gesture.moveBy(offset);
  await tester.pump(const Duration(milliseconds: 10));
  await gesture.up();
136
}