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}');
    });
  }
相关推荐
瓜子三百克4 小时前
七、性能优化
flutter·性能优化
恋猫de小郭11 小时前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
小蜜蜂嗡嗡18 小时前
Android Studio flutter项目运行、打包时间太长
android·flutter·android studio
瓜子三百克1 天前
十、高级概念
flutter
帅次1 天前
Objective-C面向对象编程:类、对象、方法详解(保姆级教程)
flutter·macos·ios·objective-c·iphone·swift·safari
小蜜蜂嗡嗡1 天前
flutter flutter_vlc_player播放视频设置循环播放失效、初始化后获取不到视频宽高
flutter
孤鸿玉2 天前
[Flutter小技巧] Row中widget高度自适应的几种方法
flutter
bawomingtian1232 天前
FlutterView 源码解析
flutter
Zender Han2 天前
Flutter 进阶:实现带圆角的 CircularProgressIndicator
flutter