flexible_space_bar_collapse_mode_test.dart 4.82 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.

5 6
// @dart = 2.8

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

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

void main() {
Dan Field's avatar
Dan Field committed
16
  testWidgets('FlexibleSpaceBar collapse mode none', (WidgetTester tester) async {
17
    await tester.pumpWidget(
18
      MaterialApp(
Dan Field's avatar
Dan Field committed
19
        theme: ThemeData(platform: debugDefaultTargetPlatformOverride),
20 21
        home: Scaffold(
          body: CustomScrollView(
22 23
            key: blockKey,
            slivers: <Widget>[
24
              SliverAppBar(
25 26
                expandedHeight: expandedAppbarHeight,
                pinned: true,
27 28
                flexibleSpace: FlexibleSpaceBar(
                  background: Container(
29 30 31 32 33
                    key: appbarContainerKey,
                  ),
                  collapseMode: CollapseMode.none,
                ),
              ),
34 35
              SliverToBoxAdapter(
                child: Container(
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
                  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));
52
  }, variant: TargetPlatformVariant(TargetPlatform.values.where((TargetPlatform value) => value != TargetPlatform.fuchsia).toSet()));
53

Dan Field's avatar
Dan Field committed
54
  testWidgets('FlexibleSpaceBar collapse mode pin', (WidgetTester tester) async {
55
    await tester.pumpWidget(
56
      MaterialApp(
Dan Field's avatar
Dan Field committed
57
        theme: ThemeData(platform: debugDefaultTargetPlatformOverride),
58 59
        home: Scaffold(
          body: CustomScrollView(
60 61
            key: blockKey,
            slivers: <Widget>[
62
              SliverAppBar(
63 64
                expandedHeight: expandedAppbarHeight,
                pinned: true,
65 66
                flexibleSpace: FlexibleSpaceBar(
                  background: Container(
67 68 69 70 71
                    key: appbarContainerKey,
                  ),
                  collapseMode: CollapseMode.pin,
                ),
              ),
72 73
              SliverToBoxAdapter(
                child: Container(
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
                  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));
90
  }, variant: TargetPlatformVariant(TargetPlatform.values.where((TargetPlatform value) => value != TargetPlatform.fuchsia).toSet()));
91

Dan Field's avatar
Dan Field committed
92
  testWidgets('FlexibleSpaceBar collapse mode parallax', (WidgetTester tester) async {
93
    await tester.pumpWidget(
94
      MaterialApp(
Dan Field's avatar
Dan Field committed
95
        theme: ThemeData(platform: debugDefaultTargetPlatformOverride),
96 97
        home: Scaffold(
          body: CustomScrollView(
98 99
            key: blockKey,
            slivers: <Widget>[
100
              SliverAppBar(
101 102
                expandedHeight: expandedAppbarHeight,
                pinned: true,
103 104
                flexibleSpace: FlexibleSpaceBar(
                  background: Container(
105 106 107 108 109
                    key: appbarContainerKey,
                  ),
                  collapseMode: CollapseMode.parallax,
                ),
              ),
110 111
              SliverToBoxAdapter(
                child: Container(
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
                  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));
129
  }, variant: TargetPlatformVariant(TargetPlatform.values.where((TargetPlatform value) => value != TargetPlatform.fuchsia).toSet()));
130 131
}

132
Future<void> slowDrag(WidgetTester tester, Key widget, Offset offset) async {
133 134 135 136 137
  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();
138
}