Flutter周标签页管理插件weekly_tab_pager的使用

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

Flutter周标签页管理插件weekly_tab_pager的使用

Weekly Tab Pager

可定制的TabBar组件,集成了TabView,显示一周中的工作日,并允许按周无限滚动。

此组件在实际应用Homework Planner中使用。

如果你觉得这个库有用,请随意使用!

demo.gif

特性

  • 连接在一起的TabBar和TabView
  • 单一控制器进行导航
  • 滚动期间平滑动画
  • 两个方向上的无限滚动
  • 标签中指定的工作日
  • 选项卡/页面更改的回调

使用方法

  1. pubspec.yaml文件中添加以下行:
dependencies:
  weekly_tab_pager: ^0.0.4
  1. 在你的代码中导入包:
import 'package:weekly_tab_pager/weekly_tab_pager.dart';
  1. 声明一个用于导航的控制器:
final controller = WeeklyTabController(position: DateTime.now());
  1. 定义如何构建标签:
Widget _buildTab(BuildContext context, DateTime date) {
  return Column(
    mainAxisAlignment: MainAxisAlignment.center,
    children: [
      Text(DateFormat('E').format(date).toUpperCase()), // 显示星期几的缩写并大写
      const SizedBox(height: 4),
      Text(date.day.toString()), // 显示日期
    ],
  );
}
  1. 定义如何构建页面:
Widget _buildPage(BuildContext context, DateTime date) {
  return Card(
    margin: const EdgeInsets.all(24),
    child: Center(
      child: Text(
        DateFormat.yMMMMd().format(date), // 显示完整日期格式
        style: Theme.of(context).textTheme.titleLarge,
      ),
    ),
  );
}
  1. 在代码中添加导航小部件:
WeeklyTabNavigator(
  controller: controller, // 控制器
  weekdays: [1, 2, 3, 4, 5], // 需要显示的工作日(周一到周五)
  weekCount: 1000, // 总共需要显示的周数
  tabBuilder: (context, date) => _buildTab(context, date), // 标签生成器
  pageBuilder: (context, date) => _buildPage(context, date), // 页面生成器
),
  1. 使用控制器导航到特定日期:
controller.animateTo(DateTime.now()); // 导航到当前日期
  1. 提供回调以监听导航事件:
onTabScrolled: (date) => debugPrint('onTabScrolled: $date'), // 滚动时的回调
onTabChanged: (date) => debugPrint('onTabChanged: $date'), // 切换标签时的回调
onPageChanged: (date) => debugPrint('onPageChanged: $date'), // 切换页面时的回调

完整示例Demo

import 'package:flutter/material.dart';
import 'package:intl/intl.dart'; // 日期格式化库
import 'package:weekly_tab_pager/weekly_tab_pager.dart'; // 引入weekly_tab_pager包

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

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

  [@override](/user/override)
  State<MainApp> createState() => _MainAppState();
}

class _MainAppState extends State<MainApp> {
  final weekdays = [2, 3, 4, 5, 6]; // 显示周二到周六
  final weekCount = 100; // 显示100周
  late DateTime startDate;
  late WeeklyTabController controller;

  [@override](/user/override)
  void initState() {
    super.initState();
    startDate = WeeklyTabNavigator.calcSafeDate(DateTime.now(), weekdays); // 计算安全起始日期
    controller = WeeklyTabController(position: startDate); // 初始化控制器
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false, // 隐藏调试横幅
      theme: ThemeData(
        colorScheme: ColorScheme.fromSwatch(primarySwatch: Colors.blue), // 主题颜色
      ),
      home: Scaffold(
        body: SafeArea(
          child: Column(
            children: [
              Expanded(
                child: WeeklyTabNavigator(
                  controller: controller, // 控制器
                  weekdays: weekdays, // 工作日
                  weekCount: weekCount, // 周数
                  tabBuilder: (context, date) => _buildTab(context, date), // 标签生成器
                  pageBuilder: (context, date) => _buildPage(context, date), // 页面生成器
                  onTabScrolled: (value) => debugPrint('onTabScrolled: $value'), // 滚动时的回调
                  onTabChanged: (value) => debugPrint('onTabChanged: $value'), // 切换标签时的回调
                  onPageChanged: (value) => debugPrint('onPageChanged: $value'), // 切换页面时的回调
                ),
              ),
              const SizedBox(height: 24),
              FilledButton(
                onPressed: () => controller.animateTo(startDate), // 重置位置按钮
                child: const Text('Reset Position'),
              ),
              const SizedBox(height: 200),
            ],
          ),
        ),
      ),
    );
  }

  Widget _buildTab(BuildContext context, DateTime date) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Text(DateFormat('E').format(date).toUpperCase()), // 显示星期几的缩写并大写
        const SizedBox(height: 4),
        Text(date.day.toString()), // 显示日期
      ],
    );
  }

  Widget _buildPage(BuildContext context, DateTime date) {
    return Card(
      elevation: 8, // 设置阴影深度
      margin: const EdgeInsets.all(24),
      child: Center(
        child: Text(
          DateFormat.yMMMMd().format(date), // 显示完整日期格式
          style: Theme.of(context).textTheme.titleLarge,
        ),
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何使用 weekly_tab_pager 插件在 Flutter 中实现周标签页管理的示例代码。weekly_tab_pager 是一个用于管理周标签页的 Flutter 插件,允许用户轻松地在不同周的日期之间切换。

首先,确保你的 Flutter 项目中已经添加了 weekly_tab_pager 依赖。在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  weekly_tab_pager: ^最新版本号  # 请替换为实际的最新版本号

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

接下来,你可以在你的 Flutter 应用中使用 WeeklyTabPager 组件。以下是一个完整的示例,展示如何在一个简单的 Flutter 应用中使用 weekly_tab_pager

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Weekly Tab Pager Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: WeeklyTabPagerDemo(),
    );
  }
}

class WeeklyTabPagerDemo extends StatefulWidget {
  @override
  _WeeklyTabPagerDemoState createState() => _WeeklyTabPagerDemoState();
}

class _WeeklyTabPagerDemoState extends State<WeeklyTabPagerDemo> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Weekly Tab Pager Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: WeeklyTabPager(
          initialDate: DateTime.now(),
          onPageChanged: (DateTime date) {
            // 每当周标签页改变时调用
            print('Selected date: $date');
          },
          builder: (BuildContext context, DateTime date) {
            // 构建每周的标签页内容
            return Center(
              child: Text(
                'Week of ${DateFormat('MMMM d, yyyy').format(date)}',
                style: TextStyle(fontSize: 24),
              ),
            );
          },
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们创建了一个简单的 Flutter 应用,并在 home 属性中设置了 WeeklyTabPagerDemo 组件。
  2. WeeklyTabPagerDemo 是一个有状态的组件,其状态包含构建周标签页所需的信息。
  3. WeeklyTabPager 组件中,我们设置了初始日期为当前日期 (DateTime.now()),并定义了一个 onPageChanged 回调函数,每当用户切换周标签页时,这个函数会被调用,并打印出当前选中的日期。
  4. builder 参数是一个函数,它接收一个 BuildContext 和一个 DateTime 对象,并返回每周标签页的内容。在这个例子中,我们简单地显示了一个文本,文本内容为当前周的起始日期。

这个示例展示了如何使用 weekly_tab_pager 插件来创建一个基本的周标签页管理界面。你可以根据需要进一步自定义和扩展这个示例,以满足你的应用需求。

回到顶部