From 46e2d960afe00c845089be7d0032ee7a3da66072 Mon Sep 17 00:00:00 2001 From: Jacques Date: Mon, 5 Feb 2024 13:00:21 +0100 Subject: [PATCH] feat(bool): Add a boolean field. Can be used for accepting terms and conditions --- example/android/build.gradle | 2 +- example/lib/main.dart | 64 ++++++++++++++++++++++++++++-- example/pubspec.lock | 35 +++++++++------- lib/flutter_registration.dart | 3 ++ lib/src/auth_screen.dart | 7 ++-- lib/src/model/auth_bool_field.dart | 47 ++++++++++++++++++++++ lib/src/model/auth_field.dart | 8 ++-- lib/src/registration_screen.dart | 2 +- pubspec.yaml | 8 ++++ 9 files changed, 148 insertions(+), 28 deletions(-) create mode 100644 lib/src/model/auth_bool_field.dart diff --git a/example/android/build.gradle b/example/android/build.gradle index 83ae220..3cdaac9 100644 --- a/example/android/build.gradle +++ b/example/android/build.gradle @@ -26,6 +26,6 @@ subprojects { project.evaluationDependsOn(':app') } -task clean(type: Delete) { +tasks.register("clean", Delete) { delete rootProject.buildDir } diff --git a/example/lib/main.dart b/example/lib/main.dart index b5d639a..e11eec8 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -2,27 +2,83 @@ // // SPDX-License-Identifier: BSD-3-Clause +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_registration/flutter_registration.dart'; import 'example_registration_repository.dart'; void main() { runApp( - const MaterialApp( - home: FlutterRegistrationDemo(), + MaterialApp( + theme: ThemeData( + inputDecorationTheme: const InputDecorationTheme( + errorStyle: TextStyle(color: Colors.red), + ), + ), + home: const FlutterRegistrationDemo(), ), ); } -class FlutterRegistrationDemo extends StatelessWidget { +class FlutterRegistrationDemo extends StatefulWidget { const FlutterRegistrationDemo({Key? key}) : super(key: key); + @override + State createState() => + _FlutterRegistrationDemoState(); +} + +class _FlutterRegistrationDemoState extends State { + late List steps; + + @override + void initState() { + super.initState(); + + steps = RegistrationOptions.getDefaultSteps(); + + steps[1].fields.add( + AuthBoolField( + name: 'termsConditions', + widgetType: BoolWidgetType.checkbox, + validators: [ + (value) { + if (value == null || !value) { + return 'Required'; + } + + return null; + }, + ], + rightWidget: Text.rich( + TextSpan( + text: 'I agree with the ', + // style: const TextStyle(fontSize: 16, color: Colors.black), + children: [ + TextSpan( + text: 'terms & conditions', + style: const TextStyle( + decoration: TextDecoration.underline, + ), + recognizer: TapGestureRecognizer() + ..onTap = () { + debugPrint('Open terms and conditions'); + }, + ), + ], + ), + ), + ), + ); + } + @override Widget build(BuildContext context) { return RegistrationScreen( registrationOptions: RegistrationOptions( + previousButtonBuilder: (onPressed, label) => null, registrationRepository: ExampleRegistrationRepository(), - registrationSteps: RegistrationOptions.getDefaultSteps(), + registrationSteps: steps, afterRegistration: () { debugPrint('Registered!'); }, diff --git a/example/pubspec.lock b/example/pubspec.lock index d9807c5..1018722 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: transitive description: name: collection - sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "1.17.2" + version: "1.18.0" cupertino_icons: dependency: "direct main" description: @@ -62,6 +62,13 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_input_library: + dependency: transitive + description: + path: "../../flutter_input_library" + relative: true + source: path + version: "2.7.0" flutter_lints: dependency: "direct dev" description: @@ -81,7 +88,7 @@ packages: path: ".." relative: true source: path - version: "0.5.0" + version: "1.2.0" flutter_test: dependency: "direct dev" description: flutter @@ -123,10 +130,10 @@ packages: dependency: transitive description: name: meta - sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.10.0" path: dependency: transitive description: @@ -152,18 +159,18 @@ packages: dependency: transitive description: name: stack_trace - sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.11.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" string_scanner: dependency: transitive description: @@ -184,10 +191,10 @@ packages: dependency: transitive description: name: test_api - sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" url: "https://pub.dev" source: hosted - version: "0.6.0" + version: "0.6.1" vector_math: dependency: transitive description: @@ -200,10 +207,10 @@ packages: dependency: transitive description: name: web - sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 url: "https://pub.dev" source: hosted - version: "0.1.4-beta" + version: "0.3.0" sdks: - dart: ">=3.1.0-185.0.dev <4.0.0" + dart: ">=3.2.0-194.0.dev <4.0.0" flutter: ">=1.17.0" diff --git a/lib/flutter_registration.dart b/lib/flutter_registration.dart index eac231f..8719e4f 100644 --- a/lib/flutter_registration.dart +++ b/lib/flutter_registration.dart @@ -10,5 +10,8 @@ export 'src/model/auth_exception.dart'; export 'src/model/auth_field.dart'; export 'src/model/auth_step.dart'; export 'src/model/auth_text_field.dart'; +export 'src/model/auth_bool_field.dart'; export 'src/registration_screen.dart'; export 'src/service/registration_repository.dart'; +export 'package:flutter_input_library/flutter_input_library.dart' + show BoolWidgetType; diff --git a/lib/src/auth_screen.dart b/lib/src/auth_screen.dart index bc18d18..ab0eca8 100644 --- a/lib/src/auth_screen.dart +++ b/lib/src/auth_screen.dart @@ -24,7 +24,7 @@ class AuthScreen extends StatefulWidget { final String title; final Future Function({ - required HashMap values, + required HashMap values, required void Function(int? pageToReturn) onError, }) onFinish; final List steps; @@ -69,12 +69,11 @@ class _AuthScreenState extends State { FocusScope.of(context).unfocus(); if (widget.steps.last == step) { - var values = HashMap(); + var values = HashMap(); for (var step in widget.steps) { for (var field in step.fields) { - values[field.name] = - (field as AuthTextField).textController.value.text; + values[field.name] = field.value; } } diff --git a/lib/src/model/auth_bool_field.dart b/lib/src/model/auth_bool_field.dart new file mode 100644 index 0000000..d5ae36c --- /dev/null +++ b/lib/src/model/auth_bool_field.dart @@ -0,0 +1,47 @@ +// SPDX-FileCopyrightText: 2022 Iconica +// +// SPDX-License-Identifier: BSD-3-Clause + +import 'package:flutter/material.dart'; +import 'package:flutter_input_library/flutter_input_library.dart'; +import 'package:flutter_registration/flutter_registration.dart'; + +class AuthBoolField extends AuthField { + AuthBoolField({ + required super.name, + required this.widgetType, + super.title, + super.validators = const [], + super.value = '', + this.leftWidget, + this.rightWidget, + this.onChange, + }); + + final Widget? leftWidget; + final Widget? rightWidget; + final BoolWidgetType widgetType; + final Function(String value)? onChange; + + @override + Widget build() { + return FlutterFormInputBool( + widgetType: widgetType, + onChanged: (v) { + value = v; + onChange?.call(value); + }, + validator: (value) { + for (var validator in validators) { + var output = validator(value); + if (output != null) { + return output; + } + } + return null; + }, + leftWidget: leftWidget, + rightWidget: rightWidget, + ); + } +} diff --git a/lib/src/model/auth_field.dart b/lib/src/model/auth_field.dart index 23ad82b..3690139 100644 --- a/lib/src/model/auth_field.dart +++ b/lib/src/model/auth_field.dart @@ -4,18 +4,18 @@ import 'package:flutter/material.dart'; -abstract class AuthField { +abstract class AuthField { AuthField({ required this.name, this.title, this.validators = const [], - this.value = '', + required this.value, }); final String name; final Widget? title; - List validators; - String value; + List validators; + T value; Widget build(); } diff --git a/lib/src/registration_screen.dart b/lib/src/registration_screen.dart index 83328dd..46d7eef 100644 --- a/lib/src/registration_screen.dart +++ b/lib/src/registration_screen.dart @@ -17,7 +17,7 @@ class RegistrationScreen extends StatelessWidget { final RegistrationOptions registrationOptions; Future register({ - required HashMap values, + required HashMap values, required void Function(int? pageToReturn) onError, }) async { try { diff --git a/pubspec.yaml b/pubspec.yaml index d318f16..9545d98 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,11 +7,19 @@ description: A Flutter Registration package version: 1.2.0 repository: https://github.com/Iconica-Development/flutter_registration +publish_to: none + environment: sdk: ">=2.18.0 <3.0.0" flutter: ">=1.17.0" dependencies: + flutter_input_library: + path: ../flutter_input_library + # git: + # url: https://github.com/Iconica-Development/flutter_input_library + # ref: 2.7.0 + flutter: sdk: flutter flutter_localizations: