Flutter无限滚动插件simple_infinite_scroll的使用

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

Flutter无限滚动插件simple_infinite_scroll的使用

功能介绍

SimpleInfiniteScroll 是一个帮助简化显示大量数据过程的包,你希望以无限分页的方式展示这些数据。

  • 无限滚动列表视图
  • Dart 通用
  • 自动分页
  • 可定制加载视图
  • 刷新列表视图
  • 可定制的列表视图空状态
  • 可定制的列表视图错误状态
  • 可定制的列表视图到达列表末尾的状态

使用方法

SimpleInfiniteScroll 非常类似于 ListView.builder。基本实现需要以下参数:

  • itemBuilder: 表示数据列表中每个索引项的 widget。
  • controller: 控制列表视图的各种行为。
  • initialPage: 初始加载页面值,默认为 1
  • limit: 每页显示的数据量。
  • loadingWidget: 当滚动到最大时显示的 widget。
  • fetch: 获取数据列表的函数,包含回调参数如 pagelimit,你可以用它们作为从仓库调用数据的参数,默认为 1

以下是带有模型数据的列表视图代码片段示例:

SimpleInfiniteScroll<Article>(
    initialPage: 1,
    limit: 1,
    fetch: (page, limit) => fetchArticles(page, limit),
    itemBuilder: (context, index, item){
        return ListTile(
            title: Text(item.title),
        );
    }
)

你可以像这样获取仓库数据:

Future<List<Article>> fetchArticles(page, limit) async{
    // 获取文章数据...
}

刷新功能

此包配备了刷新功能,使您轻松在列表视图中重新加载数据。 可以通过 SimpleInfiniteScrollController 来刷新列表视图。

final SimpleInfiniteScrollController _scrollController =
      SimpleInfiniteScrollController();
_scrollController.refresh();

要更改刷新指示器样式,请添加 refreshIndicatorStyle 属性。

SimpleInfiniteScroll<Article>(
    refreshIndicatorStyle: RefreshIndicatorStyle(
        color: Colors.green,
        displacement: 40.0,
        backgroundColor: Colors.grey.shade200
    ),
)

示例代码

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

class HomeScreen extends StatefulWidget {
  const HomeScreen({super.key});

  [@override](/user/override)
  State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  final SimpleInfiniteScrollController _scrollController =
      SimpleInfiniteScrollController();

  // 获取文章数据
  Future<List<Article>> fetchArticles(int page, int limit) async {
    await Future.delayed(const Duration(seconds: 1));
    return List.generate(10, (index) => Article(title: "Index $index"));
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          centerTitle: true,
          title: const Text('Home Screen'),
          actions: [
            IconButton(
              icon: const Icon(Icons.refresh),
              onPressed: () => _scrollController.refresh(),
            )
          ],
        ),
        body: SimpleInfiniteScroll<Article>(
          controller: _scrollController,
          fetch: (page, limit) => fetchArticles(page, limit),
          loadingWidget: Center(
            child: Container(
                padding: const EdgeInsets.all(15),
                child: const CircularProgressIndicator()),
          ),
          itemBuilder: (context, index, item) {
            return ListTile(
              title: Text(item.title ?? ''),
            );
          },
        ));
  }
}

class Article {
  int? id;
  String? title, body;

  Article({this.id, this.title, this.body});
}

更多关于Flutter无限滚动插件simple_infinite_scroll的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter无限滚动插件simple_infinite_scroll的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用simple_infinite_scroll插件来实现无限滚动的代码示例。

首先,你需要在pubspec.yaml文件中添加simple_infinite_scroll依赖项:

dependencies:
  flutter:
    sdk: flutter
  simple_infinite_scroll: ^x.y.z  # 请将x.y.z替换为最新版本号

然后运行flutter pub get来安装依赖项。

接下来是一个完整的Flutter应用示例,展示了如何使用simple_infinite_scroll来实现无限滚动:

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

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

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

class InfiniteScrollPage extends StatefulWidget {
  @override
  _InfiniteScrollPageState createState() => _InfiniteScrollPageState();
}

class _InfiniteScrollPageState extends State<InfiniteScrollPage> {
  List<String> items = List.generate(20, (i) => "Item ${i + 1}");
  bool isLoading = false;
  bool hasMore = true;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Infinite Scroll Demo'),
      ),
      body: SimpleInfiniteScroll(
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(items[index]),
          );
        },
        itemCount: items.length,
        onLoadMore: () async {
          setState(() {
            isLoading = true;
          });

          // 模拟加载更多数据
          await Future.delayed(Duration(seconds: 2));

          setState(() {
            if (items.length < 100) {  // 假设我们只加载到100项
              int nextStartIndex = items.length;
              int nextEndIndex =
                  min(nextStartIndex + 20, 100); // 每次加载20项
              items.addAll(
                  List.generate(
                      nextEndIndex - nextStartIndex,
                      (i) => "Item ${nextStartIndex + i + 1}",
                  )
              );
            } else {
              hasMore = false;
            }
            isLoading = false;
          });
        },
        hasMore: hasMore,
        isLoading: isLoading,
      ),
    );
  }
}

代码说明:

  1. 依赖项

    • pubspec.yaml文件中添加simple_infinite_scroll依赖项。
  2. MyApp

    • 这是一个简单的Flutter应用,包含一个带有主题的主页。
  3. InfiniteScrollPage

    • 这是一个有状态的Widget,包含用于展示滚动列表的状态。
  4. 状态变量

    • items:当前已加载的列表项。
    • isLoading:一个布尔值,指示是否正在加载更多数据。
    • hasMore:一个布尔值,指示是否还有更多数据可以加载。
  5. SimpleInfiniteScroll

    • itemBuilder:用于构建每个列表项的Widget。
    • itemCount:当前已加载的列表项数量。
    • onLoadMore:一个异步函数,用于加载更多数据。
    • hasMore:一个布尔值,指示是否还有更多数据可以加载(用于控制加载更多按钮的显示)。
    • isLoading:一个布尔值,指示是否正在加载数据(用于显示加载动画)。

运行效果:

运行这个应用时,你会看到一个可以滚动的列表。当滚动到底部时,将触发onLoadMore函数来加载更多数据,并更新列表。加载更多数据时,会显示一个加载动画。当数据加载完毕后,列表将自动滚动到新加载的项。

希望这个示例对你有帮助!如果你有任何其他问题,请随时问我。

回到顶部