import 'package:flutter/material.dart'; import 'package:flutter_login/flutter_login_view.dart'; abstract class DialogPickerInput extends Input { const DialogPickerInput({ required this.value, required this.onPick, required this.format, List> inputValidators = const [], OnInputChange? onChange, String? title, String? description, super.key, }) : super( inputValidators: inputValidators, title: title, description: description, onChange: onChange, ); final V value; final Future Function(BuildContext context, V value) onPick; final String Function(BuildContext context, V value) format; @override State createState() => DialogPickerInputState( initialValue: value, onPick: onPick, format: format, ); } class DialogPickerInputState extends InputState { DialogPickerInputState({ required V initialValue, required this.onPick, required this.format, }) : super(initialValue); final Future Function(BuildContext context, V value) onPick; final String Function(BuildContext context, V value) format; late TextEditingController _controller; @override void initState() { super.initState(); _controller = TextEditingController(text: ''); } @override void didChangeDependencies() { super.didChangeDependencies(); _controller.text = format.call(context, value); } @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return widget.createInputShell( context, input: buildDateTimePickerButton(context), error: createErrorLabel(), title: createTitle(), description: createDescription(), focused: focusNode.hasFocus, ); } Widget buildDateTimePickerButton(BuildContext context) { return TextField( controller: _controller, showCursor: false, readOnly: true, decoration: InputDecoration( suffixIcon: context.appShell().config.appTheme.buttons.iconButton( context: context, onPressed: () async { var result = await onPick.call(context, value); setState(() { value = result; _controller.text = format.call(context, value); widget.change(value, validate()); }); }, icon: Icon( context.appShell().config.appTheme.icons.dateTimePicker, size: 30, color: Theme.of(context).colorScheme.secondary, ), ), ), ); } }