addItem method

void addItem(
  1. ItemType newItem
)

Implementation

void addItem(ItemType newItem) {
  if (_pagingState is PagingStateData<PageKeyType, ItemType>) {
    final value = _pagingState as PagingStateData<PageKeyType, ItemType>;

    if (widget.reverse && _scrollController.hasClients) {
      _previousScrollOffset = _scrollController.position.pixels;
      final beforeExtent = _scrollController.position.maxScrollExtent;

      // Thêm item mới vào đầu danh sách
      var items = [newItem, ...value.items];
      emit(PagingStateData(items, value.status, value.hasRequestNextPage));

      SchedulerBinding.instance.addPostFrameCallback((_) {
        if (_scrollController.hasClients) {
          final afterExtent = _scrollController.position.maxScrollExtent;
          final itemSize = afterExtent - beforeExtent;

          if (itemSize > 0) {
            // Điều chỉnh vị trí cuộn dựa trên kích thước thực của viewport
            final adjustedOffset = _previousScrollOffset + itemSize;
            _scrollController.jumpTo(adjustedOffset);
          }
        }
      });
    } else {
      var items = [newItem, ...value.items];
      emit(PagingStateData(items, value.status, value.hasRequestNextPage));
    }
  }
}