Flutter无限滚动功能插件advanced_infinite_scroll的使用

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

Flutter无限滚动功能插件advanced_infinite_scroll的使用

2023 © Bikramaditya Meher

Pub License: MIT

一个多功能的 Flutter 包,用于实现高级滚动。无论你需要无限滚动、响应式网格视图还是可定制加载器,AdvancedInfiniteScroll 都能满足你的需求。

功能

  • 无限滚动
  • 响应式网格/列表视图
  • 下拉刷新功能
  • 可定制加载器(用于加载更多或初始加载)
  • 处理“无数据找到”小部件
  • 处理“错误”小部件
  • 优化可见项的渲染
  • 头部/尾部小部件
  • 空加载器大小(查看示例)

使用方法

要使用此包,请在 pubspec.yaml 文件中添加 advanced_infinite_scroll 作为依赖项。

数据获取

你可以从网络或其他来源获取数据。为了演示,这里有一个虚拟的数据获取函数:

Future<List<String>> onListFutureDummy(int page, int perPage, Map? params) async {
  debugPrint("ON LOAD DATA AIS :: $page");
  await Future.delayed(const Duration(seconds: 1));
  return List.generate(perPage, (index) => "PAGE :: $page ::");
  // return [];
}

这个函数模拟了一个带有延迟的网络调用,并生成虚拟数据。

基本设置

以下是一个简单的示例,展示了如何使用 AdvancedInfiniteScroll

AdvancedInfiniteScroll<String>(
  minItemWidth: 120,
  minItemsPerRow: 1,
  maxItemsPerRow: 1,
  controller: controller,
  loaderSize: 1,
  headerWidget: Container(
    height: 50,
    color: Colors.green,
    child: const Center(child: Text("Header")),
  ),
  footerWidget: Container(
    height: 50,
    color: Colors.red,
    child: const Center(child: Text("Header")),
  ),
  noDataFoundWidget: (c) {
    return TextButton(
      onPressed: () {
        c.refresh();
      },
      child: const Text("Refresh"),
    );
  },
  loadingWidget: const Center(child: CircularProgressIndicator()),
  // onFuture: onListFutureDummy,
  loadingMoreWidget: Center(
    child: Padding(
      padding: const EdgeInsets.all(10),
      child: LinearProgressIndicator(
        minHeight: 60,
        valueColor: AlwaysStoppedAnimation<Color>(Colors.grey.shade50),
      ),
    ),
  ),
  builder: (BuildContext context, listData, index) {
    return ListTile(
      title: Text(
        "${listData[index]}:: INDEX :: $index ::",
      ),
    );
  },
)

参数

以下是关键参数的简要概述:

  • minItemWidth: 每个项目的最小宽度。
  • minItemsPerRow: 每行的最小项目数。
  • controller: 与 AdvancedInfiniteScroll 关联的控制器。
  • loadingMoreWidget: 在加载更多项目时显示的小部件。
  • builder: 根据提供的数据返回小部件列表的函数。

完整示例

