From a606f84fa625b7713a5770ac35a4ce605a23b053 Mon Sep 17 00:00:00 2001 From: Anderson Silva <51444228+Mrprey@users.noreply.github.com> Date: Wed, 15 Oct 2025 10:58:51 -0300 Subject: [PATCH] Refactor body scrollbars into external wrapper --- lib/src/pluto_grid.dart | 2 +- lib/src/ui/pluto_body_rows.dart | 142 ++++++++++++++++++++------------ 2 files changed, 89 insertions(+), 55 deletions(-) diff --git a/lib/src/pluto_grid.dart b/lib/src/pluto_grid.dart index 074b854db..1ff26feb6 100644 --- a/lib/src/pluto_grid.dart +++ b/lib/src/pluto_grid.dart @@ -680,7 +680,7 @@ class PlutoGridState extends PlutoStateWithChange { /// Body columns and rows. LayoutId( id: _StackName.bodyRows, - child: PlutoBodyRows(_stateManager), + child: PlutoBodyRowsWithScrollbar(_stateManager), ), LayoutId( id: _StackName.bodyColumns, diff --git a/lib/src/ui/pluto_body_rows.dart b/lib/src/ui/pluto_body_rows.dart index fc37f7209..cd4160a76 100644 --- a/lib/src/ui/pluto_body_rows.dart +++ b/lib/src/ui/pluto_body_rows.dart @@ -4,28 +4,25 @@ import 'package:pluto_grid/pluto_grid.dart'; import '../helper/platform_helper.dart'; import 'ui.dart'; -class PlutoBodyRows extends PlutoStatefulWidget { +class PlutoBodyRowsWithScrollbar extends StatefulWidget { final PlutoGridStateManager stateManager; - const PlutoBodyRows( + const PlutoBodyRowsWithScrollbar( this.stateManager, { super.key, }); @override - PlutoBodyRowsState createState() => PlutoBodyRowsState(); + State createState() => + _PlutoBodyRowsWithScrollbarState(); } -class PlutoBodyRowsState extends PlutoStateWithChange { - List _columns = []; - - List _rows = []; - +class _PlutoBodyRowsWithScrollbarState + extends State { late final ScrollController _verticalScroll; late final ScrollController _horizontalScroll; - @override PlutoGridStateManager get stateManager => widget.stateManager; @override @@ -33,40 +30,19 @@ class PlutoBodyRowsState extends PlutoStateWithChange { super.initState(); _horizontalScroll = stateManager.scroll.horizontal!.addAndGet(); - stateManager.scroll.setBodyRowsHorizontal(_horizontalScroll); _verticalScroll = stateManager.scroll.vertical!.addAndGet(); - stateManager.scroll.setBodyRowsVertical(_verticalScroll); - - updateState(PlutoNotifierEventForceUpdate.instance); } @override void dispose() { _verticalScroll.dispose(); - _horizontalScroll.dispose(); - super.dispose(); } - @override - void updateState(PlutoNotifierEvent event) { - forceUpdate(); - - _columns = _getColumns(); - - _rows = stateManager.refRows; - } - - List _getColumns() { - return stateManager.showFrozenColumn == true - ? stateManager.bodyColumns - : stateManager.columns; - } - @override Widget build(BuildContext context) { final scrollbarConfig = stateManager.configuration.scrollbar; @@ -90,30 +66,88 @@ class PlutoBodyRowsState extends PlutoStateWithChange { radius: scrollbarConfig.scrollbarRadius, radiusWhileDragging: scrollbarConfig.scrollbarRadiusWhileDragging, longPressDuration: scrollbarConfig.longPressDuration, - child: SingleChildScrollView( - controller: _horizontalScroll, - scrollDirection: Axis.horizontal, - physics: const ClampingScrollPhysics(), - child: CustomSingleChildLayout( - delegate: ListResizeDelegate(stateManager, _columns), - child: ListView.builder( - controller: _verticalScroll, - scrollDirection: Axis.vertical, - physics: const ClampingScrollPhysics(), - itemCount: _rows.length, - itemExtent: stateManager.rowTotalHeight, - addRepaintBoundaries: false, - itemBuilder: (ctx, i) { - return PlutoBaseRow( - key: ValueKey('body_row_${_rows[i].key}'), - rowIdx: i, - row: _rows[i], - columns: _columns, - stateManager: stateManager, - visibilityLayout: true, - ); - }, - ), + child: PlutoBodyRows( + stateManager, + verticalScroll: _verticalScroll, + horizontalScroll: _horizontalScroll, + ), + ); + } +} + +class PlutoBodyRows extends PlutoStatefulWidget { + final PlutoGridStateManager stateManager; + + final ScrollController verticalScroll; + + final ScrollController horizontalScroll; + + const PlutoBodyRows( + this.stateManager, { + required this.verticalScroll, + required this.horizontalScroll, + super.key, + }); + + @override + PlutoBodyRowsState createState() => PlutoBodyRowsState(); +} + +class PlutoBodyRowsState extends PlutoStateWithChange { + List _columns = []; + + List _rows = []; + + @override + PlutoGridStateManager get stateManager => widget.stateManager; + + @override + void initState() { + super.initState(); + + updateState(PlutoNotifierEventForceUpdate.instance); + } + + @override + void updateState(PlutoNotifierEvent event) { + forceUpdate(); + + _columns = _getColumns(); + + _rows = stateManager.refRows; + } + + List _getColumns() { + return stateManager.showFrozenColumn == true + ? stateManager.bodyColumns + : stateManager.columns; + } + + @override + Widget build(BuildContext context) { + return SingleChildScrollView( + controller: widget.horizontalScroll, + scrollDirection: Axis.horizontal, + physics: const ClampingScrollPhysics(), + child: CustomSingleChildLayout( + delegate: ListResizeDelegate(stateManager, _columns), + child: ListView.builder( + controller: widget.verticalScroll, + scrollDirection: Axis.vertical, + physics: const ClampingScrollPhysics(), + itemCount: _rows.length, + itemExtent: stateManager.rowTotalHeight, + addRepaintBoundaries: false, + itemBuilder: (ctx, i) { + return PlutoBaseRow( + key: ValueKey('body_row_${_rows[i].key}'), + rowIdx: i, + row: _rows[i], + columns: _columns, + stateManager: stateManager, + visibilityLayout: true, + ); + }, ), ), );