Flutter高级列表组件插件super_sliver_list的使用

发布于 1周前 作者 nodeper 来自 Flutter

Flutter高级列表组件插件super_sliver_list的使用

SuperSliverListSuperListView是Flutter中SliverListListView的替代品,提供了更好的性能和额外的功能。以下是该插件的主要特点、基本用法以及一些高级功能。

主要特点

  • 快速滚动大量具有不同高度的项目:当快速滚动浏览大量具有不同高度的项目时,SliverList的性能会显著下降,而SuperSliverList通过不同的布局算法可以处理几乎无限数量的具有可变高度的项目,不会出现性能问题。
  • 跳转或动画到特定项目的能力SliverList不提供任何方式来跳转或动画到特定索引的项目,而SuperSliverList可以可靠地跳转和动画到特定项目,即使该项目不在视口内且尚未构建或布局。
  • 平滑且可预测的滚动条行为SuperSliverList确保了滚动条的行为更加平滑和可预测。

基本用法

使用SuperListView

SuperListViewListView的直接替代品,你可以像使用ListView一样使用它:

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

使用SuperSliverList

SuperSliverListSliverList的直接替代品,适用于任何CustomScrollView配置:

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'),
          ],
        ),
      ),
    ),
  ],
)

跳转和动画到特定项目

可以通过ListController来实现跳转或动画到特定项目:

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,
    );
  }
}

高级用法

改善高度估算

你可以注册自定义回调来估计项目的高度,这对于你大致知道每个项目高度的情况非常有用:

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

预计算项目高度

如果需要,SuperSliverList可以异步预计算项目的高度。为此,继承ExtentPrecalculationPolicy并将其提供给SuperSliverList

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

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

示例代码

以下是一个完整的示例应用,展示了如何使用SuperSliverList

import "dart:async";
import "package:flutter/foundation.dart";
import "package:logging/logging.dart";
import "package:pixel_snap/widgets.dart";
import "shell/app.dart";

void main() {
  Logger.root.onRecord.listen((record) {
    Zone.current.print("${record.level.name}: ${record.message}");
  });
  hierarchicalLoggingEnabled = true;
  WidgetsFlutterBinding.ensureInitialized();
  
  // Right now the debug bar doesn't work nicely with safe area so
  // only enable it on desktop platform.
  Widget app = const ExampleApp();
  if (defaultTargetPlatform != TargetPlatform.iOS &&
      defaultTargetPlatform != TargetPlatform.android) {
    app = PixelSnapDebugBar(child: app);
  }
  runApp(app);
}

更多示例代码可以在GitHub仓库中找到。你也可以查看在线示例以了解其实际效果。


更多关于Flutter高级列表组件插件super_sliver_list的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter高级列表组件插件super_sliver_list的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 super_sliver_list 插件的示例代码。super_sliver_list 是一个 Flutter 插件,用于创建高级列表组件,它提供了一些额外的功能和灵活性,比标准的 SliverList 更加强大。

首先,确保你已经在 pubspec.yaml 文件中添加了 super_sliver_list 依赖:

dependencies:
  flutter:
    sdk: flutter
  super_sliver_list: ^最新版本号 # 请替换为实际最新版本号

然后,运行 flutter pub get 以获取依赖。

接下来是一个简单的示例,展示如何使用 super_sliver_list 创建一个自定义列表:

import 'package:flutter/material.dart';
import 'package:super_sliver_list/super_sliver_list.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Super Sliver List Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  // 示例数据
  final List<String> items = List<String>.generate(100, (i) => "Item $i");

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Super Sliver List Demo'),
      ),
      body: CustomScrollView(
        slivers: <Widget>[
          SuperSliverList.builder(
            delegate: SuperSliverChildBuilderDelegate(
              (BuildContext context, int index) {
                return ListTile(
                  title: Text(items[index]),
                );
              },
              childCount: items.length,
            ),
            // 可选:添加一些高级功能,例如加载更多数据时的回调
            onLoadMore: () async {
              // 模拟异步加载数据
              await Future.delayed(Duration(seconds: 2));
              setState(() {
                items.addAll(List<String>.generate(20, (i) => "Loaded Item ${items.length + i}"));
              });
            },
            // 可选:设置加载更多时的占位符
            loadingWidget: Center(child: CircularProgressIndicator()),
            // 可选:设置没有更多数据时的占位符
            noMoreWidget: Center(child: Text("No more items")),
            // 可选:设置触发加载更多的阈值(默认是列表底部可见时触发)
            loadMoreTriggerDistance: 200.0,
          ),
        ],
      ),
    );
  }
}

在这个示例中:

  1. 我们创建了一个包含100个项目的列表。
  2. 使用 SuperSliverList.builder 来构建这个列表,这与 ListView.builder 类似,但提供了更多的自定义选项。
  3. 添加了 onLoadMore 回调,当用户滚动到底部时,这个回调会被触发,用于加载更多数据。
  4. 设置了 loadingWidgetnoMoreWidget,分别用于显示加载更多数据时的占位符和没有更多数据时的占位符。
  5. loadMoreTriggerDistance 设置了触发加载更多数据的阈值(距离列表底部的距离)。

这个示例展示了 super_sliver_list 的一些基本用法,你可以根据需要进一步自定义和扩展。

回到顶部