Flutter分页加载与标签栏管理插件load_more_tab_bar的使用

Flutter分页加载与标签栏管理插件load_more_tab_bar的使用

简介

Load More Tab Bar 是一个用于 Flutter 的插件,它提供了一个动态标签栏,支持滚动加载更多数据、保持滚动位置,并在标签数量变化时自动调整。此外,它还具有其他实用功能。

特性:

  • 支持动态标签数量变化。
  • 可以在滚动到底部时加载更多数据。
  • 保持滚动位置。
  • 提供丰富的自定义选项。

安装

1. 添加依赖

在项目的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  load_more_tab_bar: ^1.0.3

2. 安装依赖

通过以下命令安装依赖:

$ flutter pub get

3. 导入库

在 Dart 文件中导入以下库:

import 'package:load_more_tab_bar/load_more_tab_bar.dart';

使用示例

以下是一个完整的示例代码,展示了如何使用 load_more_tab_bar 插件实现分页加载和标签栏管理。

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

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  var _length = 10; // 初始标签数量
  var _isFetchMore = false; // 是否正在加载更多

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: DynamicTabController(
        initialIndex: 0, // 初始选中的标签索引
        length: _length, // 当前标签数量
        child: Builder(
          builder: (context) {
            return Scaffold(
              backgroundColor: Colors.black, // 背景色
              appBar: AppBar(
                backgroundColor: Colors.black, // 标题栏背景色
                title: const Text(
                  'Dynamic Tab Bar', // 标题
                  style: TextStyle(
                    color: Colors.white, // 标题颜色
                  ),
                ),
                bottom: DynamicTabBar(
                  onNotification: (notification) {
                    // 滚动监听器
                    if (notification is ScrollUpdateNotification) {
                      if (notification.metrics.pixels ==
                          notification.metrics.maxScrollExtent) {
                        // 检测是否滚动到底部
                        if (!_isFetchMore) {
                          _isFetchMore = true;
                          if (_length == 10) {
                            // 如果初始标签数量为 10,则加载更多数据
                            Future.delayed(const Duration(seconds: 1), () {
                              setState(() {
                                _length += 10; // 增加标签数量
                                _isFetchMore = false; // 设置为未加载状态
                              });
                            });
                          }
                        }
                      }
                    }
                    return true; // 继续通知
                  },
                  onTap: (index) {
                    // 点击标签事件
                    print("onTap: index = $index");
                    if (index == _length - 1) {
                      // 如果点击的是最后一个标签,则弹出对话框
                      showAboutDialog(
                        context: context,
                        applicationIcon: const FlutterLogo(),
                        applicationName: "Dynamic Tab Bar",
                      );
                    }
                    return index < _length - 1; // 阻止点击最后一个标签
                  },
                  controller: DynamicTabController.of(context), // 动态标签控制器
                  overlayColor: MaterialStateProperty.all<Color>(Colors.transparent), // 透明覆盖层
                  padding: const EdgeInsets.symmetric(horizontal: 10), // 内边距
                  labelStyle: const TextStyle(
                    color: Colors.white, // 标签文字颜色
                    fontSize: 16, // 标签文字大小
                  ),
                  labelColor: Colors.white, // 选中标签文字颜色
                  tabBackgroundColor: Colors.transparent, // 标签背景色
                  automaticIndicatorColorAdjustment: false, // 自动调整指示器颜色
                  isScrollable: true, // 支持滚动
                  tabs: List.generate(
                    _length, // 生成标签
                    (index) {
                      if (index == _length - 1) {
                        return const Tab(
                          height: 54, // 标签高度
                          icon: Icon(Icons.settings), // 最后一个标签图标
                        );
                      } else {
                        return Tab(
                          height: 54, // 标签高度
                          text: 'Tab $index', // 标签文字
                        );
                      }
                    },
                  ),
                ),
              ),
              body: DynamicTabBarView(
                onPageChanged: (index) {
                  // 页面切换回调
                  print("onPageChanged: index = $index");
                },
                physics: DynamicPageScrollPhysics(
                  onCanDrag: (from, to) {
                    // 拖拽限制
                    return to < _length - 1; // 阻止拖拽到最后一项
                  },
                ),
                controller: DynamicTabController.of(context), // 动态标签控制器
                children: List.generate(
                  _length, // 生成页面
                  (index) {
                    if (index == _length - 1) {
                      return const SizedBox.shrink(); // 最后一个标签为空
                    } else {
                      return Center(
                        child: Text(
                          'Tab $index', // 页面内容
                          style: const TextStyle(
                            fontSize: 16, // 文字大小
                            color: Colors.white, // 文字颜色
                          ),
                        ),
                      );
                    }
                  },
                ),
              ),
            );
          },
        ),
      ),
    );
  }
}

更多关于Flutter分页加载与标签栏管理插件load_more_tab_bar的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter分页加载与标签栏管理插件load_more_tab_bar的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


load_more_tab_bar 是一个 Flutter 插件,用于实现分页加载和标签栏管理。它可以帮助你在 Flutter 应用中轻松地实现带有分页加载功能的标签栏。以下是如何使用 load_more_tab_bar 插件的基本步骤。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  load_more_tab_bar: ^1.0.0  # 请使用最新版本

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

2. 基本使用

2.1 创建一个 LoadMoreTabBar 控件

LoadMoreTabBar 是一个带有分页加载功能的标签栏控件。你可以通过以下方式使用它:

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

