Flutter下拉刷新功能插件pull_refresh_widget的使用

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

Flutter下拉刷新功能插件pull_refresh_widget的使用

A Flutter package allows you to add pull refresh widget as listview builder or column

pub package


👨‍💻 Developed by:

profile **Nasr Al-Rahbi [@abom_me](https://twitter.com/abom_me)**

👨🏻‍💻 Find me :

Twitter Instagram LinkedIn Stack Overflow


Android iOS Flutter Web
Support Yes Yes Yes

Preview:

changing fonts with arabic_font and hot reload

Setup

pubspec.yaml文件中添加依赖:

dependencies:
  pull_refresh_widget: <last_version>

Getting Started

Sample example:

import 'package:pull_refresh_widget/pull_refresh_widget.dart';
ScrollController _controller = ScrollController();
String text = "Pull To Refresh";

RefreshScrollColumn(
  controller: _controller,
  onRefresh: () {
    print('Refreshing');
  },
  onRefreshEnd: () {
    print('Refreshed');
    setState(() {
      text = 'Refreshed';
    });
  },
  children: [
    Container(
      alignment: Alignment.center,
      height: 100,
      width: 300,
      child: Text(
        text,
        style: TextStyle(color: Colors.red, fontSize: 30),
      ),
    ),
  ],
)

To use RefreshScrollColumn()

import 'package:pull_refresh_widget/pull_refresh_widget.dart';
ScrollController _controller = ScrollController();
String text = "Pull To Refresh";

RefreshScrollColumn(
  controller: _controller,
  onRefresh: () {
    print('Refreshing');
  },
  onRefreshEnd: () {
    print('Refreshed');
    setState(() {
      text = 'Refreshed';
    });
  },
  children: [
    Container(
      alignment: Alignment.center,
      height: 100,
      width: 300,
      child: Text(
        text,
        style: TextStyle(color: Colors.red, fontSize: 30),
      ),
    ),
  ],
)

To use RefreshListViewBuilder()

RefreshListViewBuilder(
  controller: _controller,
  onRefresh: () {
    print("refreshed");
  },
  itemBuilder: (context, index) {
    return Text('$index');
  }
)

Parameters of the RefreshScrollColumn()

final ScrollController controller;

final List<Widget> children;

final Widget? loadingWidget;

final Color? iconsColor;

final void Function() onRefresh;

final void Function()? onRefreshEnd;

final Duration? refreshTime;

final MainAxisAlignment? mainAxisAlignment;
final MainAxisSize? mainAxisSize;
final CrossAxisAlignment? crossAxisAlignment;
final TextDirection? textDirection;
final VerticalDirection? verticalDirection;
final TextBaseline? textBaseline;

Parameters of the RefreshListViewBuilder()

final ScrollController controller;

final Widget? loadingWidget;

final Color? iconsColor;

final void Function() onRefresh;

final void Function()? onRefreshEnd;

final Duration? refreshTime;

final NullableIndexedWidgetBuilder itemBuilder;

final Axis scrollDirection = Axis.vertical;

final bool reverse = false;

final bool? primary;

final ScrollPhysics? physics;

final bool shrinkWrap = false;

final EdgeInsetsGeometry? padding;

final double? itemExtent;

final Widget? prototypeItem;

final int? Function(Key)? findChildIndexCallback;

final int? itemCount;

final bool addAutomaticKeepAlives = true;

final bool addRepaintBoundaries = true;

final bool addSemanticIndexes = true;

final double? cacheExtent;

final int? semanticChildCount;

final DragStartBehavior dragStartBehavior = DragStartBehavior.start;

final ScrollViewKeyboardDismissBehavior keyboardDismissBehavior = ScrollViewKeyboardDismissBehavior.manual;

final String? restorationId;

final Clip clipBehavior = Clip.hardEdge;

final MainAxisAlignment? mainAxisAlignment;

final MainAxisSize? mainAxisSize;

final CrossAxisAlignment? crossAxisAlignment;

final TextDirection? textDirection;

final VerticalDirection? verticalDirection;

final TextBaseline? textBaseline;

示例代码

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

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

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  ScrollController _controller = ScrollController();
  String text = "Pull To Refresh";

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Container(
        width: MediaQuery.of(context).size.width,
        height: MediaQuery.of(context).size.height,
        child: RefreshScrollColumn(
          crossAxisAlignment: CrossAxisAlignment.center,
          controller: _controller,
          onRefresh: () {
            print('Refreshing');
            setState(() {
              text = 'Refreshing';
            });
          },
          onRefreshEnd: () {
            print('Refreshed');
            setState(() {
              text = 'Refreshed';
            });
          },
          children: [
            Container(
              alignment: Alignment.center,
              height: 100,
              width: 300,
              child: Text(
                text,
                style: TextStyle(color: Colors.red, fontSize: 30),
              ),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter中使用pull_refresh_widget插件来实现下拉刷新功能的示例代码。请注意,pull_refresh_widget可能不是一个官方或广泛使用的插件,但基于你提到的名称,我会展示一个类似的自定义下拉刷新功能的实现,或者假设存在一个类似名字的第三方插件(如果真实存在的话,使用方式大同小异)。

在实际项目中,如果pull_refresh_widget是一个具体的第三方插件,你应该参考该插件的官方文档进行集成。以下示例将展示如何使用Flutter的RefreshIndicator组件,这是Flutter Material库中提供的一个标准组件,用于实现下拉刷新功能。

使用RefreshIndicator实现下拉刷新

import 'package:flutter/material.dart';

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  List<String> _items = List<String>.generate(20, (i) => "Item $i");

  Future<void> _refresh() async {
    // 模拟网络请求或数据更新
    await Future.delayed(Duration(seconds: 2));

    // 更新数据,这里简单地将数据反转作为示例
    setState(() {
      _items = _items.reversed.toList();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Pull to Refresh Demo'),
      ),
      body: RefreshIndicator(
        onRefresh: _refresh,
        child: ListView.builder(
          itemCount: _items.length,
          itemBuilder: (context, index) {
            return ListTile(
              title: Text(_items[index]),
            );
          },
        ),
      ),
    );
  }
}

解释

  1. RefreshIndicator:

    • onRefresh: 当用户下拉时调用的函数。在这个例子中,我们模拟了一个网络请求延迟,然后更新了列表数据。
    • child: 需要添加下拉刷新功能的子组件,这里是一个ListView.builder,用于动态生成列表项。
  2. 数据更新:

    • _refresh函数中,我们使用Future.delayed模拟了一个异步操作(比如网络请求),然后更新了列表数据。
  3. 列表生成:

    • ListView.builder用于高效生成大量列表项。它只构建那些可见的项,当列表滚动时,会动态地构建或回收项。

如果你确实在使用一个名为pull_refresh_widget的第三方插件,并且它与RefreshIndicator的使用方式有显著不同,请参考该插件的官方文档获取具体的使用方法和示例代码。通常,第三方插件会在其README文件中提供详细的集成指南和示例代码。

回到顶部