From 9a2862d468cc9bee31d69ab589e7190b8d684528 Mon Sep 17 00:00:00 2001 From: Matthias Nehlsen Date: Mon, 17 Jun 2024 00:38:32 +0200 Subject: [PATCH] feat: improve textfield clear behavior --- lib/features/tasks/ui/checklist_widget.dart | 42 ++++++++++++++++++++- lib/features/tasks/ui/title_text_field.dart | 25 +++++++++--- 2 files changed, 60 insertions(+), 7 deletions(-) diff --git a/lib/features/tasks/ui/checklist_widget.dart b/lib/features/tasks/ui/checklist_widget.dart index ba97d94dc..40c066e85 100644 --- a/lib/features/tasks/ui/checklist_widget.dart +++ b/lib/features/tasks/ui/checklist_widget.dart @@ -15,10 +15,50 @@ class ChecklistWidget extends StatefulWidget { } class _ChecklistWidgetState extends State { + bool _isEditing = false; + @override Widget build(BuildContext context) { return ExpansionTile( - title: const Text('Checklist'), + title: AnimatedCrossFade( + duration: const Duration(milliseconds: 200), + firstChild: Padding( + padding: const EdgeInsets.symmetric(vertical: 10), + child: TitleTextField( + initialValue: 'Checklist', + onSave: (title) { + debugPrint('Saved: $title'); + setState(() { + _isEditing = false; + }); + }, + resetToInitialValue: true, + onClear: () { + setState(() { + _isEditing = false; + }); + }, + ), + ), + secondChild: Row( + children: [ + const Text('Checklist'), + IconButton( + icon: const Icon( + Icons.edit, + size: 20, + ), + onPressed: () { + setState(() { + _isEditing = !_isEditing; + }); + }, + ), + ], + ), + crossFadeState: + _isEditing ? CrossFadeState.showFirst : CrossFadeState.showSecond, + ), subtitle: const LinearProgressIndicator( value: 0.87, semanticsLabel: 'Checklist progress', diff --git a/lib/features/tasks/ui/title_text_field.dart b/lib/features/tasks/ui/title_text_field.dart index 9c093dc2a..014c0477d 100644 --- a/lib/features/tasks/ui/title_text_field.dart +++ b/lib/features/tasks/ui/title_text_field.dart @@ -9,6 +9,7 @@ class TitleTextField extends StatefulWidget { required this.onSave, this.onClear, this.clearOnSave = false, + this.resetToInitialValue = false, this.initialValue, this.semanticsLabel, super.key, @@ -19,6 +20,7 @@ class TitleTextField extends StatefulWidget { final VoidCallback? onClear; final String? semanticsLabel; final bool clearOnSave; + final bool resetToInitialValue; @override State createState() => _TitleTextFieldState(); @@ -40,13 +42,28 @@ class _TitleTextFieldState extends State { @override Widget build(BuildContext context) { + final initialValue = widget.initialValue; + void onSave(String? value) { widget.onSave(value ?? _controller.text); if (widget.clearOnSave) { _controller.clear(); } setState(() { - _showClearButton = false; + _showClearButton = widget.resetToInitialValue; + _dirty = false; + }); + } + + void onClear() { + if (widget.resetToInitialValue && initialValue != null) { + _controller.text = initialValue; + } else { + _controller.clear(); + } + widget.onClear?.call(); + setState(() { + _showClearButton = widget.resetToInitialValue; _dirty = false; }); } @@ -92,11 +109,7 @@ class _TitleTextFieldState extends State { size: 30, semanticLabel: 'discard changes', ), - onPressed: () { - _controller.clear(); - widget.onClear?.call(); - setState(() => _showClearButton = false); - }, + onPressed: onClear, ), ), ],