diff --git a/lib/src/controller/auto_animated_sliver_list_controller.dart b/lib/src/controller/auto_animated_sliver_list_controller.dart index e60893a..852e196 100644 --- a/lib/src/controller/auto_animated_sliver_list_controller.dart +++ b/lib/src/controller/auto_animated_sliver_list_controller.dart @@ -124,7 +124,10 @@ class AutoAnimateSliverListController { _currentItems = newItems; final provider = _tickerProvider; - if (provider == null) return; + if (provider == null) { + Future.microtask(() => _isAddingItem = false); + return; + } // Create animation controller for new item final moveController = AnimationController( @@ -311,16 +314,17 @@ class AutoAnimateSliverListController { }); } - /// Do not use this method directly, use [updateItems] + /// Do not use this method directly void updateItems(List updatedItems) => _items = updatedItems; - /// Do not use this method directly, use [updateItemsWithAnimation] + /// Do not use this method directly void updateItemsWithAnimation({ required TickerProvider tickerProvider, required List updatedItems, + bool forceUpdate = false, }) { this._tickerProvider = tickerProvider; - if (_isAddingItem || _isRemovingItem) return; + if (!forceUpdate && (_isAddingItem || _isRemovingItem)) return; final newItems = List.from(_items); final newItemKeys = {}; @@ -450,7 +454,7 @@ class AutoAnimateSliverListController { } void initialize({required TickerProvider tickerProvider}) { - this._tickerProvider ??= tickerProvider; + this._tickerProvider = tickerProvider; final currentItemsLength = _currentItems.length; for (var i = 0; i < currentItemsLength; i++) { @@ -474,4 +478,28 @@ class AutoAnimateSliverListController { values[i].moveController.dispose(); } } + + /// Do not use this method directly + /// Disposes all AnimationControllers and their tickers without disposing the controller itself. + void disposeAnimations() { + final values = _itemStates.values.toList(); + final valuesLength = values.length; + for (var i = 0; i < valuesLength; i++) { + final controller = values[i].moveController; + controller + ..stop() + ..dispose(); + } + // Clear the map to prevent reuse of disposed controllers + _itemStates.clear(); + _itemKeys.clear(); + _removingItems.clear(); + _items.clear(); + _currentItems = List.from(_items); + _isNewItemAddedAtTop = false; + _newItemHeight = 0.0; + _isAddingItem = false; + _isRemovingItem = false; + _tickerProvider = null; + } } diff --git a/lib/src/controller/chat_list_controller.dart b/lib/src/controller/chat_list_controller.dart index 34eba21..d43d749 100644 --- a/lib/src/controller/chat_list_controller.dart +++ b/lib/src/controller/chat_list_controller.dart @@ -148,7 +148,7 @@ base class ChatViewListController { /// making changes. void removeChat(String chatId) { if (!_chatListMap.containsKey(chatId) || - !(_searchResultMap?.containsKey(chatId) ?? false)) { + !(_searchResultMap?.containsKey(chatId) ?? true)) { return; } _searchResultMap?.remove(chatId);