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

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

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

基于<a href="https://pub.flutter-io.cn/packages/pull_to_refresh" rel="ugc">pull_to_refresh</a>插件,并针对Flutter3进行了修正。

示例代码

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:refresh/refresh.dart';

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

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

  // 这个小部件是你的应用的根。
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        // 这是你的应用的主题。
        //
        // 尝试运行你的应用。你会看到应用有一个蓝色工具栏。然后,在不退出应用的情况下,尝试将primarySwatch更改为Colors.green并执行“热重载”(在控制台中按“r”,或直接保存更改以进行“热重载”)。请注意,计数器并没有重置为零;这是因为应用并没有重新启动。
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

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

  // 这个小部件是你的应用的首页。它是一个有状态的小部件,意味着
  // 它有一个状态对象(定义在下面),该对象包含影响其外观的字段。
  // 这个类是状态的配置。它包含了由父级(在这个例子中是App小部件)提供的值(在这个例子中是标题),
  // 并且被构建方法使用。Widget子类中的字段总是标记为“final”。

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<String> items = ["1", "2", "3", "4","5","6","7","8","9"];
  RefreshController _refreshController = RefreshController(initialRefresh: false);

  void _onRefresh() async {
    // 监控网络请求
    await Future.delayed(Duration(milliseconds: 1000));
    // 如果失败了,使用refreshFailed()
    _refreshController.refreshCompleted();
  }

  void _onLoading() async {
    // 监控网络请求
    await Future.delayed(Duration(milliseconds: 1000));
    // 如果失败了,使用loadFailed(),如果没有数据返回,使用LoadNodata()
    items.add((items.length + 1).toString());
    if (mounted)
      setState(() {});
    _refreshController.loadComplete();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: SmartRefresher(
        controller: _refreshController,
        child: ListView.builder(
          itemBuilder: (c, i) => Card(child: Center(child: Text(items[i]))),
          itemExtent: 100.0,
          itemCount: items.length,
        ),
      ),
    );
  }
}

代码解释

  • 初始化

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

    主函数,用于启动应用。

  • MyApp类

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

    应用的根小部件,设置主题颜色和首页。

  • MyHomePage类

    class MyHomePage extends StatefulWidget {
      const MyHomePage({super.key, required this.title});
    
      final String title;
    
      @override
      State<MyHomePage> createState() => _MyHomePageState();
    }
    

    主页小部件,包含一个状态类 _MyHomePageState

  • _MyHomePageState类

    class _MyHomePageState extends State<MyHomePage> {
      List<String> items = ["1", "2", "3", "4","5","6","7","8","9"];
      RefreshController _refreshController = RefreshController(initialRefresh: false);
    
      void _onRefresh() async {
        await Future.delayed(Duration(milliseconds: 1000));
        _refreshController.refreshCompleted();
      }
    
      void _onLoading() async {
        await Future.delayed(Duration(milliseconds: 1000));
        items.add((items.length + 1).toString());
        if (mounted)
          setState(() {});
        _refreshController.loadComplete();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(),
          body: SmartRefresher(
            controller: _refreshController,
            child: ListView.builder(
              itemBuilder: (c, i) => Card(child: Center(child: Text(items[i]))),
              itemExtent: 100.0,
              itemCount: items.length,
            ),
          ),
        );
      }
    }
    

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

1 回复

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


当然,关于在Flutter中使用refresh插件来实现下拉刷新功能,这里提供一个具体的代码案例。需要注意的是,Flutter社区中有多个实现下拉刷新功能的插件,其中比较流行的是pull_to_refresh插件。下面是如何在Flutter项目中集成并使用pull_to_refresh插件来实现下拉刷新功能的代码示例。

步骤 1: 添加依赖

首先,在你的pubspec.yaml文件中添加pull_to_refresh依赖:

dependencies:
  flutter:
    sdk: flutter
  pull_to_refresh: ^2.0.0  # 请检查最新版本号

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

步骤 2: 导入插件

在你的Dart文件中导入pull_to_refresh插件:

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

步骤 3: 使用SmartRefresher组件

接下来,你可以使用SmartRefresher组件来包装你的列表或其他可滚动组件,并实现下拉刷新功能。以下是一个完整的示例:

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Pull to Refresh 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<String>.generate(20, (i) => "Item $i");

  Future<void> _onRefresh() async {
    // 模拟网络请求或其他耗时操作
    await Future.delayed(Duration(seconds: 2));
    
    // 更新数据
    setState(() {
      _items = List<String>.generate(20, (i) => "Refreshed Item $i");
    });

    // 结束刷新状态
    _refreshController.refreshCompleted();
  }

  Future<void> _onLoadMore() async {
    // 模拟网络请求或其他耗时操作
    await Future.delayed(Duration(seconds: 2));
    
    // 添加更多数据
    setState(() {
      int start = _items.length;
      _items.addAll(List<String>.generate(10, (i) => "Loaded Item ${start + i}"));
    });

    // 结束加载更多状态
    _refreshController.loadComplete();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Pull to Refresh Demo'),
      ),
      body: SmartRefresher(
        controller: _refreshController,
        enablePullDown: true,
        enablePullUp: true,
        header: WaterDropHeader(),
        footer: ClassicFooter(),
        onRefresh: _onRefresh,
        onLoadMore: _onLoadMore,
        child: ListView.builder(
          itemCount: _items.length,
          itemBuilder: (context, index) {
            return ListTile(
              title: Text(_items[index]),
            );
          },
        ),
      ),
    );
  }
}

解释

  1. RefreshController:用于控制刷新状态。
  2. SmartRefresher:是下拉刷新和上拉加载更多的主要组件。
  3. WaterDropHeaderClassicFooter:是刷新和加载更多的动画效果组件,你可以根据需要选择其他效果。
  4. onRefreshonLoadMore:分别是下拉刷新和上拉加载更多时的回调函数。

在这个示例中,下拉刷新会更新列表数据,上拉加载更多会向列表中添加更多数据。你可以根据自己的需求修改这些回调函数来实现具体业务逻辑。

希望这个示例能帮助你在Flutter项目中实现下拉刷新功能!

回到顶部