import 'package:advanced_infinite_scroll/advanced_infinite_scroll.dart';
import 'package:flutter/material.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> {
  late AdvancedInfiniteScrollController<String> controller;

  [@override](/user/override)
  void initState() {
    super.initState();
    controller = AdvancedInfiniteScrollController(
      onFuture: onListFutureDummy,
      perPage: 14,
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: AdvancedInfiniteScroll<String>(
        minItemWidth: 120,
        minItemsPerRow: 1,
        maxItemsPerRow: 1,
        controller: controller,
        loaderSize: 1,
        headerWidget: Container(
          height: 50,
          color: Colors.green,
          child: const Center(child: Text("Header")),
        ),
        footerWidget: Container(
          height: 50,
          color: Colors.red,
          child: const Center(child: Text("Header")),
        ),
        noDataFoundWidget: (c) {
          return TextButton(
            onPressed: () {
              c.refresh();
            },
            child: const Text("Refresh"),
          );
        },
        loadingWidget: const Center(child: CircularProgressIndicator()),
        loadingMoreWidget: Center(
          child: Padding(
            padding: const EdgeInsets.all(10),
            child: LinearProgressIndicator(
              minHeight: 60,
              valueColor: AlwaysStoppedAnimation<Color>(Colors.grey.shade50),
            ),
          ),
        ),
        builder: (BuildContext context, listData, index) {
          return ListTile(
            title: Text(
              "${listData[index]}:: INDEX :: $index ::",
            ),
          );
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          controller.refresh(params: {"Sadf": "afdas"});
        },
        child: const Icon(Icons.refresh),
      ),
    );
  }

  Future<List<String>> onListFutureDummy(int page, int perPage, Map? params) async {
    debugPrint("ON LOAD DATA AIS :: $page");
    await Future.delayed(const Duration(seconds: 1));
    return List.generate(perPage, (index) => "PAGE :: $page ::");
    // return [];
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter中使用advanced_infinite_scroll插件来实现无限滚动功能的示例代码。advanced_infinite_scroll插件允许你轻松地实现列表的无限滚动加载数据功能。

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

dependencies:
  flutter:
    sdk: flutter
  advanced_infinite_scroll: ^0.1.0  # 请确保使用最新版本

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

接下来,在你的Dart文件中,比如main.dart,你可以按照以下步骤来实现无限滚动功能:

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

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

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

class InfiniteScrollDemo extends StatefulWidget {
  @override
  _InfiniteScrollDemoState createState() => _InfiniteScrollDemoState();
}

class _InfiniteScrollDemoState extends State<InfiniteScrollDemo> {
  final List<String> items = [];
  final int pageSize = 20; // 每次加载的条目数量
  int currentPage = 1; // 当前页码
  bool isLoading = false; // 加载状态

  @override
  void initState() {
    super.initState();
    // 初始加载数据
    loadMoreData();
  }

  void loadMoreData() async {
    if (isLoading) return;

    setState(() {
      isLoading = true;
    });

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

    // 添加新数据到列表
    int start = (currentPage - 1) * pageSize;
    int end = start + pageSize;
    List<String> newItems = List.generate(pageSize, (index) => "Item ${start + index + 1}");

    setState(() {
      items.addAll(newItems);
      currentPage += 1;
      isLoading = false;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Infinite Scroll Demo'),
      ),
      body: AdvancedInfiniteScroll(
        initialItems: items,
        onLoadMore: loadMoreData,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(items[index]),
          );
        },
        hasMore: items.length < 1000, // 假设总共有1000条数据
        errorWidget: Center(child: Text('Error loading data')),
        retryOnLoadMoreFailed: () async {
          // 尝试重新加载数据(在加载失败时)
          await Future.delayed(Duration(seconds: 2));
          setState(() {
            // 重新调用loadMoreData或其他逻辑
            loadMoreData();
          });
        },
      ),
    );
  }
}

解释

  1. 依赖添加:在pubspec.yaml中添加advanced_infinite_scroll插件。

  2. 状态管理

    • items:存储已加载的数据。
    • pageSize:每次加载的条目数量。
    • currentPage:当前页码。
    • isLoading:加载状态。
  3. 数据加载

    • loadMoreData:模拟从网络加载数据并更新UI。
  4. UI构建

    • 使用AdvancedInfiniteScroll组件,并设置初始数据、加载更多数据的函数、列表项构建函数等。
    • hasMore:用于指示是否还有更多数据可以加载。
    • errorWidget:在加载数据出错时显示的组件。
    • retryOnLoadMoreFailed:在加载失败时重试加载数据的函数。

这个示例展示了如何使用advanced_infinite_scroll插件来实现一个基本的无限滚动功能。你可以根据实际需求进行更复杂的定制和扩展。

回到顶部