Flutter分页列表插件ts_paginated_list的使用

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

Flutter分页列表插件ts_paginated_list的使用

ts_paginated_list 是一个用于Flutter应用中的分页列表插件,支持多种分页方式,并且可以与不同的滚动视图集成。本文将介绍如何在Flutter项目中使用该插件。

插件特点

  • TsPaginatedList: 直接作为Scaffold的body使用。
  • TsPaginatedPageView: 类似于PageView,但带有分页功能。
  • TsPaginatedListInsideScroll: 可以嵌入到ListView、SingleChildScrollView等滚动视图中。

使用方法

数据请求示例

/// 这是一个基本的数据请求示例。
///
/// 以下示例适用于任何TsPaginated组件...
Future<TsPaginatedListResult<ModelName>> fetchData(int page, int limit) async {
  final response = await http.get('https://api.example.com/data?page=$page&limit=$pageSize');

  final data = json.decode(response.body);
  final items = data['items'].map((item) => ModelName.fromJson(item)).toList();

  return TsPaginatedListResult(
    data: items,
    isSuccess: response.statusCode == 200,
    hasNext: data['hasNext'] ?? null,
  );
}

TsPaginatedList 示例

Scaffold(
  body: Padding(
    padding: const EdgeInsets.symmetric(horizontal: 10),
    child: TsPaginatedList(
      TsPaginatedListSettings.list(
        initialPage: 0,
        limit: 10,
        leadingSpacing: 10,
        fetchData: fetchData, // 数据获取函数
        builder: (context, item, index) {
          return YourWidget(item: item);
        },
      ),
    ),
  ),
);

TsPaginatedListInsideScroll 示例

在CustomScrollView中使用

CustomScrollView(
  controller: scrollControllerUnique, // 必须提供
  slivers: [
    YourWidget1(),
    YourWidget2(),
    TsPaginatedListInsideScroll.sliver(
      TsPaginatedListSettings.insideListScrollAsList(
        scrollController: scrollControllerUnique, // 必须提供(与前面相同)
        initialPage: 0,
        limit: 5,
        fetchData: controller.fetchData,
        builder: (context, item, index) {
          return YourWidget(item: item);
        },
      ),
    ),
  ],
);

// 或者在ListView/SingleChildScrollView中使用

ListView(
  controller: scrollControllerUnique, // 必须提供
  children: [
    YourWidget1(),
    YourWidget2(),
    TsPaginatedListInsideScroll.nonSliver(
      TsPaginatedListSettings.insideListScrollAsList(
        scrollController: scrollControllerUnique, // 必须提供(与前面相同)
        initialPage: 0,
        limit: 5,
        fetchData: controller.fetchData,
        builder: (context, item, index) {
          return YourWidget(item: item);
        },
      ),
    ),
  ],
);

TsPaginatedPageView 示例

Scaffold(
  body: TsPaginatedPageView(
    TsPaginatedPageSettings(
      initialPage: 0,
      limit: 5,
      fetchData: controller.fetchData,
      builder: (context, item, index) {
        return YourWidget(item: item);
      },
    ),
  ),
);

注意事项/已知问题

  • 如果您想在一个列表中使用两个TsPaginatedListInsideScroll小部件,目前这不被支持,可能会导致错误。(我们计划尽快实现此功能)

完整示例Demo

以下是一个完整的示例demo,展示了如何在Flutter项目中使用ts_paginated_list插件:

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:ts_pagination_list_example/routes/app_pages.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return GetMaterialApp(
      title: 'TsPaginationList Example',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const TsPaginationListExample(),
      getPages: AppPages.routes,
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Padding(
        padding: const EdgeInsets.symmetric(horizontal: 15),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            SizedBox(
              width: double.infinity,
              child: ElevatedButton(
                onPressed: () => Get.toNamed(Routes.paginationBody),
                child: const Text('Pagination list in body'),
              ),
            ),
            const SizedBox(height: 15),
            SizedBox(
              width: double.infinity,
              child: ElevatedButton(
                onPressed: () => Get.toNamed(Routes.paginationInsideList),
                child: const Text('Pagination list existing scroll view'),
              ),
            ),
            const SizedBox(height: 15),
            SizedBox(
              width: double.infinity,
              child: ElevatedButton(
                onPressed: () => Get.toNamed(Routes.paginationPage),
                child: const Text('Pagination page view'),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter分页列表插件ts_paginated_list的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter分页列表插件ts_paginated_list的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用Flutter分页列表插件 ts_paginated_list 的代码示例。ts_paginated_list 是一个用于实现分页加载列表的Flutter插件,可以帮助你轻松地实现分页功能。

首先,确保你已经在 pubspec.yaml 文件中添加了 ts_paginated_list 依赖:

dependencies:
  flutter:
    sdk: flutter
  ts_paginated_list: ^最新版本号

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

接下来是一个完整的示例,展示如何使用 ts_paginated_list 插件来实现分页列表:

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  final PaginatedListController<int> _controller = PaginatedListController(
    initialPage: 0,
    pageSize: 10,
  );

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

  Future<List<int>> fetchData(int page) async {
    // 模拟网络请求延迟
    await Future.delayed(Duration(seconds: 1));
    // 返回模拟数据,这里返回page * pageSize到(page + 1) * pageSize - 1的数字列表
    return List.generate(10, (index) => page * 10 + index);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Paginated List Example'),
      ),
      body: PaginatedListView<int>(
        controller: _controller,
        builder: (context, item, index) {
          return ListTile(
            title: Text('Item ${item}'),
          );
        },
        onFetchPage: (page) async {
          final data = await fetchData(page);
          _controller.addPageItems(data);
        },
        errorWidget: (context, error, retry) {
          return Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text('Error: $error'),
                SizedBox(height: 10),
                ElevatedButton(
                  onPressed: () => retry(),
                  child: Text('Retry'),
                ),
              ],
            ),
          );
        },
        emptyWidget: Center(child: Text('No Data')),
      ),
    );
  }
}

代码解释

  1. 依赖引入:在 pubspec.yaml 中添加 ts_paginated_list 依赖。

  2. 分页控制器:创建一个 PaginatedListController 实例,并设置初始页和每页大小。

  3. 数据获取:定义一个 fetchData 函数,模拟从网络获取分页数据。这里简单地使用 Future.delayed 模拟网络延迟,并返回一个数字列表。

  4. UI 构建

    • 使用 PaginatedListView 组件来构建分页列表。
    • controller 参数传入分页控制器。
    • builder 参数用于构建每个列表项。
    • onFetchPage 参数传入一个函数,用于在需要加载新页时调用,并获取数据。
    • errorWidget 参数用于显示加载错误时的界面。
    • emptyWidget 参数用于显示没有数据时的界面。

运行这个示例应用,你会看到一个分页加载的列表,每页显示10个项目,并且在加载新页时会模拟网络延迟。

希望这个示例能帮你更好地理解如何使用 ts_paginated_list 插件来实现分页列表功能。

回到顶部