refactor: enhance chat message handling and scrolling behavior

- Added `sendMessageWithContainer` function to facilitate message sending with a ProviderContainer.
- Updated `_ChatPageState` to improve scroll behavior, ensuring smoother auto-scrolling when near the bottom of the chat.
- Refactored scroll logic to simplify conditions for showing and hiding the scroll-to-bottom button.
- Adjusted the `OptimizedList` widget to correctly handle item indexing based on the reverse property, enhancing list performance and usability.
This commit is contained in:
cogwheel0
2025-09-30 21:17:11 +05:30
parent 7debb7a055
commit 46bd057089
4 changed files with 43 additions and 36 deletions

View File

@@ -146,6 +146,8 @@ class _OptimizedListState<T> extends ConsumerState<OptimizedList<T>> {
? const AlwaysScrollableScrollPhysics()
: const ClampingScrollPhysics());
final reverse = widget.reverse;
if (widget.separatorBuilder != null) {
listWidget = ListView.separated(
controller: _scrollController,
@@ -154,7 +156,7 @@ class _OptimizedListState<T> extends ConsumerState<OptimizedList<T>> {
keyboardDismissBehavior: widget.keyboardDismissBehavior,
shrinkWrap: widget.shrinkWrap,
scrollDirection: widget.scrollDirection,
reverse: widget.reverse,
reverse: reverse,
cacheExtent: widget.cacheExtent ?? 250.0,
addAutomaticKeepAlives: widget.addAutomaticKeepAlives,
addRepaintBoundaries: widget.addRepaintBoundaries,
@@ -165,7 +167,7 @@ class _OptimizedListState<T> extends ConsumerState<OptimizedList<T>> {
return _buildLoadMoreIndicator();
}
return _buildOptimizedItem(context, index);
return _buildOptimizedItem(context, index, reverse: reverse);
},
);
} else {
@@ -176,7 +178,7 @@ class _OptimizedListState<T> extends ConsumerState<OptimizedList<T>> {
keyboardDismissBehavior: widget.keyboardDismissBehavior,
shrinkWrap: widget.shrinkWrap,
scrollDirection: widget.scrollDirection,
reverse: widget.reverse,
reverse: reverse,
cacheExtent: widget.cacheExtent ?? 250.0,
addAutomaticKeepAlives: widget.addAutomaticKeepAlives,
addRepaintBoundaries: widget.addRepaintBoundaries,
@@ -187,7 +189,7 @@ class _OptimizedListState<T> extends ConsumerState<OptimizedList<T>> {
return _buildLoadMoreIndicator();
}
return _buildOptimizedItem(context, index);
return _buildOptimizedItem(context, index, reverse: reverse);
},
);
}
@@ -200,15 +202,21 @@ class _OptimizedListState<T> extends ConsumerState<OptimizedList<T>> {
return listWidget;
}
Widget _buildOptimizedItem(BuildContext context, int index) {
final item = widget.items[index];
Widget _buildOptimizedItem(
BuildContext context,
int index, {
required bool reverse,
}) {
final effectiveIndex = reverse ? widget.items.length - index - 1 : index;
final item = widget.items[effectiveIndex];
// Wrap in repaint boundary for performance
if (widget.addRepaintBoundaries) {
return RepaintBoundary(child: widget.itemBuilder(context, item, index));
return RepaintBoundary(
child: widget.itemBuilder(context, item, effectiveIndex),
);
}
return widget.itemBuilder(context, item, index);
return widget.itemBuilder(context, item, effectiveIndex);
}
Widget _buildLoadMoreIndicator() {