flutter日歷組件

運(yùn)行效果

QQ錄屏2021081916253220218191626152.gif

組件基于:table_calendar進(jìn)行修改

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 作用:班次查詢(xún)
/// @date: 2021/8/18
/// @author:盧融霜
class ShiftSearch extends StatefulWidget {
  ShiftSearch({Key key}) : super(key: key);

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

class _ShiftSearchState extends State<ShiftSearch> {
  DateTime _focusedDay = DateTime.now();
  DateTime _rangeStart;
  DateTime _rangeEnd;
  DateTime _selectedDay;
  ValueNotifier<List<Event>> _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: "班次查詢(xún)",
      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<Event>(
                      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<Event> events) {
                        List<Event> 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<Event> _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<Event> _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),
              )
            ],
          ),
        )
      ],
    );
  }
}

#依賴(lài)其他組件
#國(guó)際化
  intl: ^0.17.0
#手勢(shì)
  simple_gesture_detector: ^0.2.0
調(diào)整后的代碼:鏈接: https://pan.baidu.com/s/14rSacaAJ_hrHKgDtxhyF2A 提取碼: spye
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末兄世,一起剝皮案震驚了整個(gè)濱河市上忍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌屡穗,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件藐守,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡浙芙,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)籽腕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嗡呼,“玉大人,你說(shuō)我怎么就攤上這事皇耗∧洗埃” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵郎楼,是天一觀的道長(zhǎng)万伤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)呜袁,這世上最難降的妖魔是什么敌买? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮阶界,結(jié)果婚禮上虹钮,老公的妹妹穿的比我還像新娘。我一直安慰自己荐操,他們只是感情好芜抒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著托启,像睡著了一般宅倒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屯耸,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天拐迁,我揣著相機(jī)與錄音,去河邊找鬼疗绣。 笑死线召,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的多矮。 我是一名探鬼主播缓淹,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼塔逃!你這毒婦竟也來(lái)了讯壶?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤湾盗,失蹤者是張志新(化名)和其女友劉穎伏蚊,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體格粪,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡躏吊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年氛改,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片比伏。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胜卤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凳怨,到底是詐尸還是另有隱情瑰艘,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布肤舞,位于F島的核電站紫新,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一浅乔、第九天 我趴在偏房一處隱蔽的房頂上張望脚作。 院中可真熱鬧翠忠,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至宰僧,卻和暖如春材彪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背琴儿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工段化, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人造成。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓显熏,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親晒屎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子喘蟆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容