搜索插件、代码仓与 APP 分类

插件详情v0.4.1

super_sliver_list

SliverList 和 ListView 的即插即用替代品,可处理具有可变范围的大列表,并支持跳转/动画到特定项目。

AndroidiOSWebmacOSWindowsLinux
近 30 天下载
13万
喜欢数
301
Pub 分数
150

安装插件

flutter pub add super_sliver_list

插件介绍

基于插件公开信息、社区数据与项目使用情况整理的选型参考。

SuperSliverList 是 SliverList 和 ListView 的高性能即插即用替代品,专为高效管理具有可变项高度的大列表而设计。它支持流畅滚动、跳转到指定项导航以及项之间的动画过渡。基于 Flutter 的自定义滚动视图系统构建,通过仅构建可见的控件来优化渲染,非常适合动态或复杂的列表结构。该包在需要跨多个平台实现响应式、可扩展列表交互的应用中尤为有用。

适合场景

  • 大型动态列表,项目大小可变
  • 平滑跳转到特定列表项
  • 动画列表过渡
  • 复杂的可滚动界面
  • 高性能列表渲染
  • 跨平台列表组件

主要特点

  • 变量范围支持
  • 跳转并动画显示项目
  • 大型数据集的优化渲染
  • SliverList/ListView 的即插即用替代品
  • 内置的滚动位置持久化
  • 跨平台兼容性

适合对象

  • 开发复杂可滚动 UI 的开发者
  • 包含大量或动态数据集的应用程序
  • 性能关键的列表实现
  • 跨平台 Flutter 应用程序
  • 需要高级列表导航的用户

使用建议

  • 需要理解基于 Sliver 的布局
  • 对于非常小的列表,可能有开销
  • 与原始的 Sliver 小部件相比,自定义选项有限
  • 最适合频繁更新的可滚动内容
  • 不建议用于静态、简单的列表

原始 README

以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。

SliverList and ListView - Supercharged

See the live example of SuperSliverList.

SuperSliverList and SuperListView are drop in replacement widgets for SliverList and ListView with greatly improved performance and additional features:

Fast scrolling with large amount of items with variable extents

SliverList performance degrades heavily when quickly scrolling through a large amount of items with different extents, requiring workarounds such as using FixedExtentSliverList or prototype items. SuperSliverList uses different layout algorithm and can handle virtually unlimited number of items with variable extents without any slow-downs.

Ability to jump or animate to specific item

SliverList does not provide any way to jump or animate a particular index. There is a scrollable_positioned_list package that provides this functionality, but it comes at a cost, as it requires custom scroll view, does not seem to work properly with Scrollbars, can't be used with with other slivers (such as sticky headers) and ultimately is backed by a SliverList so it has the same performance issues as mentioned above.

SuperSliverList provides a way to reliably jump and animate to a specific item, even if the item is outside of the viewport and has not been built or laid out yet.

Smooth and predictable scrollbar behavior

SliverList is quite prone to scrollbar erraticaly jumping around when scrolling through a list of items with different extents. With SuperSliverList the scrollbar should behave more predictably. See the Advanced section for more details.

Basic Usage

SuperListView is a drop-in replacement for ListView, and as such you can use it same way you'd use ListView:

SuperListView.builder(
  itemCount: 1000,
  itemBuilder: (context, index) {
    return ListTile(title: Text('Item $index'));
  },
)

SuperSliverList is a drop-in replacement for SliverList and should work with any CustomScrollView configuration:

CustomScrollView(
  slivers: <Widget>[
    SliverPadding(
      padding: const EdgeInsets.all(20.0),
      sliver: SuperSliverList(
        delegate: SliverChildListDelegate(
          <Widget>[
            const Text("I'm dedicating every day to you"),
            const Text('Domestic life was never quite my style'),
            const Text('When you smile, you knock me out, I fall apart'),
            const Text('And I thought I was so smart'),
          ],
        ),
      ),
    ),
  ],
)

Jumping and animating to specific item

ListController can be provided to SuperSliverList/SuperListView and used to jump or animate to specific item:

class _MyState extends State<MyWidget> {
  final _listController = ListController();
  final _scrollController = ScrollController();

  @override
  Widget build(BuildContext context) {
    return SuperListView.builder(
      listController: _listController,
      controller: _scrollController,
      itemCount: 1000,
      itemBuilder: (context, index) {
        return ListTile(title: Text('Item $index'));
      },
    );
  }

  void jumpToItem(int index) {
    _listController.jumpToItem(
      index: index,
      scrollController: _scrollController,
      alignment: 0.5,
    );
  }

  void animateToItem(int index) {
    _listController.animateToItem(
      index: index,
      scrollController: _scrollController,
      alignment: 0.5,
      // You can provide duration and curve depending on the estimated
      // distance between currentPosition and the target item position.
      duration: (estimatedDistance) => Duration(milliseconds: 250),
      curve: (estimatedDistance) => Curves.easeInOut,
    );
  }
}

Advanced

Very roughtly speaking SuperSliverList works by estimating the extent of items that are outside of viewport and when these items are scrolled into the viewport cache area the scroll position is transparently adjusted to account of the difference between estimated and actual extents. On small lists this difference may result in scrollbar movement not being perfectly aligned with list movement. SuperSliverList provides two ways to rectify this:

Improve extent estimation

You can register custom callback that will be used to estimate extent of estimated items. This can be useful if you have an idea, atleast approximately, how large the extent of each item is.

SuperSliverList(
    delegate: /*...*/,
    estimateExtent: (index) => 100.0, // Provide your own extent estimation
)
Precalculate extents for items

SuperSliverList can, if needed, asynchronously precalculate extents for items. To enfore this, subclass ExtentPrecalculationPolicy and provide it to SuperSliverList:

In this example the extents are eagerly precalculated for lists with less than 100 items:

class MyPrecalculationPolicy extends ExtentPrecalculationPolicy {
  @override
  bool shouldPrecaculateExtents(ExtentPrecalculationContext context)  {
    return context.numberOfItems < 100;
  }
}

return SuperSliverList(
    delegate: /*...*/,
    extentPrecalculationPolicy: myPolicy,
)

The threshold is arbitrary, but in general there are diminishing returns for precalculating extents for large lists, as the extent estimation error for each item has much smaller impact on the scrollbar position if there are many items.

Example

See the example folder for a complete sample app using SuperSliverList. You can also see the example deployed live.

所属分类

依赖

依赖清单 2 项

源码仓库

使用此插件的项目

所在榜单