From c5fe5dd78f23fa5ec274995b352470ecf1a684c1 Mon Sep 17 00:00:00 2001 From: kmk Date: Fri, 24 Jun 2022 14:00:17 +0900 Subject: [PATCH 1/2] Add LinkedScrollControllerGroup.applyViewportDimension method. (cherry picked from commit ab07508b0d75c3cfe9c903461d65ef79fb7b2a09) --- .../linked_scroll_controller/CHANGELOG.md | 5 ++++ .../lib/linked_scroll_controller.dart | 7 ++++++ .../linked_scroll_controller/pubspec.yaml | 2 +- .../test/linked_scroll_controller_test.dart | 23 +++++++++++++++++++ 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/packages/linked_scroll_controller/CHANGELOG.md b/packages/linked_scroll_controller/CHANGELOG.md index 009ccd80..eda6fba7 100644 --- a/packages/linked_scroll_controller/CHANGELOG.md +++ b/packages/linked_scroll_controller/CHANGELOG.md @@ -1,3 +1,8 @@ +# 0.2.1 + +* Add `LinkedScrollControllerGroup.applyViewportDimension` method that applies + the viewportDimension 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..2460ff8f 100644 --- a/packages/linked_scroll_controller/lib/linked_scroll_controller.dart +++ b/packages/linked_scroll_controller/lib/linked_scroll_controller.dart @@ -88,6 +88,13 @@ 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); + } + } } /// 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..b81040e5 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,29 @@ 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, + ); + }); }); } From 18561d9866003c1199dc184dde67e5e1241ddd6b Mon Sep 17 00:00:00 2001 From: kmk Date: Fri, 24 Jun 2022 16:27:23 +0900 Subject: [PATCH 2/2] Add LinkedScrollControllerGroup.notifyListeners method. --- .../linked_scroll_controller/CHANGELOG.md | 2 ++ .../lib/linked_scroll_controller.dart | 7 ++++++ .../test/linked_scroll_controller_test.dart | 23 +++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/packages/linked_scroll_controller/CHANGELOG.md b/packages/linked_scroll_controller/CHANGELOG.md index eda6fba7..b6e8aa3d 100644 --- a/packages/linked_scroll_controller/CHANGELOG.md +++ b/packages/linked_scroll_controller/CHANGELOG.md @@ -2,6 +2,8 @@ * 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 diff --git a/packages/linked_scroll_controller/lib/linked_scroll_controller.dart b/packages/linked_scroll_controller/lib/linked_scroll_controller.dart index 2460ff8f..e8a816f7 100644 --- a/packages/linked_scroll_controller/lib/linked_scroll_controller.dart +++ b/packages/linked_scroll_controller/lib/linked_scroll_controller.dart @@ -95,6 +95,13 @@ class LinkedScrollControllerGroup { 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/test/linked_scroll_controller_test.dart b/packages/linked_scroll_controller/test/linked_scroll_controller_test.dart index b81040e5..b85f2f6d 100644 --- a/packages/linked_scroll_controller/test/linked_scroll_controller_test.dart +++ b/packages/linked_scroll_controller/test/linked_scroll_controller_test.dart @@ -333,6 +333,29 @@ void main() { 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); + }); }); }