From d9a26af50a6e25f92378e77ef89ff33208640099 Mon Sep 17 00:00:00 2001 From: kavan trivedi Date: Tue, 6 Sep 2022 14:08:07 +0530 Subject: [PATCH] fixes #86 Enhancement regarding support of custom validator --- lib/credit_card_form.dart | 88 +++++++++++++++++++++++---------------- 1 file changed, 53 insertions(+), 35 deletions(-) diff --git a/lib/credit_card_form.dart b/lib/credit_card_form.dart index 350533c..c1f1b51 100644 --- a/lib/credit_card_form.dart +++ b/lib/credit_card_form.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_credit_card/flutter_credit_card.dart'; +import 'flutter_credit_card.dart'; + class CreditCardForm extends StatefulWidget { const CreditCardForm({ Key? key, @@ -41,6 +43,10 @@ class CreditCardForm extends StatefulWidget { this.isCardNumberVisible = true, this.isExpiryDateVisible = true, this.autovalidateMode, + this.cardNumberValidator, + this.expiryDateValidator, + this.cvvValidator, + this.cardHolderValidator, }) : super(key: key); final String cardNumber; @@ -72,6 +78,11 @@ class CreditCardForm extends StatefulWidget { final InputDecoration cvvCodeDecoration; final AutovalidateMode? autovalidateMode; + final String? Function(String?)? cardNumberValidator; + final String? Function(String?)? expiryDateValidator; + final String? Function(String?)? cvvValidator; + final String? Function(String?)? cardHolderValidator; + @override _CreditCardFormState createState() => _CreditCardFormState(); } @@ -184,13 +195,14 @@ class _CreditCardFormState extends State { textInputAction: TextInputAction.next, autofillHints: const [AutofillHints.creditCardNumber], autovalidateMode: widget.autovalidateMode, - validator: (String? value) { - // Validate less that 13 digits +3 white spaces - if (value!.isEmpty || value.length < 16) { - return widget.numberValidationMessage; - } - return null; - }, + validator: widget.cardNumberValidator ?? + (String? value) { + // Validate less that 13 digits +3 white spaces + if (value!.isEmpty || value.length < 16) { + return widget.numberValidationMessage; + } + return null; + }, ), ), ), @@ -207,8 +219,10 @@ class _CreditCardFormState extends State { key: widget.expiryDateKey, controller: _expiryDateController, onChanged: (String value) { - if (_expiryDateController.text.startsWith(RegExp('[2-9]'))) { - _expiryDateController.text = '0' + _expiryDateController.text; + if (_expiryDateController.text + .startsWith(RegExp('[2-9]'))) { + _expiryDateController.text = + '0' + _expiryDateController.text; } setState(() { expiryDate = _expiryDateController.text; @@ -230,27 +244,29 @@ class _CreditCardFormState extends State { autofillHints: const [ AutofillHints.creditCardExpirationDate ], - validator: (String? value) { - if (value!.isEmpty) { - return widget.dateValidationMessage; - } - final DateTime now = DateTime.now(); - final List date = value.split(RegExp(r'/')); - final int month = int.parse(date.first); - final int year = int.parse('20${date.last}'); - final int lastDayOfMonth = month < 12 - ? DateTime(year, month + 1, 0).day - : DateTime(year + 1, 1, 0).day; - final DateTime cardDate = DateTime( - year, month, lastDayOfMonth, 23, 59, 59, 999); + validator: widget.expiryDateValidator ?? + (String? value) { + if (value!.isEmpty) { + return widget.dateValidationMessage; + } + final DateTime now = DateTime.now(); + final List date = + value.split(RegExp(r'/')); + final int month = int.parse(date.first); + final int year = int.parse('20${date.last}'); + final int lastDayOfMonth = month < 12 + ? DateTime(year, month + 1, 0).day + : DateTime(year + 1, 1, 0).day; + final DateTime cardDate = DateTime( + year, month, lastDayOfMonth, 23, 59, 59, 999); - if (cardDate.isBefore(now) || - month > 12 || - month == 0) { - return widget.dateValidationMessage; - } - return null; - }, + if (cardDate.isBefore(now) || + month > 12 || + month == 0) { + return widget.dateValidationMessage; + } + return null; + }, ), ), ), @@ -291,12 +307,13 @@ class _CreditCardFormState extends State { onCreditCardModelChange(creditCardModel); }); }, - validator: (String? value) { - if (value!.isEmpty || value.length < 3) { - return widget.cvvValidationMessage; - } - return null; - }, + validator: widget.cvvValidator ?? + (String? value) { + if (value!.isEmpty || value.length < 3) { + return widget.cvvValidationMessage; + } + return null; + }, ), ), ), @@ -330,6 +347,7 @@ class _CreditCardFormState extends State { FocusScope.of(context).unfocus(); onCreditCardModelChange(creditCardModel); }, + validator: widget.cardHolderValidator, ), ), ),