flutter日历组件

运行效果

QQ录屏2021081916253220218191626152.gif

组件基于:table_calendar进行修改

https://pub.dev/packages/table_calendar

使用代码

import 'dart:ui';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/painting.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
import 'package:lnsl_credit_flutter/base/base_routes_widget.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:lnsl_credit_flutter/routes/shiftSearch/utils/utils.dart';
import 'package:lnsl_credit_flutter/widget/tableCalendar/table_calendar.dart';

/// @description 作用:班次查询
/// @date: 2021/8/18
/// @author:卢融霜
class ShiftSearch extends StatefulWidget {
  ShiftSearch({Key key}) : super(key: key);

  @override
  _ShiftSearchState createState() => _ShiftSearchState();
}

class _ShiftSearchState extends State {
  DateTime _focusedDay = DateTime.now();
  DateTime _rangeStart;
  DateTime _rangeEnd;
  DateTime _selectedDay;
  ValueNotifier> _selectedEvents;
  CalendarFormat _calendarFormat = CalendarFormat.month;
  RangeSelectionMode _rangeSelectionMode = RangeSelectionMode.toggledOff;

  @override
  void initState() {
    super.initState();
    _selectedDay = _focusedDay;
    _selectedEvents = ValueNotifier(_getEventsForDay(_selectedDay));
  }

  @override
  void dispose() {
    _selectedEvents.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return BaseRoutesWidget(
      title: "班次查询",
      child: Ink(
        color: const Color.fromRGBO(243, 244, 246, 1),
        child: SizedBox(
            height: double.infinity,
            child: SingleChildScrollView(
              child: Column(
                children: [
                  Container(
                    decoration: BoxDecoration(
                        color: Colors.white,
                        borderRadius: BorderRadius.all(Radius.circular(10.r))),
                    padding: EdgeInsets.only(bottom: 10.r),
                    margin: EdgeInsets.only(
                        left: 10.r, right: 10.r, top: 10.r, bottom: 5.r),
                    child: TableCalendar(
                      daysOfWeekHeight: 40.r,
                      daysOfWeekStyle: DaysOfWeekStyle(
                          decoration: BoxDecoration(
                              border: Border(
                                  bottom: BorderSide(
                                      color: const Color.fromRGBO(
                                          213, 213, 213, 1),
                                      width: 0.4.r)))),
                      locale: 'zh_CN',
                      firstDay: kFirstDay,
                      lastDay: kLastDay,
                      headerStyle: HeaderStyle(
                          titleTextStyle: TextStyle(fontSize: 15.r)),
                      focusedDay: _focusedDay,
                      selectedDayPredicate: (day) =>
                          isSameDay(_selectedDay, day),
                      rangeStartDay: _rangeStart,
                      rangeEndDay: _rangeEnd,
                      calendarFormat: _calendarFormat,
                      rangeSelectionMode: _rangeSelectionMode,
                      eventLoader: _getEventsForDay,
                      startingDayOfWeek: StartingDayOfWeek.monday,
                      calendarStyle: const CalendarStyle(
                          outsideDaysVisible: true,
                          selectedDecoration: BoxDecoration(
                              color: Color.fromRGBO(0, 122, 255, 1)),
                          todayDecoration: BoxDecoration(
                              color: Color.fromRGBO(0, 122, 255, 0.5)),
                          markersMaxCount: 1,
                          markersAutoAligned: false),
                      onDaySelected: _onDaySelected,
                      onRangeSelected: _onRangeSelected,
                      onFormatChanged: (format) {
                        if (_calendarFormat != format) {
                          setState(() {
                            _calendarFormat = format;
                          });
                        }
                      },
                      onPageChanged: (focusedDay) {
                        _focusedDay = focusedDay;
                      },
                      calendarBuilders: CalendarBuilders(markerBuilder:
                          (BuildContext context, DateTime day,
                              List events) {
                        List list = kEvents[day];
                        if (list != null) {
                          BoxDecoration decoration;

                          if (day.day == 19) {
                            decoration = const BoxDecoration(
                                shape: BoxShape.circle, color: Colors.red);
                          } else if (day.day == 18) {
                            decoration = const BoxDecoration(
                                shape: BoxShape.circle, color: Colors.blue);
                          } else {
                            decoration = const BoxDecoration(
                                shape: BoxShape.circle, color: Colors.black);
                          }
                          return Container(
                              width: 7.r,
                              height: 7.r,
                              margin: EdgeInsets.only(bottom: 4.r),
                              decoration: decoration);
                        }
                        return null;
                      }),
                    ),
                  ),
                  Container(
                    width: double.infinity,
                    alignment: Alignment.topLeft,
                    padding: EdgeInsets.all(10.r),
                    decoration: BoxDecoration(
                        color: Colors.white,
                        borderRadius: BorderRadius.all(Radius.circular(10.r))),
                    margin: EdgeInsets.only(
                        left: 10.r, right: 10.r, top: 10.r, bottom: 10.r),
                    child: Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        Text(
                          "班次--早班",
                          style: TextStyle(
                              fontSize: 16.r,
                              color: const Color.fromRGBO(51, 51, 51, 1),
                              fontWeight: FontWeight.bold),
                        ),
                        Padding(
                            padding: EdgeInsets.only(top: 10.r),
                            child: ItemWidget("上班", "08:00:00")),
                        Padding(
                            padding: EdgeInsets.only(top: 0.r),
                            child: ItemWidget("下班", "17:00:00"))
                      ],
                    ),
                  )
                ],
              ),
            )),
      ),
    );
  }

  List _getEventsForDay(DateTime day) {
    // Implementation example
    return kEvents[day] ?? [];
  }

  void _onDaySelected(DateTime selectedDay, DateTime focusedDay) {
    if (!isSameDay(_selectedDay, selectedDay)) {
      setState(() {
        _selectedDay = selectedDay;
        _focusedDay = focusedDay;
        _rangeStart = null; // Important to clean those
        _rangeEnd = null;
        _rangeSelectionMode = RangeSelectionMode.toggledOff;
      });

      _selectedEvents.value = _getEventsForDay(selectedDay);
    }
  }

  void _onRangeSelected(DateTime start, DateTime end, DateTime focusedDay) {
    setState(() {
      _selectedDay = null;
      _focusedDay = focusedDay;
      _rangeStart = start;
      _rangeEnd = end;
      _rangeSelectionMode = RangeSelectionMode.toggledOn;
    });

    // `start` or `end` could be null
    if (start != null && end != null) {
      _selectedEvents.value = _getEventsForRange(start, end);
    } else if (start != null) {
      _selectedEvents.value = _getEventsForDay(start);
    } else if (end != null) {
      _selectedEvents.value = _getEventsForDay(end);
    }
  }

  List _getEventsForRange(DateTime start, DateTime end) {
    // Implementation example
    final days = daysInRange(start, end);

    return [
      for (final d in days) ..._getEventsForDay(d),
    ];
  }
}

