diff --git a/packages/linked_scroll_controller/CHANGELOG.md b/packages/linked_scroll_controller/CHANGELOG.md index 009ccd80..b6e8aa3d 100644 --- a/packages/linked_scroll_controller/CHANGELOG.md +++ b/packages/linked_scroll_controller/CHANGELOG.md @@ -1,3 +1,10 @@ +# 0.2.1 + +* Add `LinkedScrollControllerGroup.applyViewportDimension` method that applies + the viewportDimension of all linked controllers. +* Add `LinkedScrollControllerGroup.notifyListeners` method that notifies + the listener of all linked controllers. + # 0.2.0 * Stable release for null safety. diff --git a/packages/linked_scroll_controller/lib/linked_scroll_controller.dart b/packages/linked_scroll_controller/lib/linked_scroll_controller.dart index d90a011e..e8a816f7 100644 --- a/packages/linked_scroll_controller/lib/linked_scroll_controller.dart +++ b/packages/linked_scroll_controller/lib/linked_scroll_controller.dart @@ -88,6 +88,20 @@ class LinkedScrollControllerGroup { void resetScroll() { jumpTo(0.0); } + + /// Applies the viewportDimension of all linked controllers to [value]. + void applyViewportDimension(double value) { + for (final controller in _attachedControllers) { + controller.position.applyViewportDimension(value); + } + } + + /// Notifies the scroll listener of all linked controllers. + void notifyListeners() { + for (final controller in _attachedControllers) { + controller.position.notifyListeners(); + } + } } /// This class provides change notification for [LinkedScrollControllerGroup]'s diff --git a/packages/linked_scroll_controller/pubspec.yaml b/packages/linked_scroll_controller/pubspec.yaml index d1f2f7c7..00c73790 100644 --- a/packages/linked_scroll_controller/pubspec.yaml +++ b/packages/linked_scroll_controller/pubspec.yaml @@ -1,5 +1,5 @@ name: linked_scroll_controller -version: 0.2.0 +version: 0.2.1 description: > A scroll controller that allows two or more scroll views to be in sync. repository: https://github.com/google/flutter.widgets/tree/master/packages/linked_scroll_controller diff --git a/packages/linked_scroll_controller/test/linked_scroll_controller_test.dart b/packages/linked_scroll_controller/test/linked_scroll_controller_test.dart index b29061bf..b85f2f6d 100644 --- a/packages/linked_scroll_controller/test/linked_scroll_controller_test.dart +++ b/packages/linked_scroll_controller/test/linked_scroll_controller_test.dart @@ -310,6 +310,52 @@ void main() { expect(state._controllers.offset, equals(state._letters.offset)); expect(state._controllers.offset, equals(state._numbers.offset)); }); + + testWidgets('applyViewportDimensions.', (tester) async { + await tester.pumpWidget(Test()); + final state = tester.state(find.byType(Test)); + + final viewportDimension = state._letters.position.viewportDimension; + + // Change the viewportDimension. + final double changedViewportDimension = viewportDimension - 100; + state._controllers.applyViewportDimension(changedViewportDimension); + + await tester.pumpAndSettle(); + + // The viewportDimension of the connected controllers should change. + expect( + state._letters.position.viewportDimension, + changedViewportDimension, + ); + expect( + state._numbers.position.viewportDimension, + changedViewportDimension, + ); + }); + + testWidgets('notifyListeners.', (tester) async { + await tester.pumpWidget(Test()); + final state = tester.state(find.byType(Test)); + + int countLettersCalls = 0; + int countNumbersCalls = 0; + + // Add listeners. + state._letters.addListener(() { + countLettersCalls += 1; + }); + state._letters.addListener(() { + countNumbersCalls += 1; + }); + + // Notify listeners. + state._controllers.notifyListeners(); + + // The listener of the registered ScrollController should be called once. + expect(countLettersCalls, 1); + expect(countNumbersCalls, 1); + }); }); }