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