Skip to content

Commit ec9494f

Browse files
fix: 🐛 Fix old item returned from Animated Controller
1 parent 95cb366 commit ec9494f

File tree

2 files changed

+34
-6
lines changed

2 files changed

+34
-6
lines changed

lib/src/controller/auto_animated_sliver_list_controller.dart

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,10 @@ class AutoAnimateSliverListController<T> {
124124
_currentItems = newItems;
125125

126126
final provider = _tickerProvider;
127-
if (provider == null) return;
127+
if (provider == null) {
128+
Future.microtask(() => _isAddingItem = false);
129+
return;
130+
}
128131

129132
// Create animation controller for new item
130133
final moveController = AnimationController(
@@ -311,16 +314,17 @@ class AutoAnimateSliverListController<T> {
311314
});
312315
}
313316

314-
/// Do not use this method directly, use [updateItems]
317+
/// Do not use this method directly
315318
void updateItems(List<T> updatedItems) => _items = updatedItems;
316319

317-
/// Do not use this method directly, use [updateItemsWithAnimation]
320+
/// Do not use this method directly
318321
void updateItemsWithAnimation({
319322
required TickerProvider tickerProvider,
320323
required List<T> updatedItems,
324+
bool forceUpdate = false,
321325
}) {
322326
this._tickerProvider = tickerProvider;
323-
if (_isAddingItem || _isRemovingItem) return;
327+
if (!forceUpdate && (_isAddingItem || _isRemovingItem)) return;
324328

325329
final newItems = List<T>.from(_items);
326330
final newItemKeys = <String>{};
@@ -450,7 +454,7 @@ class AutoAnimateSliverListController<T> {
450454
}
451455

452456
void initialize({required TickerProvider tickerProvider}) {
453-
this._tickerProvider ??= tickerProvider;
457+
this._tickerProvider = tickerProvider;
454458

455459
final currentItemsLength = _currentItems.length;
456460
for (var i = 0; i < currentItemsLength; i++) {
@@ -474,4 +478,28 @@ class AutoAnimateSliverListController<T> {
474478
values[i].moveController.dispose();
475479
}
476480
}
481+
482+
/// Do not use this method directly
483+
/// Disposes all AnimationControllers and their tickers without disposing the controller itself.
484+
void disposeAnimations() {
485+
final values = _itemStates.values.toList();
486+
final valuesLength = values.length;
487+
for (var i = 0; i < valuesLength; i++) {
488+
final controller = values[i].moveController;
489+
controller
490+
..stop()
491+
..dispose();
492+
}
493+
// Clear the map to prevent reuse of disposed controllers
494+
_itemStates.clear();
495+
_itemKeys.clear();
496+
_removingItems.clear();
497+
_items.clear();
498+
_currentItems = List<T>.from(_items);
499+
_isNewItemAddedAtTop = false;
500+
_newItemHeight = 0.0;
501+
_isAddingItem = false;
502+
_isRemovingItem = false;
503+
_tickerProvider = null;
504+
}
477505
}

lib/src/controller/chat_list_controller.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ base class ChatViewListController {
148148
/// making changes.
149149
void removeChat(String chatId) {
150150
if (!_chatListMap.containsKey(chatId) ||
151-
!(_searchResultMap?.containsKey(chatId) ?? false)) {
151+
!(_searchResultMap?.containsKey(chatId) ?? true)) {
152152
return;
153153
}
154154
_searchResultMap?.remove(chatId);

0 commit comments

Comments
 (0)