Fix: Passt das Verhalten der InputFelder an, dass sich diese wirklich verändern
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../../../Services/date_service.dart';
|
||||
import '../../Dialog/dialog_action.dart';
|
||||
import '../../Dialog/dialog_input_field.dart';
|
||||
import '../../Dialog/dialog_input_field_type_enum.dart';
|
||||
@@ -9,16 +10,13 @@ import '../../Dialog/dynamic_dialog.dart';
|
||||
class DateRangePicker extends StatefulWidget {
|
||||
/// Initialisiert eine neue Instanz dieser Klasse
|
||||
const DateRangePicker({
|
||||
this.controller,
|
||||
this.autofocus = false,
|
||||
super.key,
|
||||
this.decoration,
|
||||
this.initialValue,
|
||||
this.onChanged,
|
||||
});
|
||||
|
||||
/// Der Initiale Wert des Input-Feldes
|
||||
final DateTimeRange? initialValue;
|
||||
|
||||
/// Ob das Feld automatisch ausgewählt werden soll
|
||||
final bool autofocus;
|
||||
|
||||
@@ -28,42 +26,39 @@ class DateRangePicker extends StatefulWidget {
|
||||
/// Die Dekoration, wie das Feld aussehen soll
|
||||
final InputDecoration? decoration;
|
||||
|
||||
/// Der Controller über den der Wert des Inputfeldes gesetzt
|
||||
/// und ausgelesen werden kann
|
||||
final TextEditingController? controller;
|
||||
|
||||
@override
|
||||
State<StatefulWidget> createState() => _DateRangePicker();
|
||||
}
|
||||
|
||||
class _DateRangePicker extends State<DateRangePicker> {
|
||||
final ValueNotifier<DateTimeRange?> _value = ValueNotifier(null);
|
||||
final TextEditingController _valueController = TextEditingController();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
void dispose() {
|
||||
_valueController.dispose();
|
||||
|
||||
_value.value = widget.initialValue;
|
||||
_value.addListener(() {
|
||||
widget.onChanged?.call(_value.value);
|
||||
});
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(final BuildContext context) => TextField(
|
||||
readOnly: true,
|
||||
controller: TextEditingController(
|
||||
text: widget.initialValue != null
|
||||
? '${widget.initialValue!.start.day}'
|
||||
'.${widget.initialValue!.start.month}'
|
||||
'.${widget.initialValue!.start.year}'
|
||||
' - '
|
||||
'${widget.initialValue!.end.day}'
|
||||
'.${widget.initialValue!.end.month}'
|
||||
'.${widget.initialValue!.end.year}'
|
||||
: null,
|
||||
),
|
||||
controller: widget.controller ?? _valueController,
|
||||
decoration: widget.decoration,
|
||||
onTap: _pickDateRange,
|
||||
);
|
||||
|
||||
Future<void> _pickDateRange() async {
|
||||
final TextEditingController controller =
|
||||
widget.controller ?? _valueController;
|
||||
|
||||
final DateTimeRange<DateTime>? dateTimeRange =
|
||||
DateService.stringToDateTimeRange(controller.text);
|
||||
|
||||
await DynamicDialog(
|
||||
title: 'Zeitraum auswählen',
|
||||
inputFields: [
|
||||
@@ -72,14 +67,14 @@ class _DateRangePicker extends State<DateRangePicker> {
|
||||
label: 'Startdatum',
|
||||
keyboardType: TextInputType.datetime,
|
||||
inputType: DialogInputFieldTypeEnum.date,
|
||||
initialValue: _value.value?.start,
|
||||
initialValue: dateTimeRange?.start,
|
||||
),
|
||||
DialogInputField(
|
||||
id: 'dateTo',
|
||||
label: 'Enddatum',
|
||||
keyboardType: TextInputType.datetime,
|
||||
inputType: DialogInputFieldTypeEnum.date,
|
||||
initialValue: _value.value?.end,
|
||||
initialValue: dateTimeRange?.end,
|
||||
),
|
||||
],
|
||||
actions: [
|
||||
@@ -87,7 +82,8 @@ class _DateRangePicker extends State<DateRangePicker> {
|
||||
DialogAction(
|
||||
label: 'Leeren',
|
||||
onPressed: (_) {
|
||||
_value.value = null;
|
||||
controller.text = '';
|
||||
widget.onChanged?.call(null);
|
||||
},
|
||||
),
|
||||
DialogAction(
|
||||
@@ -98,10 +94,13 @@ class _DateRangePicker extends State<DateRangePicker> {
|
||||
values['dateFrom'] is DateTime &&
|
||||
values['dateTo'] != null &&
|
||||
values['dateTo'] is DateTime) {
|
||||
_value.value = DateTimeRange(
|
||||
final DateTimeRange<DateTime> timeRange = DateTimeRange(
|
||||
start: values['dateFrom'],
|
||||
end: values['dateTo'],
|
||||
);
|
||||
|
||||
controller.text = DateService.dateTimeRangeToString(timeRange)!;
|
||||
widget.onChanged?.call(timeRange);
|
||||
}
|
||||
},
|
||||
),
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import 'package:date_field/date_field.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
|
||||
import '../../../Services/date_service.dart';
|
||||
|
||||
/// Ein Feld mit Popup über welches man Datumsfelder auswählen kann
|
||||
class DynamicDateTimeField extends StatefulWidget {
|
||||
@@ -45,7 +46,7 @@ class _DynamicDateTimeFieldState extends State<DynamicDateTimeField> {
|
||||
@override
|
||||
Widget build(final BuildContext context) => DateTimeField(
|
||||
initialPickerDateTime: widget.initialValue,
|
||||
dateFormat: DateFormat('d.M.y'),
|
||||
dateFormat: DateService.dateFormat,
|
||||
value: _value,
|
||||
mode: widget.mode,
|
||||
autofocus: widget.autofocus,
|
||||
|
||||
Reference in New Issue
Block a user