class MyTabbedPage extends StatefulWidget {
  [@override](/user/override)
  _MyTabbedPageState createState() => _MyTabbedPageState();
}

class _MyTabbedPageState extends State<MyTabbedPage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Load More Tab Bar Example'),
      ),
      body: LoadMoreTabBar(
        tabs: [
          Tab(text: 'Tab 1'),
          Tab(text: 'Tab 2'),
          Tab(text: 'Tab 3'),
        ],
        loadMoreControllers: [
          LoadMoreController(
            onLoadMore: (page) async {
              // 模拟异步加载数据
              await Future.delayed(Duration(seconds: 2));
              // 返回加载的数据
              return List.generate(10, (index) => 'Item ${index + (page - 1) * 10}');
            },
          ),
          LoadMoreController(
            onLoadMore: (page) async {
              await Future.delayed(Duration(seconds: 2));
              return List.generate(10, (index) => 'Item ${index + (page - 1) * 10}');
            },
          ),
          LoadMoreController(
            onLoadMore: (page) async {
              await Future.delayed(Duration(seconds: 2));
              return List.generate(10, (index) => 'Item ${index + (page - 1) * 10}');
            },
          ),
        ],
      ),
    );
  }
}

2.2 LoadMoreController 配置

LoadMoreController 用于控制每个标签页的分页加载逻辑。onLoadMore 是一个异步函数,用于加载更多数据。它接收一个 page 参数,表示当前加载的页码。

LoadMoreController(
  onLoadMore: (page) async {
    // 模拟异步加载数据
    await Future.delayed(Duration(seconds: 2));
    // 返回加载的数据
    return List.generate(10, (index) => 'Item ${index + (page - 1) * 10}');
  },
)

2.3 自定义列表项

你可以通过 LoadMoreTabBaritemBuilder 参数来自定义每个标签页的列表项显示方式:

LoadMoreTabBar(
  tabs: [
    Tab(text: 'Tab 1'),
    Tab(text: 'Tab 2'),
    Tab(text: 'Tab 3'),
  ],
  loadMoreControllers: [
    LoadMoreController(
      onLoadMore: (page) async {
        await Future.delayed(Duration(seconds: 2));
        return List.generate(10, (index) => 'Item ${index + (page - 1) * 10}');
      },
    ),
    // 其他标签页的 LoadMoreController
  ],
  itemBuilder: (context, index, data) {
    return ListTile(
      title: Text(data),
    );
  },
)

3. 高级功能

3.1 自定义加载更多指示器

你可以通过 LoadMoreTabBarloadingIndicatorBuilder 参数来自定义加载更多时的指示器:

LoadMoreTabBar(
  tabs: [
    Tab(text: 'Tab 1'),
    Tab(text: 'Tab 2'),
    Tab(text: 'Tab 3'),
  ],
  loadMoreControllers: [
    LoadMoreController(
      onLoadMore: (page) async {
        await Future.delayed(Duration(seconds: 2));
        return List.generate(10, (index) => 'Item ${index + (page - 1) * 10}');
      },
    ),
    // 其他标签页的 LoadMoreController
  ],
  loadingIndicatorBuilder: (context) {
    return Center(
      child: CircularProgressIndicator(),
    );
  },
)

3.2 自定义空视图

当没有数据时,你可以通过 emptyViewBuilder 参数来自定义空视图:

LoadMoreTabBar(
  tabs: [
    Tab(text: 'Tab 1'),
    Tab(text: 'Tab 2'),
    Tab(text: 'Tab 3'),
  ],
  loadMoreControllers: [
    LoadMoreController(
      onLoadMore: (page) async {
        await Future.delayed(Duration(seconds: 2));
        return List.generate(10, (index) => 'Item ${index + (page - 1) * 10}');
      },
    ),
    // 其他标签页的 LoadMoreController
  ],
  emptyViewBuilder: (context) {
    return Center(
      child: Text('No data available'),
    );
  },
)

4. 完整示例

以下是一个完整的示例,展示了如何使用 load_more_tab_bar 插件:

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

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

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

class MyTabbedPage extends StatefulWidget {
  [@override](/user/override)
  _MyTabbedPageState createState() => _MyTabbedPageState();
}

class _MyTabbedPageState extends State<MyTabbedPage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Load More Tab Bar Example'),
      ),
      body: LoadMoreTabBar(
        tabs: [
          Tab(text: 'Tab 1'),
          Tab(text: 'Tab 2'),
          Tab(text: 'Tab 3'),
        ],
        loadMoreControllers: [
          LoadMoreController(
            onLoadMore: (page) async {
              await Future.delayed(Duration(seconds: 2));
              return List.generate(10, (index) => 'Item ${index + (page - 1) * 10}');
            },
          ),
          LoadMoreController(
            onLoadMore: (page) async {
              await Future.delayed(Duration(seconds: 2));
              return List.generate(10, (index) => 'Item ${index + (page - 1) * 10}');
            },
          ),
          LoadMoreController(
            onLoadMore: (page) async {
              await Future.delayed(Duration(seconds: 2));
              return List.generate(10, (index) => 'Item ${index + (page - 1) * 10}');
            },
          ),
        ],
        itemBuilder: (context, index, data) {
          return ListTile(
            title: Text(data),
          );
        },
        loadingIndicatorBuilder: (context) {
          return Center(
            child: CircularProgressIndicator(),
          );
        },
        emptyViewBuilder: (context) {
          return Center(
            child: Text('No data available'),
          );
        },
      ),
    );
  }
}
回到顶部