From 192fb7a1e3c7b812311ccbbd0026ca42127ab3c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vitalij=20Va=C5=A1=C4=8Denko?= Date: Wed, 7 Aug 2024 15:00:21 +0200 Subject: [PATCH] fix: [DX-1926] Fix placeholder alignment in the multiline input (#646) --- optimus/lib/src/common/field_wrapper.dart | 4 ++++ optimus/lib/src/form/input_field.dart | 26 ++++++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/optimus/lib/src/common/field_wrapper.dart b/optimus/lib/src/common/field_wrapper.dart index 78ad6a3e..5c348614 100644 --- a/optimus/lib/src/common/field_wrapper.dart +++ b/optimus/lib/src/common/field_wrapper.dart @@ -26,6 +26,7 @@ class FieldWrapper extends StatefulWidget { this.inline = false, this.multiline = false, this.statusBarState, + this.placeholder, }); final bool isEnabled; @@ -48,6 +49,7 @@ class FieldWrapper extends StatefulWidget { final bool inline; final bool multiline; final OptimusStatusBarState? statusBarState; + final Widget? placeholder; bool get hasError { final error = this.error; @@ -175,6 +177,8 @@ class _FieldWrapper extends State with ThemeGetter { child: prefix, ), ), + if (widget.placeholder case final placeholder?) + placeholder, ...widget.children, if (widget.suffix case final suffix?) Padding( diff --git a/optimus/lib/src/form/input_field.dart b/optimus/lib/src/form/input_field.dart index 439c0fce..49f0ecf4 100644 --- a/optimus/lib/src/form/input_field.dart +++ b/optimus/lib/src/form/input_field.dart @@ -115,7 +115,10 @@ class OptimusInputField extends StatefulWidget { /// An optional text to display before the input. final Widget? prefix; + /// The [Key] for the input field. final Key? inputKey; + + /// The [Key] for the field box. final Key? fieldBoxKey; /// An optional text to display after the text. @@ -128,8 +131,10 @@ class OptimusInputField extends StatefulWidget { /// {@macro flutter.widgets.editableText.readOnly} final bool readOnly; + /// The callback to be called when the field is tapped. final VoidCallback? onTap; + /// The horizontal alignment of the text. final TextAlign textAlign; /// {@macro flutter.widgets.editableText.textCapitalization} @@ -268,6 +273,22 @@ class _OptimusInputFieldState extends State () => _isShowPasswordEnabled = !_isShowPasswordEnabled, ); + Widget? get _placeholder { + final placeholder = widget.placeholder; + if (placeholder != null && + _effectiveController.text.isEmpty && + !_effectiveFocusNode.hasFocus) { + return GestureDetector( + onTap: _effectiveFocusNode.requestFocus, + child: Text( + placeholder, + style: widget.placeholderStyle ?? + theme.getTextInputStyle(isEnabled: widget.isEnabled), + ), + ); + } + } + @override Widget build(BuildContext context) { final error = widget.error; @@ -324,6 +345,8 @@ class _OptimusInputFieldState extends State : null, fieldBoxKey: widget.fieldBoxKey, size: widget.size, + placeholder: + _placeholder, // TODO(witwash): rework when https://github.com/flutter/flutter/issues/138794 is fixed children: [ Expanded( child: CupertinoTextField( @@ -341,9 +364,6 @@ class _OptimusInputFieldState extends State minLines: _minLines, onSubmitted: widget.onSubmitted, textInputAction: widget.textInputAction, - placeholder: widget.placeholder, - placeholderStyle: widget.placeholderStyle ?? - theme.getPlaceholderStyle(isEnabled: widget.isEnabled), focusNode: _effectiveFocusNode, enabled: widget.isEnabled, padding: EdgeInsets.zero,