Skip to content

Instantly share code, notes, and snippets.

@alexkojin
Created February 9, 2021 15:20
Show Gist options
  • Save alexkojin/e1ea2df8fe0907e95478e55a1d7e475c to your computer and use it in GitHub Desktop.
Save alexkojin/e1ea2df8fe0907e95478e55a1d7e475c to your computer and use it in GitHub Desktop.
Customer month cell flutter
/// Dart import
import 'dart:math';
import 'dart:ui' as ui;
///Package import
import 'package:flutter/material.dart';
///Date picker imports
import 'package:syncfusion_flutter_datepicker/datepicker.dart';
///Local import
import '../../model/sample_view.dart';
/// Render datepicker widget with customized options
class CustomizedDatePicker extends SampleView {
/// Creates datepicker widget with customized options
const CustomizedDatePicker(Key key) : super(key: key);
@override
_CustomizedDatePickerState createState() => _CustomizedDatePickerState();
}
class _CustomizedDatePickerState extends SampleViewState {
_CustomizedDatePickerState();
List<DateTime> _specialDates;
Orientation _deviceOrientation;
@override
void initState() {
_specialDates = _getSpecialDates();
super.initState();
}
/// Returns the list of dates which will set to the special dates of the
/// date range picker.
List<DateTime> _getSpecialDates() {
final List<DateTime> dates = <DateTime>[];
final DateTime startDate =
DateTime.now().subtract(const Duration(days: 200));
final DateTime endDate = DateTime.now().add(const Duration(days: 500));
final Random random = Random();
for (DateTime date = startDate;
date.isBefore(endDate);
date = date.add(const Duration(days: 25))) {
for (int i = 0; i < 3; i++) {
dates.add(date.add(Duration(days: random.nextInt(i + 4))));
}
}
return dates;
}
@override
void didChangeDependencies() {
_deviceOrientation = MediaQuery.of(context).orientation;
super.didChangeDependencies();
}
@override
Widget build([BuildContext context]) {
final Widget _datePicker = Card(
elevation: 10,
margin: model.isWeb
? const EdgeInsets.fromLTRB(30, 60, 30, 0)
: const EdgeInsets.all(30),
child: Container(
padding: const EdgeInsets.fromLTRB(5, 0, 5, 5),
color: model.cardThemeColor,
child: _getCustomizedDatePicker(_specialDates, model.themeData)),
);
return Scaffold(
backgroundColor: model.themeData == null ||
model.themeData.brightness == Brightness.light
? null
: const Color(0x171A21),
body: Column(children: <Widget>[
Expanded(
flex: model.isWeb ? 9 : 8,
child: model.isWeb
? Center(
child:
Container(width: 400, height: 600, child: _datePicker))
: ListView(children: <Widget>[
Container(height: 450, child: _datePicker)
])),
Expanded(
flex: model.isWeb
? 1
: model.isMobileResolution &&
_deviceOrientation == Orientation.landscape
? 0
: 1,
child: Container())
]),
);
}
/// Returns the date range picker based on the properties passed
SfDateRangePicker _getCustomizedDatePicker(
[List<DateTime> specialDates, ThemeData theme]) {
final bool isDark = theme != null &&
theme.brightness != null &&
theme.brightness == Brightness.dark;
final Color monthCellBackground =
isDark ? const Color(0xFF232731) : const Color(0xfff7f4ff);
final Color indicatorColor =
isDark ? const Color(0xFF5CFFB7) : const Color(0xFF1AC4C7);
final Color highlightColor =
isDark ? const Color(0xFF5CFFB7) : Colors.deepPurpleAccent;
final Color cellTextColor =
isDark ? const Color(0xFFDFD4FF) : const Color(0xFF130438);
return SfDateRangePicker(
selectionMode: DateRangePickerSelectionMode.multiRange,
selectionShape: DateRangePickerSelectionShape.rectangle,
selectionColor: highlightColor,
selectionTextStyle:
TextStyle(color: isDark ? Colors.black : Colors.white, fontSize: 14),
minDate: DateTime.now().add(const Duration(days: -200)),
maxDate: DateTime.now().add(const Duration(days: 500)),
headerStyle: DateRangePickerHeaderStyle(
textAlign: TextAlign.center,
textStyle: TextStyle(
fontSize: 18,
color: cellTextColor,
)),
monthCellStyle: DateRangePickerMonthCellStyle(
cellDecoration: _MonthCellDecoration(
borderColor: null,
backgroundColor: monthCellBackground,
showIndicator: false,
indicatorColor: indicatorColor),
todayCellDecoration: _MonthCellDecoration(
borderColor: highlightColor,
backgroundColor: monthCellBackground,
showIndicator: false,
indicatorColor: indicatorColor),
specialDatesDecoration: _MonthCellDecoration(
borderColor: null,
backgroundColor: monthCellBackground,
showIndicator: true,
indicatorColor: indicatorColor),
disabledDatesTextStyle: TextStyle(
color: isDark ? const Color(0xFF666479) : const Color(0xffe2d7fe),
),
weekendTextStyle: TextStyle(
color: highlightColor,
),
textStyle: TextStyle(color: cellTextColor, fontSize: 14),
specialDatesTextStyle: TextStyle(color: cellTextColor, fontSize: 14),
todayTextStyle: TextStyle(color: highlightColor, fontSize: 14)),
yearCellStyle: DateRangePickerYearCellStyle(
todayTextStyle: TextStyle(color: highlightColor, fontSize: 14),
textStyle: TextStyle(color: cellTextColor, fontSize: 14),
disabledDatesTextStyle: TextStyle(
color: isDark ? const Color(0xFF666479) : const Color(0xffe2d7fe)),
leadingDatesTextStyle:
TextStyle(color: cellTextColor.withOpacity(0.5), fontSize: 14),
),
showNavigationArrow: true,
todayHighlightColor: highlightColor,
monthViewSettings: DateRangePickerMonthViewSettings(
firstDayOfWeek: 1,
viewHeaderStyle: DateRangePickerViewHeaderStyle(
textStyle: TextStyle(
fontSize: 10,
color: cellTextColor,
fontWeight: FontWeight.w600)),
dayFormat: 'EEE',
showTrailingAndLeadingDates: false,
specialDates: specialDates,
),
);
}
}
/// [_MonthCellDecoration] used to customize the month cell
/// background of [SfDateRangePicker].
/// [backgroundColor] property used to draw the fill color the month cell
/// [borderColor] property used to draw the border to highlight the
/// today month cell.
/// [showIndicator] property used to decide whether the cell
/// have indicator or not.
/// it is enabled then draw the circle on right top corner
/// with [indicatorColor].
class _MonthCellDecoration extends Decoration {
const _MonthCellDecoration(
{this.borderColor,
this.backgroundColor,
this.showIndicator,
this.indicatorColor});
final Color borderColor;
final Color backgroundColor;
final bool showIndicator;
final Color indicatorColor;
@override
BoxPainter createBoxPainter([VoidCallback onChanged]) {
return _MonthCellDecorationPainter(
borderColor: borderColor,
backgroundColor: backgroundColor,
showIndicator: showIndicator,
indicatorColor: indicatorColor);
}
}
/// [_MonthCellDecorationPainter] used to paint month cell decoration.
class _MonthCellDecorationPainter extends BoxPainter {
_MonthCellDecorationPainter(
{this.borderColor,
this.backgroundColor,
this.showIndicator,
this.indicatorColor});
final Color borderColor;
final Color backgroundColor;
final bool showIndicator;
final Color indicatorColor;
@override
void paint(Canvas canvas, Offset offset, ImageConfiguration configuration) {
final Rect bounds = offset & configuration.size;
_drawDecoration(canvas, bounds);
}
void _drawDecoration(Canvas canvas, Rect bounds) {
final Paint paint = Paint()..color = backgroundColor;
canvas.drawRRect(
RRect.fromRectAndRadius(bounds, const Radius.circular(5)), paint);
paint.style = PaintingStyle.stroke;
paint.strokeWidth = 1;
if (borderColor != null) {
paint.color = borderColor;
canvas.drawRRect(
RRect.fromRectAndRadius(bounds, const Radius.circular(5)), paint);
}
// TEXT HERE ADD MY CODE
Random random = new Random();
int randomNumber = random.nextInt(100);
final textStyle = ui.TextStyle(
color: Colors.black,
fontSize: 11,
);
final paragraphStyle = ui.ParagraphStyle(
textDirection: TextDirection.ltr,
);
final paragraphBuilder = ui.ParagraphBuilder(paragraphStyle)
..pushStyle(textStyle)
..addText(randomNumber.toString());
final constraints = ui.ParagraphConstraints(width: 300);
final paragraph = paragraphBuilder.build();
paragraph.layout(constraints);
final offset = Offset(bounds.right - 18, bounds.top + 5);
canvas.drawParagraph(paragraph, offset);
// TEXT
if (showIndicator) {
paint.color = indicatorColor;
paint.style = PaintingStyle.fill;
canvas.drawCircle(Offset(bounds.right - 6, bounds.top + 6), 2.5, paint);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment