Line data Source code
1 : part of apptive_grid_form_widgets; 2 : 3 : /// FormComponent Widget to display a [StringFormComponent] 4 : class TextFormWidget extends StatefulWidget { 5 : /// Creates a [TextFormField] to show and edit Text contained in [component] 6 4 : const TextFormWidget({ 7 : Key? key, 8 : required this.component, 9 4 : }) : super(key: key); 10 : 11 : /// Component this Widget should reflect 12 : final StringFormComponent component; 13 : 14 3 : @override 15 3 : _TextFormWidgetState createState() => _TextFormWidgetState(); 16 : } 17 : 18 : class _TextFormWidgetState extends State<TextFormWidget> { 19 : final TextEditingController _controller = TextEditingController(); 20 : 21 3 : @override 22 : void initState() { 23 3 : super.initState(); 24 18 : _controller.text = widget.component.data.value ?? ''; 25 7 : _controller.addListener(() { 26 6 : widget.component.data.value = _controller.text; 27 : }); 28 : } 29 : 30 3 : @override 31 : void dispose() { 32 6 : _controller.dispose(); 33 3 : super.dispose(); 34 : } 35 : 36 3 : @override 37 : Widget build( 38 : BuildContext context, 39 : ) { 40 3 : return TextFormField( 41 3 : controller: _controller, 42 1 : validator: (input) { 43 4 : if (widget.component.required && (input == null || input.isEmpty)) { 44 1 : return ApptiveGridLocalization.of(context)! 45 4 : .fieldIsRequired(widget.component.property); 46 : } else { 47 : return null; 48 : } 49 : }, 50 : autovalidateMode: AutovalidateMode.onUserInteraction, 51 12 : expands: widget.component.options.multi, 52 12 : maxLines: widget.component.options.multi ? null : 1, 53 3 : decoration: InputDecoration( 54 12 : helperText: widget.component.options.description, 55 : helperMaxLines: 100, 56 21 : labelText: widget.component.options.label ?? widget.component.property, 57 12 : hintText: widget.component.options.placeholder, 58 : ), 59 : ); 60 : } 61 : }