Flutter年度任务管理插件flutter_annual_task的使用
Flutter年度任务管理插件flutter_annual_task的使用
flutter_annual_task
Flutter插件用于展示类似GitHub贡献的每日任务网格视图。
示例
使用
确保查看示例项目。
AnnualTaskView(
taskItem // List<AnnualTaskItem>
),
安装
在pubspec.yaml
文件中添加依赖:
dependencies:
flutter_annual_task: ^0.1.3
然后在你的项目中导入它:
import 'package:flutter_annual_task/flutter_annual_task.dart';
最后,在你的项目中添加AnnualTaskView
小部件:
AnnualTaskView(
taskItem // List<AnnualTaskItem>
),
AnnualTaskItem
AnnualTaskItem
class AnnualTaskItem {
final DateTime date;
final double proceeding; // 0.0 ~ 1.0
AnnualTaskItem(this.date, [this.proceeding = 1.0]);
...
}
proceeding
值影响每个任务单元格的不透明度。
- 显示颜色的最小值为80(最大值为255)。
AnnualTaskColorItem
如果你想为每个每日任务指定颜色,可以使用AnnualTaskColorItem
。
class AnnualTaskColorItem extends AnnualTaskItem {
final Color color;
AnnualTaskColorItem(
DateTime date, {
double proceeding = 1.0,
this.color,
}) : super(date, proceeding);
...
}
你应该生成一个AnnualTaskItem
列表(List<AnnualTaskItem>
)来使用这个包。以下是一个构建AnnualTaskItem
列表的示例。
//AnnualTaskItem
<your_item_list>.map(
(item) => AnnualTaskItem(
item.date,
0.5,
),
)
.toList();
//AnnualTaskColorItem
<your_item_list>.map(
(item) => AnnualTaskColorItem(
item.date,
color: <color_for_each_item>
),
)
.toList();
示例
单元格形状
使用AnnualTaskCellShape
指定单元格形状,可选值为AnnualTaskCellShape.ROUNDED_SQUARE
(默认)、AnnualTaskCellShape.SQUARE
或AnnualTaskCellShape.CIRCLE
。
Square
AnnualTaskView(
taskItem, // List<AnnualTaskItem>
cellShape: AnnualTaskCellShape.SQUARE,
)
Circle
AnnualTaskView(
taskItem, // List<AnnualTaskItem>
cellShape: AnnualTaskCellShape.CIRCLE,
)
AnnualTaskColorItem
AnnualTaskView(
taskItemWithColor, // List<AnnualTaskColorItem>
)
标签
你可以编辑周标签或月标签。
AnnualTaskView(
taskItem, // List<AnnualTaskItem>
showMonthLabel: false, //默认: true
showWeekDayLabel: false, //默认: true
)
自定义标签
AnnualTaskView(
taskItem, // List<AnnualTaskItem>
weekDayLabels: ['', 'Mon', '', 'Wed', '', 'Fri', ''],
monthLabels: ['1','2','3','4','5','6','7','8','9','10','11','12'],
)
weekDayLabels
和monthLabels
的类型是List<String>
。
weekDayLabels
从周日开始。weekDayLabels
的默认值是['S', 'M', 'T', 'W', 'T', 'F', 'S']
。monthLabels
的默认值是['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
。- 你可以通过空字符串(
''
)隐藏每个项目的标签。但是,weekDayLabels
的长度应为7,monthLabels
的长度应为12。
样式化的标签
AnnualTaskView(
taskItem, // List<AnnualTaskItem>
labelStyle: TextStyle(
color: Colors.blueGrey,
fontSize: 10,
fontWeight: FontWeight.bold,
), // 默认标签样式: TextStyle(fontSize: 8)
)
属性
属性名 | 类型 | 描述 |
---|---|---|
items | List<AnnualTaskItem> |
AnnualTaskItem 的列表 |
year | int |
默认: DateTime.now().year |
activateColor | Color |
默认: Theme.of(context).primaryColor |
emptyColor | Color |
proceeding 为0.0的单元格的颜色或items 中未包含的日期的颜色。默认: Color(0xFFD0D0D0) |
showWeekDayLabel | bool |
如果为真,则显示周标签。 默认: true |
cellShape | AnnualTaskCellShape |
单元格形状。可选值为AnnualTaskCellShape.ROUNDED_SQUARE 、AnnualTaskCellShape.SQUARE 或 AnnualTaskCellShape.CIRCLE 。默认: AnnualTaskCellShape.ROUNDED_SQUARE |
showMonthLabel | bool |
如果为真,则显示月标签。 默认: true |
monthLabels | List<String> |
月标签。 默认: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] |
weekDayLabels | List<String> |
周标签。 默认: ['S', 'M', 'T', 'W', 'T', 'F', 'S'] |
labelStyle | TextStyle |
标签的文本样式。 默认: TextStyle(fontSize: 8) |
完整示例代码
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter_annual_task/flutter_annual_task.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
[@override](/user/override)
Widget build(BuildContext context) {
List<AnnualTaskItem> taskItems = AnnualTaskItemHelper.generateAnnualTask();
List<AnnualTaskItem> taskItemsWithColor =
AnnualTaskItemHelper.generateAnnualTaskColorItem(taskItems);
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('年度任务视图'),
),
body: RefreshIndicator(
onRefresh: () {
setState(() {});
return Future.delayed(Duration(milliseconds: 500));
},
child: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
children: [
_buildSectionTitle('默认'),
_buildExample(
'',
AnnualTaskView(
taskItems,
showMonthLabel: false,
showWeekDayLabel: false,
),
),
// 单元格形状示例
_buildSectionTitle('单元格形状'),
_buildExample(
'方形',
AnnualTaskView(
taskItems, // List<AnnualTaskItem>
activateColor: Colors.red,
cellShape: AnnualTaskCellShape.SQUARE,
),
),
_buildExample(
'圆形',
AnnualTaskView(
taskItems, // List<AnnualTaskItem>
activateColor: Colors.red,
emptyColor: Colors.grey.withAlpha(80),
cellShape: AnnualTaskCellShape.CIRCLE,
),
),
_buildExample(
'AnnualTaskColorItem',
AnnualTaskView(
taskItemsWithColor,
weekDayLabels: [
'Sun',
'Mon',
'Tue',
'Wed',
'Thu',
'Fri',
'Sat'
],
),
),
// 标签示例
_buildSectionTitle('标签'),
_buildExample(
'无标签',
AnnualTaskView(
taskItems, // List<AnnualTaskItem>
showMonthLabel: false,
showWeekDayLabel: false,
),
),
_buildExample(
'自定义标签',
AnnualTaskView(
taskItems, // List<AnnualTaskItem>
weekDayLabels: CUSTOM_WEEKDAY_LABEL,
monthLabels: CUSTOM_MONTH_LABEL,
),
),
_buildExample(
'标签样式',
AnnualTaskView(
taskItems, // List<AnnualTaskItem>
weekDayLabels: CUSTOM_WEEKDAY_LABEL,
monthLabels: CUSTOM_MONTH_LABEL,
labelStyle: TextStyle(
color: Colors.blueGrey,
fontSize: 10,
fontWeight: FontWeight.bold,
),
),
),
],
),
),
),
),
),
);
}
Widget _buildSectionTitle(String title) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: Text(title, style: Theme.of(context).textTheme.headline6),
);
}
Widget _buildExample(String title, AnnualTaskView child) {
return Column(children: [
title?.isNotEmpty == true ? Text(title) : Container(),
SizedBox(height: 4.0),
child,
Divider(),
]);
}
}
const List<String> CUSTOM_WEEKDAY_LABEL = ['', 'Mon', '', 'Wed', '', 'Fri', ''];
const List<String> CUSTOM_MONTH_LABEL = [
'Jan',
'',
'Mar',
'',
'May',
'',
'Jul',
'',
'Sep',
'',
'Nov',
''
];
class AnnualTaskItemHelper {
static List<AnnualTaskItem> generateAnnualTask({int year, int sampleSize}) {
var rnd = new Random();
sampleSize = sampleSize ?? max(80, min(365, rnd.nextInt(200)));
year ??= DateTime.now().year;
DateTime prevDate = DateTime(year, 1, 1);
return List.generate(sampleSize, (idx) {
int maxDiff =
(365 - prevDate.difference(DateTime(year, 12, 31)).inDays) ~/
(sampleSize - idx);
prevDate = prevDate.add(Duration(days: rnd.nextInt(maxDiff) + 1));
return AnnualTaskItem(prevDate, rnd.nextDouble());
});
}
static List<AnnualTaskColorItem> generateAnnualTaskColorItem(
List<AnnualTaskItem> items) {
List<Color> colors = [Colors.red, Colors.blue, Colors.orange];
return items
.map((e) => AnnualTaskColorItem(
e.date,
proceeding: e.proceeding,
color: colors[Random().nextInt(colors.length)],
))
.toList();
}
}
更多关于Flutter年度任务管理插件flutter_annual_task的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter年度任务管理插件flutter_annual_task的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
flutter_annual_task
是一个用于管理和展示年度任务的 Flutter 插件。它可以帮助开发者轻松地创建、管理和展示年度任务,适用于日程管理、项目进度跟踪等场景。以下是如何使用 flutter_annual_task
插件的基本步骤:
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 flutter_annual_task
插件的依赖:
dependencies:
flutter:
sdk: flutter
flutter_annual_task: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
以获取依赖。
2. 导入插件
在你的 Dart 文件中导入 flutter_annual_task
插件:
import 'package:flutter_annual_task/flutter_annual_task.dart';
3. 创建年度任务
使用 AnnualTask
类来创建年度任务。你可以为每个任务指定名称、描述、开始日期、结束日期等信息。
AnnualTask task = AnnualTask(
id: 'task1',
name: 'Flutter Project',
description: 'Develop a Flutter application',
startDate: DateTime(2023, 1, 1),
endDate: DateTime(2023, 12, 31),
color: Colors.blue,
);
4. 添加任务到管理器
使用 AnnualTaskManager
来管理你的年度任务。你可以添加、删除、更新任务,并获取任务列表。
AnnualTaskManager manager = AnnualTaskManager();
manager.addTask(task);
// 获取任务列表
List<AnnualTask> tasks = manager.getTasks();
5. 展示年度任务
你可以使用 AnnualTaskCalendar
组件来展示年度任务。这个组件会根据任务的日期范围在日历中标记出任务。
class AnnualTaskPage extends StatelessWidget {
final AnnualTaskManager manager;
AnnualTaskPage({required this.manager});
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Annual Task Management'),
),
body: AnnualTaskCalendar(
tasks: manager.getTasks(),
onTaskTap: (task) {
// 处理任务点击事件
print('Task tapped: ${task.name}');
},
),
);
}
}
6. 处理任务点击事件
你可以在 onTaskTap
回调中处理用户点击任务的事件。例如,可以导航到任务详情页面或显示任务的具体信息。
onTaskTap: (task) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => TaskDetailPage(task: task),
),
);
}
7. 更新和删除任务
你可以使用 AnnualTaskManager
来更新或删除任务。
// 更新任务
manager.updateTask(task.copyWith(name: 'Updated Flutter Project'));
// 删除任务
manager.removeTask(task.id);
8. 保存和加载任务
你可以将任务列表保存到本地存储中,并在应用启动时加载任务。
// 保存任务
manager.saveTasks();
// 加载任务
manager.loadTasks();
9. 自定义样式
你可以通过自定义 AnnualTaskCalendar
的样式来适应你的应用主题。
AnnualTaskCalendar(
tasks: manager.getTasks(),
onTaskTap: (task) {
// 处理任务点击事件
},
calendarStyle: CalendarStyle(
// 自定义日历样式
),
taskStyle: TaskStyle(
// 自定义任务样式
),
);
10. 示例代码
以下是一个完整的示例代码,展示了如何使用 flutter_annual_task
插件:
import 'package:flutter/material.dart';
import 'package:flutter_annual_task/flutter_annual_task.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: AnnualTaskPage(
manager: AnnualTaskManager()..loadTasks(),
),
);
}
}
class AnnualTaskPage extends StatelessWidget {
final AnnualTaskManager manager;
AnnualTaskPage({required this.manager});
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Annual Task Management'),
),
body: AnnualTaskCalendar(
tasks: manager.getTasks(),
onTaskTap: (task) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => TaskDetailPage(task: task),
),
);
},
),
floatingActionButton: FloatingActionButton(
onPressed: () {
// 添加新任务
AnnualTask newTask = AnnualTask(
id: 'task2',
name: 'New Task',
description: 'This is a new task',
startDate: DateTime(2023, 6, 1),
endDate: DateTime(2023, 6, 30),
color: Colors.green,
);
manager.addTask(newTask);
manager.saveTasks();
},
child: Icon(Icons.add),
),
);
}
}
class TaskDetailPage extends StatelessWidget {
final AnnualTask task;
TaskDetailPage({required this.task});
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(task.name),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Description: ${task.description}'),
SizedBox(height: 16),
Text('Start Date: ${task.startDate}'),
SizedBox(height: 16),
Text('End Date: ${task.endDate}'),
],
),
),
);
}
}