Изменение высоты TextFormField
Я пытаюсь заставить TextFormField widget менять свои размеры в зависимости от размеров экрана в данный момент. Я обернул TextFormField в ConstrainedBox, который изменяет ограничения высоты до нужного мне значения. В TextFormField widget я определяю поле contentPadding паддингом с большим значением по вертикали, что вызывает сразу две проблемы:
- Если Я буду использовать конечные значения в contentPadding, большие нужной мне высоты, TextFormField визуально изменяет свои размеры под нужны, однако, если я использую double.infinity (который лично мне кажется более подходящим в данном сценарии), flutter выкидывает следующую ошибку:
[ERROR:flutter/flow/layers/transform_layer.cc(23)] TransformLayer is constructed with an invalid matrix.
══╡ EXCEPTION CAUGHT BY GESTURES LIBRARY ╞══════════════════════════════════════════════════════════
The following assertion was thrown while handling a pointer data packet:
'package:flutter/src/material/input_decorator.dart': Failed assertion: line 1636 pos 18:
'transformed == position - offset': is not true.
- Даже если я буду использовать конечные значения для contentPadding, пока TextFormField рисуется правильно, курсор рисуется на 1000 пикселей выше TextFormField.
My TextFormField code:
import 'package:flutter/material.dart';
class HeliosFormTextField extends StatefulWidget {
const HeliosFormTextField({
super.key,
required this.controller,
required this.labelText,
required this.labelTextOnError,
required this.validityCriteria,
this.keyboardType,
this.obscureText = false,
this.clearOnError = true,
});
final TextEditingController controller;
final String labelText;
final String labelTextOnError;
final bool Function(String?) validityCriteria;
final bool obscureText;
final bool clearOnError;
final TextInputType? keyboardType;
@override
State<HeliosFormTextField> createState() => _HeliosFormTextFieldState();
}
class _HeliosFormTextFieldState extends State<HeliosFormTextField> {
TextFieldStatus status = TextFieldStatus.none;
///Can change behaviour of the widget only if [widget.obscureText] is true
bool obscureSymbols = true;
@override
Widget build(BuildContext context) {
return ConstrainedBox(
constraints: BoxConstraints.tightFor(height: MediaQuery.of(context).size.height * 0.065,),
child: TextFormField(
cursorErrorColor: Theme.of(context).colorScheme.primary,
obscureText: widget.obscureText ? obscureSymbols : false,
style: Theme.of(context)
.textTheme
.bodyMedium
?.copyWith(fontWeight: FontWeight.w500),
keyboardType: widget.keyboardType,
autocorrect: false,
decoration: InputDecoration(
labelText: status == TextFieldStatus.error ? widget.labelTextOnError : widget.labelText,
labelStyle: status == TextFieldStatus.error ? Theme.of(context).textTheme.bodyMedium?.copyWith(color: Colors.red) : Theme.of(context).textTheme.bodyMedium ,
border: const OutlineInputBorder(borderRadius: BorderRadius.all(Radius.circular(20)), borderSide: BorderSide.none),
floatingLabelBehavior: FloatingLabelBehavior.never,
filled: true,
fillColor: Theme.of(context).colorScheme.surface,
errorStyle: const TextStyle(
height: 0,
color: Colors.transparent,
),
isDense: true,
contentPadding: const EdgeInsets.symmetric(horizontal: 20, vertical: 1000), //If i were to put double.infinity instead 1000 the exception would trigger
suffixIcon: widget.obscureText ?
IconButton(
icon: Icon(obscureSymbols ? Icons.visibility_rounded : Icons.visibility_off_rounded),
onPressed: () => setState(() {
obscureSymbols = !obscureSymbols;
}),
)
: null,
),
controller: widget.controller,
validator: (value) {
if (!widget.validityCriteria(value)) {
if (status != TextFieldStatus.error) {
setState(() {
status = TextFieldStatus.error;
});
if (widget.clearOnError) widget.controller.clear();
}
return '';
}
return null;
},
onChanged: (value) {
if (status == TextFieldStatus.error &&
widget.validityCriteria(value)) {
setState(() {
status = TextFieldStatus.none;
});
}
},
),
);
}
}
enum TextFieldStatus {
none,
error,
selected,
}
Really hoping for your help