ソースを参照

fix: listen on the scroll position changed after widget was dpated

appflowy 2 年 前
コミット
fa7390066c

+ 23 - 23
frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/scrolling/styled_scroll_bar.dart

@@ -17,10 +17,6 @@ class StyledScrollbar extends StatefulWidget {
   final bool autoHideScrollbar;
   final Color? handleColor;
   final Color? trackColor;
-
-  // ignore: todo
-  // TODO: Remove contentHeight if we can fix this issue
-  // https://stackoverflow.com/questions/60855712/flutter-how-to-force-scrollcontroller-to-recalculate-position-maxextents
   final double? contentSize;
 
   const StyledScrollbar(
@@ -48,25 +44,7 @@ class ScrollbarState extends State<StyledScrollbar> {
   @override
   void initState() {
     widget.controller.addListener(() => setState(() {}));
-    widget.controller.position.isScrollingNotifier.addListener(
-      () {
-        if (!mounted) return;
-        if (!widget.autoHideScrollbar) return;
-        _hideScrollbarOperation?.cancel();
-        if (!widget.controller.position.isScrollingNotifier.value) {
-          _hideScrollbarOperation = CancelableOperation.fromFuture(
-            Future.delayed(const Duration(seconds: 2), () {}),
-          ).then((_) {
-            hideHandler = true;
-            if (mounted) {
-              setState(() {});
-            }
-          });
-        } else {
-          hideHandler = false;
-        }
-      },
-    );
+    _listenOnScrollPositionChanged();
     super.initState();
   }
 
@@ -77,6 +55,7 @@ class ScrollbarState extends State<StyledScrollbar> {
 
   @override
   void didUpdateWidget(StyledScrollbar oldWidget) {
+    _listenOnScrollPositionChanged();
     if (oldWidget.contentSize != widget.contentSize) setState(() {});
     super.didUpdateWidget(oldWidget);
   }
@@ -210,6 +189,27 @@ class ScrollbarState extends State<StyledScrollbar> {
         .clamp(0.0, widget.controller.position.maxScrollExtent));
     widget.onDrag?.call(details.delta.dy);
   }
+
+  void _listenOnScrollPositionChanged() {
+    widget.controller.position.isScrollingNotifier.addListener(
+      () {
+        if (!mounted) return;
+        if (!widget.autoHideScrollbar) return;
+
+        _hideScrollbarOperation?.cancel();
+        if (!widget.controller.position.isScrollingNotifier.value) {
+          _hideScrollbarOperation = CancelableOperation.fromFuture(
+            Future.delayed(const Duration(seconds: 2), () {}),
+          ).then((_) {
+            hideHandler = true;
+            if (mounted) setState(() {});
+          });
+        } else {
+          hideHandler = false;
+        }
+      },
+    );
+  }
 }
 
 class ScrollbarListStack extends StatelessWidget {

+ 6 - 1
frontend/app_flowy/packages/flowy_infra_ui/lib/style_widget/scrolling/styled_scrollview.dart

@@ -43,7 +43,9 @@ class StyledSingleChildScrollViewState
 
   @override
   void dispose() {
-    // scrollController.dispose();
+    if (widget.controller == null) {
+      scrollController.dispose();
+    }
     super.dispose();
   }
 
@@ -109,6 +111,9 @@ class StyledCustomScrollViewState extends State<StyledCustomScrollView> {
 
   @override
   void dispose() {
+    if (widget.verticalController == null) {
+      controller.dispose();
+    }
     super.dispose();
   }