sliver_appbar_opacity_test.dart 8.17 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
import 'package:flutter/material.dart';
6 7
import 'package:flutter/rendering.dart';
import 'package:flutter_test/flutter_test.dart';
8
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
9 10

void main() {
11
  testWidgetsWithLeakTracking('!pinned && !floating && !bottom ==> fade opacity', (WidgetTester tester) async {
12
    final ScrollController controller = ScrollController();
13
    addTearDown(controller.dispose);
14 15 16 17 18 19
    await tester.pumpWidget(
        _TestWidget(
          pinned: false,
          floating: false,
          bottom: false,
          controller: controller,
20
        ),
21 22 23
    );

    final RenderParagraph render = tester.renderObject(find.text('Hallo Welt!!1'));
24
    expect(render.text.style!.color!.opacity, 1.0);
25 26 27

    controller.jumpTo(200.0);
    await tester.pumpAndSettle();
28
    expect(render.text.style!.color!.opacity, 0.0);
29 30
  });

31
  testWidgetsWithLeakTracking('!pinned && !floating && bottom ==> fade opacity', (WidgetTester tester) async {
32
    final ScrollController controller = ScrollController();
33
    addTearDown(controller.dispose);
34 35 36 37 38 39
    await tester.pumpWidget(
        _TestWidget(
          pinned: false,
          floating: false,
          bottom: true,
          controller: controller,
40
        ),
41 42 43
    );

    final RenderParagraph render = tester.renderObject(find.text('Hallo Welt!!1'));
44
    expect(render.text.style!.color!.opacity, 1.0);
45 46 47

    controller.jumpTo(200.0);
    await tester.pumpAndSettle();
48
    expect(render.text.style!.color!.opacity, 0.0);
49 50
  });

51
  testWidgetsWithLeakTracking('!pinned && floating && !bottom ==> fade opacity', (WidgetTester tester) async {
52
    final ScrollController controller = ScrollController();
53
    addTearDown(controller.dispose);
54 55 56 57 58 59
    await tester.pumpWidget(
        _TestWidget(
          pinned: false,
          floating: true,
          bottom: false,
          controller: controller,
60
        ),
61 62 63
    );

    final RenderParagraph render = tester.renderObject(find.text('Hallo Welt!!1'));
64
    expect(render.text.style!.color!.opacity, 1.0);
65 66 67

    controller.jumpTo(200.0);
    await tester.pumpAndSettle();
68
    expect(render.text.style!.color!.opacity, 0.0);
69 70
  });

71
  testWidgetsWithLeakTracking('!pinned && floating && bottom ==> fade opacity', (WidgetTester tester) async {
72
    final ScrollController controller = ScrollController();
73
    addTearDown(controller.dispose);
74 75 76 77 78 79
    await tester.pumpWidget(
        _TestWidget(
          pinned: false,
          floating: true,
          bottom: true,
          controller: controller,
80
        ),
81 82 83
    );

    final RenderParagraph render = tester.renderObject(find.text('Hallo Welt!!1'));
84
    expect(render.text.style!.color!.opacity, 1.0);
85 86 87

    controller.jumpTo(200.0);
    await tester.pumpAndSettle();
88
    expect(render.text.style!.color!.opacity, 0.0);
89 90
  });

91
  testWidgetsWithLeakTracking('pinned && !floating && !bottom ==> 1.0 opacity', (WidgetTester tester) async {
92
    final ScrollController controller = ScrollController();
93
    addTearDown(controller.dispose);
94 95 96 97 98 99
    await tester.pumpWidget(
        _TestWidget(
          pinned: true,
          floating: false,
          bottom: false,
          controller: controller,
100
        ),
101 102 103
    );

    final RenderParagraph render = tester.renderObject(find.text('Hallo Welt!!1'));
104
    expect(render.text.style!.color!.opacity, 1.0);
105 106 107

    controller.jumpTo(200.0);
    await tester.pumpAndSettle();
108
    expect(render.text.style!.color!.opacity, 1.0);
109 110
  });

111
  testWidgetsWithLeakTracking('pinned && !floating && bottom ==> 1.0 opacity', (WidgetTester tester) async {
112
    final ScrollController controller = ScrollController();
113
    addTearDown(controller.dispose);
114 115 116 117 118 119
    await tester.pumpWidget(
        _TestWidget(
          pinned: true,
          floating: false,
          bottom: true,
          controller: controller,
120
        ),
121 122 123
    );

    final RenderParagraph render = tester.renderObject(find.text('Hallo Welt!!1'));
124
    expect(render.text.style!.color!.opacity, 1.0);
125 126 127

    controller.jumpTo(200.0);
    await tester.pumpAndSettle();
128
    expect(render.text.style!.color!.opacity, 1.0);
129 130
  });

131
  testWidgetsWithLeakTracking('pinned && floating && !bottom ==> 1.0 opacity', (WidgetTester tester) async {
132 133 134
    // Regression test for https://github.com/flutter/flutter/issues/25000.

    final ScrollController controller = ScrollController();
135
    addTearDown(controller.dispose);
136 137 138 139 140 141
    await tester.pumpWidget(
        _TestWidget(
          pinned: true,
          floating: true,
          bottom: false,
          controller: controller,
142
        ),
143 144 145
    );

    final RenderParagraph render = tester.renderObject(find.text('Hallo Welt!!1'));
146
    expect(render.text.style!.color!.opacity, 1.0);
147 148 149

    controller.jumpTo(200.0);
    await tester.pumpAndSettle();
150
    expect(render.text.style!.color!.opacity, 1.0);
151 152
  });

153
  testWidgetsWithLeakTracking('pinned && floating && bottom && extraToolbarHeight == 0.0 ==> fade opacity', (WidgetTester tester) async {
154 155 156
    // Regression test for https://github.com/flutter/flutter/issues/25993.

    final ScrollController controller = ScrollController();
157
    addTearDown(controller.dispose);
158 159 160 161 162 163
    await tester.pumpWidget(
      _TestWidget(
        pinned: true,
        floating: true,
        bottom: true,
        controller: controller,
164
      ),
165 166 167
    );

    final RenderParagraph render = tester.renderObject(find.text('Hallo Welt!!1'));
168
    expect(render.text.style!.color!.opacity, 1.0);
169 170 171

    controller.jumpTo(200.0);
    await tester.pumpAndSettle();
172
    expect(render.text.style!.color!.opacity, 0.0);
173
  });
174

175
  testWidgetsWithLeakTracking('pinned && floating && bottom && extraToolbarHeight != 0.0 ==> 1.0 opacity', (WidgetTester tester) async {
176
    final ScrollController controller = ScrollController();
177
    addTearDown(controller.dispose);
178 179 180 181 182 183 184 185 186 187 188
    await tester.pumpWidget(
      _TestWidget(
        pinned: true,
        floating: true,
        bottom: true,
        collapsedHeight: 100.0,
        controller: controller,
      ),
    );

    final RenderParagraph render = tester.renderObject(find.text('Hallo Welt!!1'));
189
    expect(render.text.style!.color!.opacity, 1.0);
190 191 192

    controller.jumpTo(200.0);
    await tester.pumpAndSettle();
193
    expect(render.text.style!.color!.opacity, 1.0);
194 195
  });

196
  testWidgetsWithLeakTracking('!pinned && !floating && !bottom && extraToolbarHeight != 0.0 ==> fade opacity', (WidgetTester tester) async {
197
    final ScrollController controller = ScrollController();
198
    addTearDown(controller.dispose);
199 200 201 202 203 204 205 206 207 208 209 210
    const double collapsedHeight = 100.0;
    await tester.pumpWidget(
        _TestWidget(
          pinned: false,
          floating: false,
          bottom: false,
          controller: controller,
          collapsedHeight: collapsedHeight,
        ),
    );

    final RenderParagraph render = tester.renderObject(find.text('Hallo Welt!!1'));
211
    expect(render.text.style!.color!.opacity, 1.0);
212 213 214

    controller.jumpTo(collapsedHeight);
    await tester.pumpAndSettle();
215
    expect(render.text.style!.color!.opacity, 0.0);
216
  });
217 218 219 220
}

class _TestWidget extends StatelessWidget {

221
  const _TestWidget({
222 223 224
    required this.pinned,
    required this.floating,
    required this.bottom,
225 226 227
    this.controller,
    this.collapsedHeight,
  });
228 229 230 231

  final bool pinned;
  final bool floating;
  final bool bottom;
232 233
  final ScrollController? controller;
  final double? collapsedHeight;
234 235 236 237 238 239 240 241 242 243 244

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: CustomScrollView(
        controller: controller,
        slivers: <Widget>[
          SliverAppBar(
            pinned: pinned,
            floating: floating,
            expandedHeight: 120.0,
245
            collapsedHeight: collapsedHeight,
246 247 248 249 250 251 252 253
            title: const Text('Hallo Welt!!1'),
            bottom: !bottom ? null :  PreferredSize(
              preferredSize: const Size.fromHeight(35.0),
              child: Container(),
            ),
          ),
          SliverList(
            delegate: SliverChildListDelegate(List<Widget>.generate(20, (int i) {
254
              return SizedBox(
255
                height: 100.0,
256
                child: Text('Tile $i'),
257 258
              );
            })),
259
          ),
260 261 262 263 264 265
        ],
      ),
    );
  }

}