sliver_fill_viewport_test.dart 5.45 KB
Newer Older
1 2 3 4 5 6 7 8 9
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/widgets.dart';

void main() {
  testWidgets('SliverFillRemaining control test', (WidgetTester tester) async {
10 11
    final List<Widget> children = List<Widget>.generate(20, (int i) {
      return Container(child: Text('$i', textDirection: TextDirection.ltr));
12 13 14
    });

    await tester.pumpWidget(
15
      Directionality(
16
        textDirection: TextDirection.ltr,
17
        child: CustomScrollView(
18
          slivers: <Widget>[
19
            SliverFillViewport(
20
              delegate: SliverChildListDelegate(children, addAutomaticKeepAlives: false, addSemanticIndexes: false),
21 22 23
            ),
          ],
        ),
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
      ),
    );

    final RenderBox box = tester.renderObject<RenderBox>(find.byType(Container).first);
    expect(box.size.height, equals(600.0));

    expect(find.text('0'), findsOneWidget);
    expect(find.text('1'), findsNothing);
    expect(find.text('2'), findsNothing);

    await tester.drag(find.byType(Scrollable), const Offset(0.0, -700.0));
    await tester.pump();

    expect(find.text('0'), findsNothing);
    expect(find.text('1'), findsOneWidget);
    expect(find.text('2'), findsOneWidget);
    expect(find.text('3'), findsNothing);
    expect(find.text('4'), findsNothing);

    await tester.drag(find.byType(Scrollable), const Offset(0.0, 200.0));
    await tester.pump();

    expect(find.text('0'), findsOneWidget);
    expect(find.text('1'), findsOneWidget);
    expect(find.text('2'), findsNothing);
    expect(find.text('3'), findsNothing);

    await tester.drag(find.byType(Scrollable), const Offset(0.0, 700.0));
    await tester.pump();

    final RenderBox box2 = tester.renderObject<RenderBox>(find.byType(Container).first);
    expect(box2.size.height, equals(600.0));

    expect(find.text('0'), findsOneWidget);
    expect(find.text('1'), findsNothing);
    expect(find.text('2'), findsNothing);
    expect(find.text('3'), findsNothing);
61 62

    final RenderObject viewport = tester.renderObject<RenderObject>(find.byType(SliverFillViewport).first);
63
    expect(viewport, hasAGoodToStringDeep);
64
    expect(
65
      viewport.toStringDeep(minLevel: DiagnosticLevel.info),
66 67
      equalsIgnoringHashCodes(
        'RenderSliverFillViewport#00000 relayoutBoundary=up1\n'
68
        ' │ needs compositing\n'
69 70 71 72
        ' │ parentData: paintOffset=Offset(0.0, 0.0) (can use size)\n'
        ' │ constraints: SliverConstraints(AxisDirection.down,\n'
        ' │   GrowthDirection.forward, ScrollDirection.idle, scrollOffset:\n'
        ' │   0.0, remainingPaintExtent: 600.0, crossAxisExtent: 800.0,\n'
73
        ' │   crossAxisDirection: AxisDirection.right,\n'
74 75
        ' │   viewportMainAxisExtent: 600.0, remainingCacheExtent: 850.0\n'
        ' │   cacheOrigin: 0.0 )\n'
76
        ' │ geometry: SliverGeometry(scrollExtent: 12000.0, paintExtent:\n'
77 78 79
        ' │   600.0, maxPaintExtent: 12000.0, hasVisualOverflow: true,\n'
        ' │   cacheExtent: 850.0)\n'
        ' │ currently live children: 0 to 1\n'
80
        ' │\n'
81
        ' ├─child with index 0: RenderRepaintBoundary#00000\n'
82
        ' │ │ needs compositing\n'
83 84 85 86
        ' │ │ parentData: index=0; layoutOffset=0.0\n'
        ' │ │ constraints: BoxConstraints(w=800.0, h=600.0)\n'
        ' │ │ layer: OffsetLayer#00000\n'
        ' │ │ size: Size(800.0, 600.0)\n'
87
        ' │ │ metrics: 66.7% useful (1 bad vs 2 good)\n'
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
        ' │ │ diagnosis: insufficient data to draw conclusion (less than five\n'
        ' │ │   repaints)\n'
        ' │ │\n'
        ' │ └─child: RenderParagraph#00000\n'
        ' │   │ parentData: <none> (can use size)\n'
        ' │   │ constraints: BoxConstraints(w=800.0, h=600.0)\n'
        ' │   │ size: Size(800.0, 600.0)\n'
        ' │   │ textAlign: start\n'
        ' │   │ textDirection: ltr\n'
        ' │   │ softWrap: wrapping at box width\n'
        ' │   │ overflow: clip\n'
        ' │   │ maxLines: unlimited\n'
        ' │   ╘═╦══ text ═══\n'
        ' │     ║ TextSpan:\n'
        ' │     ║   <all styles inherited>\n'
        ' │     ║   "0"\n'
        ' │     ╚═══════════\n'
        ' └─child with index 1: RenderRepaintBoundary#00000\n'
106
        '   │ needs compositing\n'
107
        '   │ parentData: index=1; layoutOffset=600.0\n'
108
        '   │ constraints: BoxConstraints(w=800.0, h=600.0)\n'
109
        '   │ layer: OffsetLayer#00000 DETACHED\n'
110
        '   │ size: Size(800.0, 600.0)\n'
111
        '   │ metrics: 50.0% useful (1 bad vs 1 good)\n'
112 113 114 115 116 117 118
        '   │ diagnosis: insufficient data to draw conclusion (less than five\n'
        '   │   repaints)\n'
        '   │\n'
        '   └─child: RenderParagraph#00000\n'
        '     │ parentData: <none> (can use size)\n'
        '     │ constraints: BoxConstraints(w=800.0, h=600.0)\n'
        '     │ size: Size(800.0, 600.0)\n'
Ian Hickson's avatar
Ian Hickson committed
119 120 121 122 123
        '     │ textAlign: start\n'
        '     │ textDirection: ltr\n'
        '     │ softWrap: wrapping at box width\n'
        '     │ overflow: clip\n'
        '     │ maxLines: unlimited\n'
124 125
        '     ╘═╦══ text ═══\n'
        '       ║ TextSpan:\n'
126
        '       ║   <all styles inherited>\n'
127
        '       ║   "1"\n'
128
        '       ╚═══════════\n'
129 130
      ),
    );
131 132
  });
}