Flutter下拉刷新及加载更多插件refresh_loadmore的使用

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

Flutter下拉刷新及加载更多插件refresh_loadmore的使用

简介

refresh_loadmore 是一个Flutter组件,支持下拉刷新和上拉加载更多数据。它为开发者提供了简洁且高效的API来实现这两项功能。

快速开始

在您的 pubspec.yaml 文件中添加依赖:

dependencies:
  refresh_loadmore: ^2.0.7

然后执行 flutter pub get 来安装包。

使用方法

主要属性与函数

  • onRefresh: 下拉刷新时的回调函数。
  • onLoadmore: 上拉以加载更多数据的回调函数。
  • isLastPage: 是否为最后一页,如果为true,则无法加载更多。
  • child: 子组件。
  • noMoreWidget: 底部没有更多数据时的提示文字组件。
  • loadingWidget: 正在加载数据时的提示组件。
  • padding: 可自定义的内边距。
  • scrollController: 自定义的 ScrollController,或不使用。

示例代码

以下是一个完整的示例应用,展示了如何使用 refresh_loadmore 插件。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.purple,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  bool isLastPage = false;
  List<String>? list;
  int page = 1;

  @override
  void initState() {
    super.initState();
    loadFirstData();
  }

  Future<void> loadFirstData() async {
    await Future.delayed(Duration(seconds: 1), () {
      setState(() {
        list = [
          'dddd', 'sdfasfa', 'sdfgaf', 'adsgafg', 
          'dddd', 'sdfasfa', 'sdfgaf', 'adsgafg', 
          'dddd', 'sdfasfa', 'sdfgaf', 'adsgafg', 
          'adsgafg', 'dddd', 'sdfasfa', 'sdfgaf', 
          'adsgafg'
        ];
        isLastPage = false;
        page = 1;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: list != null
          ? RefreshLoadmore(
              onRefresh: loadFirstData,
              onLoadmore: () async {
                await Future.delayed(Duration(seconds: 1), () {
                  setState(() {
                    list!.addAll(['123', '234', '457']);
                    page++;
                  });
                  print(page);
                  if (page >= 3) {
                    setState(() {
                      isLastPage = true;
                    });
                  }
                });
              },
              noMoreWidget: Text(
                'No more data, you are at the end',
                style: TextStyle(
                  fontSize: 18,
                  color: Theme.of(context).disabledColor,
                ),
              ),
              isLastPage: isLastPage,
              child: list!.isNotEmpty
                  ? ListView.builder(
                      itemCount: list!.length,
                      itemBuilder: (context, index) {
                        return ListTile(
                          title: Text(list![index]),
                          trailing: Icon(Icons.accessibility_new),
                        );
                      },
                    )
                  : Center(
                      child: Text('empty'),
                    ),
            )
          : Center(child: CircularProgressIndicator()),
    );
  }
}

在这个例子中,我们创建了一个简单的Flutter应用程序,它包含一个带有下拉刷新和加载更多功能的列表。当用户滚动到底部时,会触发加载更多数据的功能;而当用户向下拉动页面时,则会触发刷新操作。

渲染效果

以下是该插件的实际渲染效果截图: Image Image Image

通过这些截图,您可以直观地了解插件的工作方式以及它如何响应用户的交互行为。希望这个插件能够帮助您更轻松地实现下拉刷新和加载更多的功能!


更多关于Flutter下拉刷新及加载更多插件refresh_loadmore的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter下拉刷新及加载更多插件refresh_loadmore的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个使用 refresh_loadmore 插件在 Flutter 中实现下拉刷新及加载更多数据的示例代码。这个插件能够帮助你轻松实现列表的刷新和加载更多功能。

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

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

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

接下来,在你的 Dart 文件中实现下拉刷新和加载更多功能。以下是一个完整的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  List<String> dataList = List.generate(20, (index) => "Item ${index + 1}");
  bool isLoading = false;
  bool hasMore = true;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Refresh and Load More Example'),
      ),
      body: RefreshLoadMoreWidget(
        onRefresh: _onRefresh,
        onLoadMore: _onLoadMore,
        child: ListView.builder(
          itemCount: dataList.length,
          itemBuilder: (context, index) {
            return ListTile(
              title: Text(dataList[index]),
            );
          },
        ),
        isLoading: isLoading,
        hasMore: hasMore,
      ),
    );
  }

  Future<void> _onRefresh() async {
    setState(() {
      isLoading = true;
    });

    // 模拟网络请求
    await Future.delayed(Duration(seconds: 2));

    // 刷新数据(这里简单重置为初始数据)
    setState(() {
      dataList = List.generate(20, (index) => "Item ${index + 1}");
      isLoading = false;
    });
  }

  Future<void> _onLoadMore() async {
    setState(() {
      isLoading = true;
    });

    // 模拟网络请求
    await Future.delayed(Duration(seconds: 2));

    // 加载更多数据
    if (dataList.length < 50) {
      setState(() {
        int start = dataList.length;
        int end = start + 20 <= 50 ? start + 20 : 50;
        dataList.addAll(List.generate(end - start, (index) => "Item ${start + index + 1}"));
        isLoading = false;
        // 如果没有更多数据,设置 hasMore 为 false
        hasMore = dataList.length < 50;
      });
    } else {
      setState(() {
        isLoading = false;
        hasMore = false;
      });
    }
  }
}

在这个示例中:

  1. RefreshLoadMoreWidgetrefresh_loadmore 插件提供的核心组件,它负责处理下拉刷新和上拉加载更多的逻辑。
  2. _onRefresh 方法处理下拉刷新逻辑,这里简单地重置了数据列表。
  3. _onLoadMore 方法处理上拉加载更多逻辑,这里模拟了网络请求并添加了更多数据到列表中。
  4. isLoadinghasMore 分别用于指示当前是否正在加载数据和是否还有更多数据可以加载。

你可以根据实际需求调整数据加载逻辑和 UI 显示。希望这个示例能帮到你!

回到顶部