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