Flutter日程视图插件flutter_schedule_view的使用

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

Flutter日程视图插件flutter_schedule_view的使用

一个功能丰富的Flutter日视图控件,支持高度定制的事件列表显示、拖拽、调整大小等功能。

本项目的原始代码来自FlutterWeekView

截图

拖拽和调整大小 亮色模式 暗色模式
Drag and Resize Light Mode Dark Mode

功能特点

  • 高度可定制:轻松定制时间表视图以符合你的应用风格。
  • 拖拽支持:允许用户在计划中拖放事件。
  • 调整大小:支持上下拖拉视图调整事件的持续时间。
  • 模式切换:无缝支持亮色和暗色模式切换。

安装

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

dependencies:
  flutter_schedule_view: ^0.1.0

使用

以下是一个完整的示例代码,展示了如何使用flutter_schedule_view插件来创建一个日程视图。

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

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

class _MyHomePageState extends State<MyHomePage> {
  List<FlutterWeekViewEvent> events = [];

  [@override](/user/override)
  void initState() {
    super.initState();
    // 初始化事件列表
    events.addAll([
      FlutterWeekViewEvent(
        padding: EdgeInsets.only(left: 2, right: 2),
        title: '周迭代需求评审',
        description: '张三的预定',
        eventTextBuilder: meetingEventTextBuilder,
        start: HourMinute(hour: 7).atDate(DateTime.now()),
        end: HourMinute(hour: 8).atDate(DateTime.now()),
        decoration: () => meetingEventDecoration(context),
        onTap: (event) => debugPrint('Event 1 has been tapped !'),
      ),
      FlutterWeekViewEvent(
        padding: EdgeInsets.only(left: 2, right: 2),
        title: '富文本技术分享讨论会',
        description: '李四的预定',
        eventTextBuilder: meetingEventTextBuilder,
        start: HourMinute(hour: 8).atDate(DateTime.now()),
        end: HourMinute(hour: 10).atDate(DateTime.now()),
        decoration: () => meetingEventDecoration(context),
        onTap: (event) => debugPrint('Event 2 has been tapped !'),
      ),
      FlutterWeekViewEvent(
        padding: EdgeInsets.only(left: 2, right: 2),
        title: '研发流程管理会',
        description: '王五的预定',
        eventTextBuilder: meetingEventTextBuilder,
        start: HourMinute(hour: 12).atDate(DateTime.now()),
        end: HourMinute(hour: 13).atDate(DateTime.now()),
        decoration: () => meetingEventDecoration(context),
        onTap: (event) => debugPrint('Event 3 has been tapped !'),
      )
    ]);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('日程视图'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: DayView(
          // 显示日期
          date: DateTime.now(),
          initialTime: const HourMinute(hour: 6),
          userZoomable: false,
          showTimeRangeText: true,
          // 事件列表
          events: events,
          // 风格
          style: DayViewStyle(
            // 背景颜色
            backgroundColor: Colors.white,
            // 每个小时高度
            hourRowHeight: 60,
            // 分割线颜色
            backgroundRulesColor: Color(0xFFE5E5E5),
            currentTimeRuleColor: Colors.blue,
            currentTimeCircleColor: Colors.blue,
            currentTimeCircleRadius: 5,
            currentTimeRuleHeight: 1,
            currentTimeCirclePosition: CurrentTimeCirclePosition.left,
            currentTimeTextStyle: TextStyle(
              color: Colors.blue,
              fontSize: 12,
              fontWeight: FontWeight.w400,
              height: 1.5,
            ),
          ),
          // 左侧时间文本风格
          hoursColumnStyle: HoursColumnStyle(
            width: 55,
            color: Colors.white,
            textAlignment: Alignment.center,
            textStyle: TextStyle(
                color: Colors.grey,
                fontSize: 12,
                fontWeight: FontWeight.w400,
                height: 1.5),
            timeRangeTextStyle: TextStyle(
              color: Colors.blue,
              fontSize: 12,
              fontWeight: FontWeight.w400,
              height: 1.5,
            ),
            interval: const Duration(hours: 1),
          ),
          // 拖拽选项
          dragAndDropOptions: DragAndDropOptions(
            startingGesture: isMobilePlatform()
                ? DragStartingGesture.longPress
                : DragStartingGesture.tap,
            onEventDragged: (FlutterWeekViewEvent event, DateTime newStartTime) {
              // 处理拖拽逻辑
              DateTime roundedTime = roundTimeToFitGrid(newStartTime,
                  gridGranularity: const Duration(minutes: 15));
              event.shiftEventTo(roundedTime);
            },
          ),
          // 调整大小选项
          resizeEventOptions: ResizeEventOptions(
            minimumEventDuration: const Duration(minutes: 30),
            // 处理上拉逻辑
            onEventResizedUp: (FlutterWeekViewEvent event, DateTime newStartTime) {
              event.start = newStartTime;
            },
            onEventResizeUpUpdate:
                (FlutterWeekViewEvent event, DateTime newStartTime) {
              event.start = newStartTime;
            },
            // 处理下拉逻辑
            onEventResizedDown: (FlutterWeekViewEvent event, DateTime newEndTime) {
              event.end = newEndTime;
            },
            onEventResizeDownUpdate:
                (FlutterWeekViewEvent event, DateTime newEndTime) {
              event.end = newEndTime;
            },
          ),
          // 是否可以拖放
          dragPredicate: (event) {
            return event.isNewEvent;
          },
          // 是否可以调整大小
          resizePredicate: (event) {
            return event.isNewEvent;
          },
          // 背景点击事件
          onBackgroundTappedDown: (DateTime dateTime) {
            dateTime = roundTimeToFitGrid(dateTime,
                gridGranularity: const Duration(minutes: 15));
            setState(() {
              events.removeWhere((element) => element.isNewEvent);
              events.add(
                FlutterWeekViewEvent(
                  title: '新事件',
                  description: '新事件描述',
                  padding: EdgeInsets.only(left: 16, right: 16),
                  decoration: () => newEventDecoration(context),
                  eventTextBuilder: createEventTextBuilder,
                  start: dateTime,
                  end: dateTime.add(const Duration(minutes: 30)),
                  isNewEvent: true,
                  onTap: (event) {
                    print('+++++++++++++++++++++onTap');
                  },
                ),
              );
            });
          },
        ),
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何使用 flutter_schedule_view 插件来创建一个简单日程视图的示例代码。这个插件允许你以日历形式展示日程数据,非常适合创建日程管理应用。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_schedule_view: ^x.y.z  # 请替换为最新版本号

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

接下来是一个简单的示例代码,展示了如何使用 flutter_schedule_view 创建一个日程视图:

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  final _controller = ScheduleController();

  @override
  void initState() {
    super.initState();
    // 初始化日程数据
    _initializeEvents();
  }

  void _initializeEvents() {
    // 示例事件数据
    final List<Event> events = [
      Event(
        id: '1',
        title: 'Event 1',
        startTime: DateTime(2023, 10, 1, 10, 0),
        endTime: DateTime(2023, 10, 1, 12, 0),
        color: Colors.blue,
      ),
      Event(
        id: '2',
        title: 'Event 2',
        startTime: DateTime(2023, 10, 2, 14, 0),
        endTime: DateTime(2023, 10, 2, 16, 0),
        color: Colors.red,
      ),
      // 添加更多事件...
    ];

    // 将事件添加到控制器
    _controller.addEvents(events);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Schedule View'),
      ),
      body: ScheduleView(
        controller: _controller,
        startDay: DateTime(2023, 10, 1),
        endDay: DateTime(2023, 10, 7),
        timeRange: TimeRange(
          startTime: TimeOfDay(hour: 8, minute: 0),
          endTime: TimeOfDay(hour: 18, minute: 0),
        ),
        eventBuilder: (context, event) {
          return Container(
            decoration: BoxDecoration(
              color: event.color,
              borderRadius: BorderRadius.circular(8),
            ),
            child: Padding(
              padding: const EdgeInsets.all(8.0),
              child: Text(event.title),
            ),
          );
        },
      ),
    );
  }
}

class Event {
  final String id;
  final String title;
  final DateTime startTime;
  final DateTime endTime;
  final Color color;

  Event({required this.id, required this.title, required this.startTime, required this.endTime, required this.color});
}

解释

  1. 依赖添加:在 pubspec.yaml 中添加 flutter_schedule_view 依赖。
  2. 事件数据:创建了一个 Event 类来存储事件数据,包括事件的 ID、标题、开始时间、结束时间和颜色。
  3. 控制器初始化:在 _MyHomePageStateinitState 方法中初始化事件数据并将其添加到 ScheduleController
  4. 日程视图:使用 ScheduleView 组件来展示日程视图,并设置开始日期、结束日期、时间范围以及事件自定义渲染逻辑。

这个示例代码展示了如何创建并展示一个简单的日程视图。你可以根据需求进一步扩展和自定义,例如添加更多的事件、调整视图样式等。

回到顶部