Make updateUserScrollDirection protected (#13850)

diff --git a/packages/flutter/lib/src/widgets/scroll_position_with_single_context.dart b/packages/flutter/lib/src/widgets/scroll_position_with_single_context.dart
index a8a35bf..2e85ef9 100644
--- a/packages/flutter/lib/src/widgets/scroll_position_with_single_context.dart
+++ b/packages/flutter/lib/src/widgets/scroll_position_with_single_context.dart
@@ -165,7 +165,7 @@
   /// Set [userScrollDirection] to the given value.
   ///
   /// If this changes the value, then a [UserScrollNotification] is dispatched.
-  @visibleForTesting
+  @protected
   void updateUserScrollDirection(ScrollDirection value) {
     assert(value != null);
     if (userScrollDirection == value)
diff --git a/packages/flutter/test/widgets/linked_scroll_view_test.dart b/packages/flutter/test/widgets/linked_scroll_view_test.dart
index b967635..3cd7481 100644
--- a/packages/flutter/test/widgets/linked_scroll_view_test.dart
+++ b/packages/flutter/test/widgets/linked_scroll_view_test.dart
@@ -178,6 +178,10 @@
     assert(localOverscroll == 0.0 || (beforeOverscroll == 0.0 && afterOverscroll == 0.0));
   }
 
+  void _userMoved(ScrollDirection direction) {
+    updateUserScrollDirection(direction);
+  }
+
   LinkedScrollActivity link(LinkedScrollPosition driver) {
     if (this.activity is! LinkedScrollActivity)
       beginActivity(new LinkedScrollActivity(this));
@@ -239,7 +243,7 @@
       if (driver.userScrollDirection != commonDirection)
         commonDirection = ScrollDirection.idle;
     }
-    delegate.updateUserScrollDirection(commonDirection);
+    delegate._userMoved(commonDirection);
     return delegate.setPixels(delegate.pixels + delta);
   }
 
diff --git a/packages/flutter/test/widgets/slivers_appbar_floating_test.dart b/packages/flutter/test/widgets/slivers_appbar_floating_test.dart
index 04b10e8..e423ca0 100644
--- a/packages/flutter/test/widgets/slivers_appbar_floating_test.dart
+++ b/packages/flutter/test/widgets/slivers_appbar_floating_test.dart
@@ -187,7 +187,7 @@
     verifyPaintPosition(key3, const Offset(0.0, 0.0), true);
 
     position.animateTo(bigHeight + delegate.maxExtent * 1.9, curve: Curves.linear, duration: const Duration(minutes: 1));
-    position.updateUserScrollDirection(ScrollDirection.forward);
+    position.updateUserScrollDirection(ScrollDirection.forward); // ignore: invalid_use_of_protected_member
     await tester.pumpAndSettle(const Duration(milliseconds: 1000));
     verifyPaintPosition(key1, const Offset(0.0, 0.0), false);
     verifyPaintPosition(key2, const Offset(0.0, 0.0), true);