flutter封装日历选择器(单日选择)

简单封装:

引入库:table_calendar

dart 复制代码
import 'package:generated/l10n.dart';
import 'package:jade/utils/JadeColors.dart';
import 'package:jade/utils/Utils.dart';
import 'package:util/easy_loading_util.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:table_calendar/table_calendar.dart';


class CustomCalendarSelector extends StatefulWidget{
  final DateTime dateTime;
  const CustomCalendarSelector({this.dateTime});
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _CustomCalendarSelectorState();
  }
}
class _CustomCalendarSelectorState extends State<CustomCalendarSelector>{
  CalendarController _calendarController;
  DateTime _selectDateTime;
  @override
  void initState() {
    super.initState();
    _calendarController = CalendarController();
    _selectDateTime = widget.dateTime;
  }

  @override
  void dispose() {
    _calendarController.dispose();
    super.dispose();
  }
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    //
    return Container(
      height: Utils().screenWidth(context)*1.4,
      child: Column(
        children: [
          Expanded(
              child: TableCalendar(
                  calendarController: _calendarController,
                  startDay: DateTime.now(),
                  endDay: DateTime(DateTime.now().year+ 1,12,31),
                  calendarStyle: const CalendarStyle(
                    weekendStyle: TextStyle(color: Color(0xffff415b)),
                    todayColor: Colors.black12,
                    selectedColor: Color(0xff44aab0),
                  ),
                  headerStyle: HeaderStyle(
                    centerHeaderTitle: true,
                    leftChevronVisible: true,
                    rightChevronVisible: true,
                    formatButtonVisible: false,
                  ),
                  initialSelectedDay:widget.dateTime??DateTime(DateTime.now().year,
                      DateTime.now().month,DateTime.now().day+1),
                  onUnavailableDaySelected: (){
                    esLoadingToast('请选择可选日期之内的时间');
                  },
                  onDaySelected: (DateTime dateTime, List events, List holidays){
                    if(dateTime.day == DateTime.now().day){
                      esLoadingToast('请选择当期日期之后的时间');
                      return;
                    }
                    _selectDateTime = dateTime;
                  },
                  onHeaderTapped:(DateTime dateTime){}
              ),
          ),
          Container(
            margin: EdgeInsets.only(top: 20.h, left: 80.w),
            child: Row(
              children: <Widget>[
                Image.asset(
                  'images/cinema/buy/cinema_buy_icon_q.png',
                  width: 35.w,
                  height: 35.h,
                ),
                SizedBox(
                  width: 10.w,
                ),
                Text(
                  '从当日起的5个工作日内无法上刊',
                  style: TextStyle(
                      fontSize: 24.sp, color: JadeColors.green_3),
                )
              ],
            ),
          ),
          Container(
              margin: EdgeInsets.only(top: 20.h, left: 80.w, right: 80.w,bottom: 40.w),
              width: double.infinity,
              height: 85.h,
              child: TextButton(
                  style: ButtonStyle(
                      minimumSize: MaterialStateProperty.all(Size(300, 38)),
                      backgroundColor: MaterialStateProperty.all(
                          JadeColors.green_3.withOpacity(1.0))),
                  onPressed: () async {
                    if (DateTime.now().isAfter(_selectDateTime)) {
                      esLoadingToast('请选择当期日期之后的时间');
                      return;
                    }
                    Navigator.pop(context, _selectDateTime);
                  },
                  child: Text(
                    S.current.baocun,
                    style: TextStyle(fontSize: 32.sp, color: Colors.white),
                  ))
          )
        ],
      ),
    );
  }
}

引用:

dart 复制代码
_showScheduledDateBottom() {
    showModalBottomSheet(
        context: context,
        isScrollControlled: true,
        shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.only(
                topLeft: Radius.circular(25.w),
                topRight: Radius.circular(25.w))),
        builder: (BuildContext context) {
          return CustomCalendarSelector(dateTime: time);
        }).then((value) {
      if (value == null) return;
      print('${time.year}-${time.month}-${time.day}');
    });
  }
相关推荐
子春一1 小时前
Flutter for OpenHarmony:色彩捕手:基于 CIELAB 色差模型与人眼感知的高保真色彩匹配游戏架构解析
flutter·游戏·架构
ZH15455891311 小时前
Flutter for OpenHarmony Python学习助手实战:数据库操作与管理的实现
python·学习·flutter
Lionel6891 小时前
Flutter 鸿蒙:获取真实轮播图API数据
flutter
千逐682 小时前
《基于 Flutter for OpenHarmony 的沉浸式天气可视化系统设计与实现》
flutter
一只大侠的侠2 小时前
Flutter开源鸿蒙跨平台训练营 Day8获取轮播图网络数据并实现展示
flutter·开源·harmonyos
sugar_hang2 小时前
Flutter 中的 TCP
flutter
子春一4 小时前
Flutter for OpenHarmony:形状拼图:基于路径几何与空间吸附的交互式拼图系统架构解析
flutter·系统架构
ujainu13 小时前
Flutter + OpenHarmony 游戏开发进阶:用户输入响应——GestureDetector 实现点击发射
flutter·游戏·openharmony
hudawei99613 小时前
TweenAnimationBuilder和AnimatedBuilder两种动画的比较
flutter·ui·动画·tweenanimation·animatedbuilder
ujainu14 小时前
Flutter + OpenHarmony 实现无限跑酷游戏开发实战—— 对象池化、性能优化与流畅控制
flutter·游戏·性能优化·openharmony·endless runner