Flutter时间规划插件time_planner的使用
Flutter时间规划插件time_planner的使用
Time Planner 是一个美观、易于使用且可定制的时间规划插件,适用于 Flutter 的移动、桌面和 Web 平台。它可以帮助用户在时间表上展示任务。
截图
Mobile | Dark |
---|---|
Desktop | Web |
---|---|
在线演示
您可以在这里查看在线演示:Web Demo
使用方法
1. 添加依赖到 pubspec.yaml
文件中
dependencies:
time_planner: ^0.1.2+1
2. 导入 time_planner
库
import 'package:time_planner/time_planner.dart';
3. 使用 TimePlanner
List<TimePlannerTask> tasks = [
TimePlannerTask(
color: Colors.purple,
dateTime: TimePlannerDateTime(day: 0, hour: 14, minutes: 30),
minutesDuration: 90,
daysDuration: 1,
onTap: () {},
child: Text(
'this is a task',
style: TextStyle(color: Colors.grey[350], fontSize: 12),
),
),
];
TimePlanner(
startHour: 6,
endHour: 23,
headers: [
TimePlannerTitle(
date: "3/10/2021",
title: "sunday",
),
TimePlannerTitle(
date: "3/11/2021",
title: "monday",
),
TimePlannerTitle(
date: "3/12/2021",
title: "tuesday",
),
],
tasks: tasks,
)
多天任务
您可以使用 daysDuration
来创建多天任务:
TimePlannerTask(
color: Colors.blue,
dateTime: TimePlannerDateTime(day: 0, hour: 14, minutes: 30),
minutesDuration: 180,
daysDuration: 3,
onTap: () {},
child: Text(
'Multi-day task',
style: TextStyle(color: Colors.white, fontSize: 12),
),
),
样式自定义
您可以使用 TimePlannerStyle
来自定义样式:
style: TimePlannerStyle(
backgroundColor: Colors.blueGrey[900],
cellHeight: 60,
cellWidth: 60,
dividerColor: Colors.white,
showScrollBar: true,
horizontalTaskPadding: 5,
borderRadius: const BorderRadius.all(Radius.circular(8)),
),
滚动行为设置
如果您希望在桌面或 Web 平台上允许鼠标拖动,请添加以下代码:
class MyCustomScrollBehavior extends MaterialScrollBehavior {
@override
Set<PointerDeviceKind> get dragDevices => {
PointerDeviceKind.touch,
PointerDeviceKind.mouse,
};
}
MaterialApp(
scrollBehavior: MyCustomScrollBehavior(),
// ...
);
完整示例
以下是一个完整的示例,包含随机生成任务的功能:
import 'dart:math';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:time_planner/time_planner.dart';
void main() {
runApp(const MyApp());
}
class MyCustomScrollBehavior extends MaterialScrollBehavior {
@override
Set<PointerDeviceKind> get dragDevices => {
PointerDeviceKind.touch,
PointerDeviceKind.mouse,
};
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Time planner Demo',
scrollBehavior: MyCustomScrollBehavior(),
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: const MyHomePage(title: 'Time planner'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
List<TimePlannerTask> tasks = [];
void _addObject(BuildContext context) {
List<Color?> colors = [
Colors.purple,
Colors.blue,
Colors.green,
Colors.orange,
Colors.lime[600]
];
setState(() {
tasks.add(
TimePlannerTask(
color: colors[Random().nextInt(colors.length)],
dateTime: TimePlannerDateTime(
day: Random().nextInt(14),
hour: Random().nextInt(18) + 6,
minutes: Random().nextInt(60)),
minutesDuration: Random().nextInt(90) + 30,
daysDuration: Random().nextInt(4) + 1,
onTap: () {
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
content: Text('You click on time planner object')));
},
child: Text(
'this is a demo',
style: TextStyle(color: Colors.grey[350], fontSize: 12),
),
),
);
});
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Random task added to time planner!')));
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
centerTitle: true,
),
body: Center(
child: TimePlanner(
startHour: 6,
endHour: 23,
use24HourFormat: false,
setTimeOnAxis: false,
style: TimePlannerStyle(
showScrollBar: true,
interstitialEvenColor: Colors.grey[50],
interstitialOddColor: Colors.grey[200],
),
headers: const [
TimePlannerTitle(date: "3/10/2021", title: "sunday"),
TimePlannerTitle(date: "3/11/2021", title: "monday"),
TimePlannerTitle(date: "3/12/2021", title: "tuesday"),
// ... 其他日期标题
],
tasks: tasks,
),
),
floatingActionButton: FloatingActionButton(
onPressed: () => _addObject(context),
tooltip: 'Add random task',
child: const Icon(Icons.add),
),
);
}
}
通过以上步骤,您可以在 Flutter 应用中轻松集成并使用 time_planner
插件来管理您的时间规划需求。
更多关于Flutter时间规划插件time_planner的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter时间规划插件time_planner的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用time_planner
插件的简单示例代码。请注意,实际使用时可能需要根据插件的最新版本和文档进行调整。由于time_planner
并不是Flutter官方或广泛知名的插件,以下示例假设该插件提供了基本的时间规划功能,并且已经正确安装和配置在你的Flutter项目中。
首先,确保你已经在pubspec.yaml
文件中添加了time_planner
依赖:
dependencies:
flutter:
sdk: flutter
time_planner: ^latest_version # 替换为实际的最新版本号
然后运行flutter pub get
来安装依赖。
接下来是一个简单的Flutter应用示例,展示如何使用time_planner
插件来创建一个时间规划界面:
import 'package:flutter/material.dart';
import 'package:time_planner/time_planner.dart'; // 假设插件提供了这样的导入路径
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Time Planner Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: TimePlannerScreen(),
);
}
}
class TimePlannerScreen extends StatefulWidget {
@override
_TimePlannerScreenState createState() => _TimePlannerScreenState();
}
class _TimePlannerScreenState extends State<TimePlannerScreen> {
// 假设TimePlannerController是插件提供的控制器类
TimePlannerController? _controller;
@override
void initState() {
super.initState();
// 初始化控制器
_controller = TimePlannerController(
// 根据插件文档配置初始化参数
startTime: DateTime.now().startOfDay,
endTime: DateTime.now().startOfDay.add(Duration(days: 1)),
intervalDuration: Duration(hours: 1), // 例如,每小时一个间隔
);
}
@override
void dispose() {
_controller?.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Time Planner Demo'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: _controller != null
? TimePlanner(
controller: _controller!,
// 假设TimePlannerWidget是插件提供的主要小部件
builder: (context, timeSlot) {
// 自定义每个时间槽的显示
return Card(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
'${timeSlot.startTime.toLocal().hour}:${timeSlot.startTime.toLocal().minute:02}-${timeSlot.endTime.toLocal().hour}:${timeSlot.endTime.toLocal().minute:02}',
style: TextStyle(fontSize: 18),
),
),
);
},
)
: Center(child: CircularProgressIndicator()),
),
);
}
}
在这个示例中,我们假设time_planner
插件提供了TimePlannerController
和TimePlanner
小部件。TimePlannerController
用于配置时间规划的开始时间、结束时间和时间间隔等参数,而TimePlanner
小部件则用于渲染时间规划界面。
请注意,由于time_planner
插件的具体API和实现细节可能与我假设的不同,因此你需要参考插件的官方文档来正确配置和使用它。如果插件提供了示例代码或文档,那么遵循那些指导将是最准确的方法。