class ItemWidget extends StatelessWidget {
  String title;
  String content;

  ItemWidget(this.title, this.content);

  @override
  Widget build(BuildContext context) {
    return Row(
      crossAxisAlignment: CrossAxisAlignment.start,
      mainAxisAlignment: MainAxisAlignment.start,
      children: [
        Column(
          children: [
            Container(
              width: 10.r,
              height: 10.r,
              decoration: const BoxDecoration(
                  shape: BoxShape.circle,
                  color: Color.fromRGBO(0, 136, 254, 1)),
            ),
            Container(
              width: 1.r,
              height: 50.r,
              color: const Color.fromRGBO(221, 221, 221, 1),
            )
          ],
        ),
        Padding(
          padding: EdgeInsets.only(left: 15.r, top: 0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text(
                title,
                style: TextStyle(
                    height: 1,
                    color: const Color.fromRGBO(51, 51, 51, 1),
                    fontSize: 16.r),
              ),
              Text(
                content,
                style: TextStyle(
                    color: const Color.fromRGBO(102, 102, 102, 1),
                    fontSize: 14.r),
              )
            ],
          ),
        )
      ],
    );
  }
}

#依赖其他组件
#国际化
  intl: ^0.17.0
#手势
  simple_gesture_detector: ^0.2.0
调整后的代码:链接: https://pan.baidu.com/s/14rSacaAJ_hrHKgDtxhyF2A 提取码: spye

你可能感兴趣的:(flutter日历组件)