diff --git a/lib/screens/common_widgets/env_trigger_field.dart b/lib/screens/common_widgets/env_trigger_field.dart index 3432135f0..e83cb4403 100644 --- a/lib/screens/common_widgets/env_trigger_field.dart +++ b/lib/screens/common_widgets/env_trigger_field.dart @@ -18,7 +18,9 @@ class EnvironmentTriggerField extends StatefulWidget { this.optionsWidthFactor, this.autocompleteNoTrigger, this.readOnly = false, - this.obscureText = false + this.obscureText = false, + this.maxLines = 1, + this.minLines, }) : assert( !(controller != null && initialValue != null), 'controller and initialValue cannot be simultaneously defined.', @@ -36,6 +38,8 @@ class EnvironmentTriggerField extends StatefulWidget { final AutocompleteNoTrigger? autocompleteNoTrigger; final bool readOnly; final bool obscureText; + final int? maxLines; + final int? minLines; @override State createState() => @@ -130,7 +134,9 @@ class EnvironmentTriggerFieldState extends State { _focusNode.unfocus(); }, readOnly: widget.readOnly, - obscureText: widget.obscureText + obscureText: widget.obscureText, + maxLines: widget.maxLines, + minLines: widget.minLines, ); }, diff --git a/lib/screens/common_widgets/envfield_url.dart b/lib/screens/common_widgets/envfield_url.dart index 4757c870c..1a68445c4 100644 --- a/lib/screens/common_widgets/envfield_url.dart +++ b/lib/screens/common_widgets/envfield_url.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:apidash/consts.dart'; import 'env_trigger_field.dart'; -class EnvURLField extends StatelessWidget { +class EnvURLField extends StatefulWidget { const EnvURLField({ super.key, required this.selectedId, @@ -19,13 +19,45 @@ class EnvURLField extends StatelessWidget { final void Function(String)? onFieldSubmitted; final FocusNode? focusNode; + @override + State createState() => _EnvURLFieldState(); +} + +class _EnvURLFieldState extends State { + late FocusNode _focusNode; + bool _isFocused = false; + + @override + void initState() { + super.initState(); + _focusNode = widget.focusNode ?? FocusNode(); + _focusNode.addListener(_onFocusChange); + } + + @override + void dispose() { + _focusNode.removeListener(_onFocusChange); + if (widget.focusNode == null) { + _focusNode.dispose(); + } + super.dispose(); + } + + void _onFocusChange() { + setState(() { + _isFocused = _focusNode.hasFocus; + }); + } + @override Widget build(BuildContext context) { return EnvironmentTriggerField( - keyId: "url-$selectedId", - initialValue: initialValue, - focusNode: focusNode, + keyId: "url-${widget.selectedId}", + initialValue: widget.initialValue, + focusNode: _focusNode, style: kCodeStyle, + maxLines: _isFocused ? null : 1, + minLines: 1, decoration: InputDecoration( hintText: kHintTextUrlCard, hintStyle: kCodeStyle.copyWith( @@ -33,8 +65,8 @@ class EnvURLField extends StatelessWidget { ), border: InputBorder.none, ), - onChanged: onChanged, - onFieldSubmitted: onFieldSubmitted, + onChanged: widget.onChanged, + onFieldSubmitted: widget.onFieldSubmitted, optionsWidthFactor: 1, ); } diff --git a/lib/widgets/field_url.dart b/lib/widgets/field_url.dart index 01dd1db42..135063115 100644 --- a/lib/widgets/field_url.dart +++ b/lib/widgets/field_url.dart @@ -2,7 +2,7 @@ import 'package:apidash_design_system/apidash_design_system.dart'; import 'package:flutter/material.dart'; import 'package:apidash/consts.dart'; -class URLField extends StatelessWidget { +class URLField extends StatefulWidget { const URLField({ super.key, required this.selectedId, @@ -16,12 +16,43 @@ class URLField extends StatelessWidget { final void Function(String)? onChanged; final void Function(String)? onFieldSubmitted; + @override + State createState() => _URLFieldState(); +} + +class _URLFieldState extends State { + late FocusNode _focusNode; + bool _isFocused = false; + + @override + void initState() { + super.initState(); + _focusNode = FocusNode(); + _focusNode.addListener(_onFocusChange); + } + + @override + void dispose() { + _focusNode.removeListener(_onFocusChange); + _focusNode.dispose(); + super.dispose(); + } + + void _onFocusChange() { + setState(() { + _isFocused = _focusNode.hasFocus; + }); + } + @override Widget build(BuildContext context) { return TextFormField( - key: Key("url-$selectedId"), - initialValue: initialValue, + key: Key("url-${widget.selectedId}"), + initialValue: widget.initialValue, + focusNode: _focusNode, style: kCodeStyle, + maxLines: _isFocused ? null : 1, + minLines: 1, decoration: InputDecoration( hintText: kHintTextUrlCard, hintStyle: kCodeStyle.copyWith( @@ -29,8 +60,8 @@ class URLField extends StatelessWidget { ), border: InputBorder.none, ), - onChanged: onChanged, - onFieldSubmitted: onFieldSubmitted, + onChanged: widget.onChanged, + onFieldSubmitted: widget.onFieldSubmitted, onTapOutside: (PointerDownEvent event) { FocusManager.instance.primaryFocus?.unfocus(); },