scrollable_custom_scroll_behavior_test.dart 3.25 KB
Newer Older
1 2 3 4 5 6 7 8
// 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/material.dart';
import 'package:flutter/rendering.dart';

9 10
import 'test_widgets.dart';

11 12 13 14 15 16 17 18 19 20 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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
class TestScrollPosition extends ScrollPosition {
  TestScrollPosition(
    this.extentMultiplier,
    Scrollable2State state,
    Tolerance scrollTolerances,
    ScrollPosition oldPosition,
  ) : _pixels = 100.0, super(state, scrollTolerances, oldPosition);

  final double extentMultiplier;

  double _min, _viewport, _max, _pixels;

  @override
  double get pixels => _pixels;

  @override
  double setPixels(double value) {
    double oldPixels = _pixels;
    _pixels = value;
    dispatchNotification(activity.createScrollUpdateNotification(state, _pixels - oldPixels));
    return 0.0;
  }

  @override
  void correctBy(double correction) {
    _pixels += correction;
  }

  @override
  void applyViewportDimension(double viewportDimension) {
    _viewport = viewportDimension;
    super.applyViewportDimension(viewportDimension);
  }

  @override
  bool applyContentDimensions(double minScrollExtent, double maxScrollExtent) {
    _min = minScrollExtent;
    _max = maxScrollExtent;
    return super.applyContentDimensions(minScrollExtent, maxScrollExtent);
  }

  @override
  ScrollableMetrics getMetrics() {
    double insideExtent = _viewport;
    double beforeExtent = _pixels - _min;
    double afterExtent = _max - _pixels;
    if (insideExtent > 0.0) {
      return new ScrollableMetrics(
        extentBefore: extentMultiplier * beforeExtent / insideExtent,
        extentInside: extentMultiplier,
        extentAfter: extentMultiplier * afterExtent / insideExtent,
      );
    } else {
      return new ScrollableMetrics(
        extentBefore: 0.0,
        extentInside: 0.0,
        extentAfter: 0.0,
      );
    }
  }
}

class TestScrollBehavior extends ScrollBehavior2 {
  TestScrollBehavior(this.extentMultiplier);
  final double extentMultiplier;
76

77 78
  @override
  Widget wrap(BuildContext context, Widget child, AxisDirection axisDirection) => child;
79

80
  @override
Adam Barth's avatar
Adam Barth committed
81
  ScrollPosition createScrollPosition(BuildContext context, Scrollable2State state, ScrollPosition oldPosition, ScrollPhysics physics) {
82 83
    return new TestScrollPosition(extentMultiplier, state, ViewportScrollBehavior.defaultScrollTolerances, oldPosition);
  }
84

85 86 87 88 89 90 91 92
  @override
  bool shouldNotify(TestScrollBehavior oldDelegate) {
    return extentMultiplier != oldDelegate.extentMultiplier;
  }
}

void main() {
  testWidgets('Changing the scroll behavior dynamically', (WidgetTester tester) async {
93
    await tester.pumpWidget(new TestScrollable(
94
      scrollBehavior: new TestScrollBehavior(1.0),
95
      slivers: <Widget>[
96 97 98
        new SliverToBoxAdapter(child: new SizedBox(height: 2000.0)),
      ],
    ));
99 100 101
    Scrollable2State state = tester.state(find.byType(Scrollable2));

    expect(state.position.getMetrics().extentInside, 1.0);
102
    await tester.pumpWidget(new TestScrollable(
103
      scrollBehavior: new TestScrollBehavior(2.0),
104
      slivers: <Widget>[
105 106 107
        new SliverToBoxAdapter(child: new SizedBox(height: 2000.0)),
      ],
    ));
108
    expect(state.position.getMetrics().extentInside, 2.0);
109
  });
110
}