From c9e6fa42b75142de1eaa1ebefe79174687b0f2d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Pedersen?= Date: Sun, 5 Jan 2025 22:49:24 +0100 Subject: [PATCH] Fixed bug where new chunks were not auto-synced horizontally --- lib/core/controllers.dart | 22 ++++++++++++-------- lib/widgets/table/table_widget.dart | 32 +++++++++++++++++++++++------ 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/lib/core/controllers.dart b/lib/core/controllers.dart index 20ee15b..8c921bc 100644 --- a/lib/core/controllers.dart +++ b/lib/core/controllers.dart @@ -3,10 +3,12 @@ import 'package:flutter/material.dart'; class ClampingScrollController extends ScrollController { @override void jumpTo(double value) { - final double maxScrollExtent = position.maxScrollExtent; - final double minScrollExtent = position.minScrollExtent; - final double clampedValue = value.clamp(minScrollExtent, maxScrollExtent); - super.jumpTo(clampedValue); + if (hasClients) { + final double maxScrollExtent = position.maxScrollExtent; + final double minScrollExtent = position.minScrollExtent; + final double clampedValue = value.clamp(minScrollExtent, maxScrollExtent); + super.jumpTo(clampedValue); + } } @override @@ -15,9 +17,13 @@ class ClampingScrollController extends ScrollController { required Duration duration, required Curve curve, }) { - final double maxScrollExtent = position.maxScrollExtent; - final double minScrollExtent = position.minScrollExtent; - final double clampedOffset = offset.clamp(minScrollExtent, maxScrollExtent); - return super.animateTo(clampedOffset, duration: duration, curve: curve); + if (hasClients) { + final double maxScrollExtent = position.maxScrollExtent; + final double minScrollExtent = position.minScrollExtent; + final double clampedOffset = + offset.clamp(minScrollExtent, maxScrollExtent); + return super.animateTo(clampedOffset, duration: duration, curve: curve); + } + return Future.value(); } } diff --git a/lib/widgets/table/table_widget.dart b/lib/widgets/table/table_widget.dart index 1018700..c2e28d0 100644 --- a/lib/widgets/table/table_widget.dart +++ b/lib/widgets/table/table_widget.dart @@ -35,21 +35,34 @@ class TableWidgetState extends State { final int _limit = 50; bool _isLoading = false; bool _hasMoreData = true; - final bool _isSyncing = false; + bool _isSyncing = false; ScrollController? _activeRowController; final List _rowControllers = []; String _searchQuery = ''; // Add search query state + double _globalHorizontalScrollPosition = + 0.0; // Global horizontal scroll position @override void initState() { super.initState(); _verticalScrollController .addListener(() => onScroll(_verticalScrollController, _loadNextChunk)); - _horizontalScrollController.addListener(() => onHorizontalScroll( - _horizontalScrollController, - _rowControllers, - _isSyncing, - _activeRowController)); + _horizontalScrollController.addListener(() { + _globalHorizontalScrollPosition = + _horizontalScrollController.position.pixels; + onHorizontalScroll(_horizontalScrollController, _rowControllers, + _isSyncing, _activeRowController); + }); + + // Add listener to sync horizontal scroll position on vertical scroll + _verticalScrollController.addListener(() { + for (final rowController in _rowControllers) { + if (rowController.hasClients) { + rowController.jumpTo(_horizontalScrollController.position.pixels); + } + } + }); + loadData(widget.selectedTable); } @@ -110,6 +123,13 @@ class TableWidgetState extends State { if (newData.length < _limit) { _hasMoreData = false; } + + // Add new row controllers and set their scroll position immediately + for (int i = _data.length - newData.length; i < _data.length; i++) { + final rowController = ClampingScrollController(); + _rowControllers.add(rowController); + rowController.jumpTo(_horizontalScrollController.position.pixels); + } }); }