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}');
    });
  }
相关推荐
时光慢煮18 小时前
从零构建跨端图书馆管理页面:Flutter × OpenHarmony 实战指南-架构搭建
flutter·开源·openharmony
向前V18 小时前
Flutter for OpenHarmony数独游戏App实战:单元格交互与选中
flutter·游戏·交互
小白阿龙19 小时前
鸿蒙+flutter 跨平台开发——简易井字棋小游戏实现
flutter·华为·harmonyos·鸿蒙
夜雨声烦丿19 小时前
Flutter 框架跨平台鸿蒙开发 - 打造随机抽奖/点名器应用
flutter·华为·harmonyos
时光慢煮19 小时前
Flutter 编译开发 OpenHarmony 全流程实战教程-基于开源仓库GitCode 搜索工具 v1.0.3 的跨平台实践
flutter·开源·gitcode
小白阿龙19 小时前
鸿蒙+flutter 跨平台开发——Placeholder 控件的基础使用场景
flutter·华为·harmonyos·鸿蒙
时光慢煮19 小时前
基于 Flutter × OpenHarmony 图书馆管理系统之构建书籍管理模块
flutter·华为·开源·openharmony
IT陈图图19 小时前
智慧图书馆的数字名片:基于 Flutter × OpenHarmony 的读者卡片构建实践
flutter·鸿蒙·openharmony
南村群童欺我老无力.19 小时前
Flutter 框架跨平台鸿蒙开发 - 打造专业级单位换算器,支持8大类50+单位互转
flutter·华为·harmonyos
南村群童欺我老无力.19 小时前
Flutter 框架跨平台鸿蒙开发 - 井字棋游戏开发指南(含Minimax AI)
人工智能·flutter·华为·harmonyos