diff --git a/example/lib/main.dart b/example/lib/main.dart index 9d712df..2bf2b41 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -86,10 +86,11 @@ class AddressFormExample extends StatelessWidget { AddressForm( onSubmit: (value) => value, controller: _addressController), TextButton( - onPressed: () { - _addressController.validate; - }, - child: Text('Test')) + onPressed: () { + _addressController.validate(); + }, + child: Text('Test'), + ) ], ), ); diff --git a/lib/src/address_form.dart b/lib/src/address_form.dart index 3493112..5621ae4 100644 --- a/lib/src/address_form.dart +++ b/lib/src/address_form.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:ffi'; import 'package:flutter/material.dart'; @@ -48,58 +47,68 @@ class AddressForm extends StatefulWidget { class _AddressFormState extends State { @override Widget build(BuildContext context) { - return Column( - children: [ - AddressFormTextField( - controller: widget._addressController._zipcodeController, - fieldDecoration: widget.zipCodeDecoration, - ), - Flexible( - child: Row( - children: [ - AddressFormTextField( - controller: widget._addressController._housenumberController, - fieldDecoration: widget.housenumberDecoration, - ), - AddressFormTextField( - controller: widget._addressController._suffixController, - fieldDecoration: widget.suffixDecoration, - ), - ], + return Flexible( + child: Column( + children: [ + AddressFormTextField( + validator: widget._addressController.zipCodeValidator, + controller: widget._addressController._zipcodeController, + fieldDecoration: widget.zipCodeDecoration, ), - ), - AddressFormTextField( - controller: widget._addressController._streetController, - fieldDecoration: widget.streetDecoration, - ), - AddressFormTextField( - controller: widget._addressController._cityController, - fieldDecoration: widget.cityDecoration, - ), - ], + Flexible( + child: Row( + children: [ + AddressFormTextField( + validator: widget._addressController.housenumberValidator, + controller: widget._addressController._housenumberController, + fieldDecoration: widget.housenumberDecoration, + ), + AddressFormTextField( + validator: widget._addressController.suffixValidator, + controller: widget._addressController._suffixController, + fieldDecoration: widget.suffixDecoration, + ), + ], + ), + ), + AddressFormTextField( + validator: widget._addressController.streetValidator, + controller: widget._addressController._streetController, + fieldDecoration: widget.streetDecoration, + ), + AddressFormTextField( + validator: widget._addressController.cityValidator, + controller: widget._addressController._cityController, + fieldDecoration: widget.cityDecoration, + ), + ], + ), ); } } class AddressFormTextField extends StatelessWidget { - AddressFormTextField({ - super.key, - required this.fieldDecoration, - required this.controller, - }) { - _addressFieldDecoration = fieldDecoration; - } + AddressFormTextField( + {super.key, + required this.fieldDecoration, + required this.controller, + required this.validator}); final TextEditingController controller; final InputDecoration fieldDecoration; + final String? Function(String) validator; - late final InputDecoration _addressFieldDecoration; + late InputDecoration _addressFieldDecoration; + + String? get _errorText => validator(controller.value.text); @override Widget build(BuildContext context) { return ValueListenableBuilder( valueListenable: controller, builder: (context, value, _) { + _addressFieldDecoration = + fieldDecoration.copyWith(errorText: _errorText); return Flexible( child: Container( margin: const EdgeInsets.all(10), @@ -165,9 +174,7 @@ class AddressController extends ChangeNotifier { AddressModel get model => _model; - bool get validate => _validate(); - - bool _validate() { + bool validate() { if (zipCodeValidator.call(_zipcodeController.text) == null && streetValidator.call(_streetController.text) == null && housenumberValidator.call(_housenumberController.text) == null &&