Compare commits

...

11 commits

Author SHA1 Message Date
Freek van de Ven
6d4db87ff1 feat: add onBack callback for the FlutterFormOptions 2024-09-05 13:09:17 +02:00
Freek van de Ven
5528664fb7 chore: add component release workflow 2024-09-03 14:21:33 +02:00
5eb914c23a chore: ready the package for deployment to the pub server 2024-09-03 14:21:33 +02:00
9af9822fc1 chore: add fvm configuration to gitignore 2024-09-03 14:21:33 +02:00
Gorter-dev
204d0c6ca2
Merge pull request #50 from Iconica-Development/feature/multiple_choice
feat: add multiple choice form field
2024-07-01 16:45:35 +02:00
mike doornenbal
a79b0c3ad3 feat: add multiple choice form field 2024-07-01 16:43:36 +02:00
Gorter-dev
18ac2dd82f
Merge pull request #49 from Iconica-Development/feature/dropdownfield
feat: add dropdownfield
2024-07-01 08:54:54 +02:00
mike doornenbal
a88defd186 feat: add dropdownfield 2024-06-28 14:22:33 +02:00
Gorter-dev
a9d3a2c751
Merge pull request #48 from Iconica-Development/chore/upgrade-intl
chore(deps): loosen dep on intl
2024-05-14 14:20:37 +02:00
Bart Ribbers
335a1e1dd1 chore: upgrade version to 6.3.2 2024-05-14 14:19:08 +02:00
Bart Ribbers
ae071cef41 chore(deps): loosen dep on intl
The latest Flutter requires intl 0.19.0 and now every app/package
depending on us fails to build with the latest Flutter because we were
explicitly requiring 0.18.0

Minor upgrades should be safe anyway, we only care for major versions
upgrade, so loosen the requirements a bit to support anything from
0.18.0 up to (but not including) 1.0.0
2024-05-14 14:17:26 +02:00
13 changed files with 530 additions and 205 deletions

14
.github/workflows/release.yml vendored Normal file
View file

@ -0,0 +1,14 @@
name: Iconica Standard Component Release Workflow
# Workflow Caller version: 1.0.0
on:
release:
types: [published]
workflow_dispatch:
jobs:
call-global-iconica-workflow:
uses: Iconica-Development/.github/.github/workflows/component-release.yml@master
secrets: inherit
permissions: write-all

6
.gitignore vendored
View file

@ -28,4 +28,8 @@ migrate_working_dir/
.dart_tool/
.packages
build/
.metadata
.metadata
# FVM Version Cache
.fvm/
.fvmrc

View file

@ -1,136 +1,129 @@
## 0.0.2 - October 10th 2022
## 6.6.0 - September 5th 2024
- Added `onBack` callback to the `FlutterFormOptions` to detect when the back button is pressed
- Initial release
## 6.5.0 - July 1st 2024
- Added `FlutterFormMultipleChoice` for multiple choice selection
## 0.1.0 - October 12th 2022
## 6.4.0 - June 28th 2024
- Added `FlutterFormInputDropdown` for dropdown selection
- Added style property to `FlutterFormInputEmail`
- Added a multi line plain text input widget
- Ability to set the scrolldirection of the pageview
- Ability to set the scrollphysics of the pages' scrollview.
## 6.3.2 - May 15th 2024
- Loosened the dependency on intl to be more compatible with several Flutter versions
## 0.2.0 - October 13th 2022
## 6.3.1 - February 29th 2024
- Removed `TranslationService` and add `validationMessage` property to fields with validation.
- Added a way to override a input field validator.
- Exposed all properties for `FlutterFormInputDateTime` provided by `flutter_input_library`.
- Added date input widget
## 6.3.0 - February 21st 2024
- Updated the `flutter_input_library` from 3.1.0 to 3.2.1
- Added `FlutterFormInputPhone` for phone number with dial code selection.
- Added `InputDecoration` parameter to the following input fields: `FlutterFormInputEmail` and `FlutterFormInputPassword`
## 1.0.0 - October 13th 2022
## 6.2.5 - February 15th 2024
- Updated the `flutter_input_library` from 3.0.1 to 3.1.0
- Fix: Proper use of generics
- Inputcontrollers now have an onChange.
- Added switch input field
## 6.2.4 - February 9th 2024
- Updated the `flutter_input_library` from 3.0.0 to 3.0.1
## 1.0.1 - October 13th 2022
## 6.2.3 - February 7th 2024
- Added CI and linter
- Added forgotten onChanged parameter on date input field
## 6.2.2 - February 6th 2024
- Updated the `flutter_input_library` from 2.6.0 to 3.0.0
## 1.0.2 - October 13th 2022
## 6.2.1 - January 12th 2024
- Pass on the `initialValue` property to FlutterFormMultiLine
- Added forgotten icon parameter on date input field and scrollpadding on text inputfield
## 2.0.0 - October 26th 2022
- Added the id of the input field on the input check widget.
- Ability to set the height of the carousel input field.
- InputController now contains the onSubmit callback.
## 2.0.1 - October 27th 2022
- onChange of switch input not firing fixed
## 4.0.2 - November 29th 2022
- Name change to flutter_form_wizard
## 4.0.3 - November 29th 2022
- Change from input to `flutter_input_library`
## 5.0.0 - November 29th 2022
- `flutter_input_library` now enforces 24h time requirements
## 5.0.4 - January 12th 2023
- Add FocusNode option to inputs
## 5.0.5 - January 12th 2023
- Expose translations
## 5.0.6 - January 12th 2023
- `flutter_input_library` datetime validator fix
## 5.0.7 - January 12th 2023
- `flutter_input_library` add styling text datetime fix
## 5.0.8 - January 18th 2023
- `flutter_input_library` add focusNode option to `FlutterFormInputMultiLine`
## 5.0.9 - January 18th 2023
- `flutter_input_library` add initial time picker parameter
## 6.0.0 - march 28th 2023
- Bump `flutter_input_library` to version 2.0.0
- Remove unnecessary `riverpod` dependency
## 6.1.0 - May 12th 2023
- Make compatible to flutter 3.10
## 6.1.1 - August 10th 2023
- Bump `flutter_input_library` to version 2.2.0
## 6.1.2 - August 11th 2023
- Bump `flutter_input_library` to version 2.2.1
## 6.1.3 - September 26th 2023
- Fix date format for datecontroller
## 6.1.4 - October 26th 2023
- Bump `flutter_input_library` to version 2.3.0
## 6.1.5 - October 26th 2023
- Bump `flutter_input_library` to version 2.4.0
## 6.1.6 - October 26th 2023
- Add enabled property to FlutterFormInputPlainText and FlutterFormInputDateTime
## 6.1.7 - November 1st 2023
- pass on the show icon property to flutter form input date time widget
## 6.2.0 - December 14th 2023
- Pass on the `textCapitalization` property to FlutterFormPlainText and FlutterFormMultiLine
## 6.1.8 - December 6th 2023
- Pass on the style property to the FlutterFormPlainText input widget
- Bump `flutter_input_library` to version 2.5.0
## 6.2.0 - December 14th 2023
- Pass on the `textCapitalization` property to FlutterFormPlainText and FlutterFormMultiLine
## 6.1.7 - November 1st 2023
- Pass on the show icon property to flutter form input date time widget
## 6.2.1 - January 12th 2024
- Pass on the `initialValue` property to FlutterFormMultiLine
## 6.1.6 - October 26th 2023
- Add enabled property to FlutterFormInputPlainText and FlutterFormInputDateTime
## 6.2.2 - February 6th 2024
- Updated the `flutter_input_library` from 2.6.0 to 3.0.0
## 6.1.5 - October 26th 2023
- Bump `flutter_input_library` to version 2.4.0
## 6.2.3 - February 7th 2024
- Added CI and linter
## 6.1.4 - October 26th 2023
- Bump `flutter_input_library` to version 2.3.0
## 6.2.4 - February 9th 2024
- Updated the `flutter_input_library` from 3.0.0 to 3.0.1
## 6.1.3 - September 26th 2023
- Fix date format for date controller
## 6.2.5 - February 15th 2024
- Updated the `flutter_input_library` from 3.0.1 to 3.1.0
## 6.1.2 - August 11th 2023
- Bump `flutter_input_library` to version 2.2.1
## 6.3.0 - February 21th 2024
- Updated the `flutter_input_library` from 3.1.0 to 3.2.1
- Added `FlutterFormInputPhone` for phone number with dial code selection.
- Added `InputDecoration` parameter to the following inputfields: `FlutterFormInputEmail` and `FlutterFormInputPassword`
## 6.1.1 - August 10th 2023
- Bump `flutter_input_library` to version 2.2.0
## 6.3.1 - February 29th 2024
- Removed `TranslationService` and add `validationMessage` property to fields with validation.
- Added a way to override a input field validator.
- Exposed all properties for `FlutterFormInputDateTime` provided by `flutter_input_library`.
## 6.1.0 - May 12th 2023
- Make compatible with Flutter 3.10
## 6.0.0 - March 28th 2023
- Bump `flutter_input_library` to version 2.0.0
- Remove unnecessary `riverpod` dependency
## 5.0.9 - January 18th 2023
- `flutter_input_library` add initial time picker parameter
## 5.0.8 - January 18th 2023
- `flutter_input_library` add focusNode option to `FlutterFormInputMultiLine`
## 5.0.7 - January 12th 2023
- `flutter_input_library` add styling text datetime fix
## 5.0.6 - January 12th 2023
- `flutter_input_library` datetime validator fix
## 5.0.5 - January 12th 2023
- Expose translations
## 5.0.4 - January 12th 2023
- Add FocusNode option to inputs
## 5.0.0 - November 29th 2022
- `flutter_input_library` now enforces 24h time requirements
## 4.0.3 - November 29th 2022
- Change from input to `flutter_input_library`
## 4.0.2 - November 29th 2022
- Name change to flutter_form_wizard
## 2.0.1 - October 27th 2022
- onChange of switch input not firing fixed
## 2.0.0 - October 26th 2022
- Added the id of the input field on the input check widget.
- Ability to set the height of the carousel input field.
- InputController now contains the onSubmit callback.
## 1.0.2 - October 13th 2022
- Added forgotten icon parameter on date input field and scroll padding on text input field
## 1.0.1 - October 13th 2022
- Added forgotten onChanged parameter on date input field
## 1.0.0 - October 13th 2022
- Fix: Proper use of generics
- Input controllers now have an onChange.
- Added switch input field
## 0.2.0 - October 13th 2022
- Added date input widget
## 0.1.0 - October 12th 2022
- Added a multi-line plain text input widget
- Ability to set the scroll direction of the page view
- Ability to set the scroll physics of the pages' scroll view.
## 0.0.2 - October 10th 2022
- Initial release

View file

@ -1,45 +0,0 @@
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled.
version:
revision: 4f9d92fbbdf072a70a70d2179a9f87392b94104c
channel: stable
project_type: app
# Tracks metadata for the flutter migrate command
migration:
platforms:
- platform: root
create_revision: 4f9d92fbbdf072a70a70d2179a9f87392b94104c
base_revision: 4f9d92fbbdf072a70a70d2179a9f87392b94104c
- platform: android
create_revision: 4f9d92fbbdf072a70a70d2179a9f87392b94104c
base_revision: 4f9d92fbbdf072a70a70d2179a9f87392b94104c
- platform: ios
create_revision: 4f9d92fbbdf072a70a70d2179a9f87392b94104c
base_revision: 4f9d92fbbdf072a70a70d2179a9f87392b94104c
- platform: linux
create_revision: 4f9d92fbbdf072a70a70d2179a9f87392b94104c
base_revision: 4f9d92fbbdf072a70a70d2179a9f87392b94104c
- platform: macos
create_revision: 4f9d92fbbdf072a70a70d2179a9f87392b94104c
base_revision: 4f9d92fbbdf072a70a70d2179a9f87392b94104c
- platform: web
create_revision: 4f9d92fbbdf072a70a70d2179a9f87392b94104c
base_revision: 4f9d92fbbdf072a70a70d2179a9f87392b94104c
- platform: windows
create_revision: 4f9d92fbbdf072a70a70d2179a9f87392b94104c
base_revision: 4f9d92fbbdf072a70a70d2179a9f87392b94104c
# User provided section
# List of Local paths (relative to this file) that should be
# ignored by the migrate tool.
#
# Files that are not part of the templates will be ignored by default.
unmanaged_files:
- 'lib/main.dart'
- 'ios/Runner.xcodeproj/project.pbxproj'

View file

@ -45,10 +45,10 @@ packages:
dependency: "direct main"
description:
name: cupertino_icons
sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be
sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6
url: "https://pub.dev"
source: hosted
version: "1.0.5"
version: "1.0.8"
fake_async:
dependency: transitive
description:
@ -68,22 +68,24 @@ packages:
path: ".."
relative: true
source: path
version: "6.2.5"
version: "6.5.0"
flutter_input_library:
dependency: transitive
description:
path: "../../flutter_input_library"
relative: true
source: path
version: "3.2.1"
path: "."
ref: "3.4.0"
resolved-ref: cdc06bbb7933ba7ac2835e29d2c8fabf69e5f5a6
url: "https://github.com/Iconica-Development/flutter_input_library"
source: git
version: "3.4.0"
flutter_lints:
dependency: "direct dev"
description:
name: flutter_lints
sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c
sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04
url: "https://pub.dev"
source: hosted
version: "2.0.1"
version: "2.0.3"
flutter_localizations:
dependency: transitive
description: flutter
@ -93,10 +95,10 @@ packages:
dependency: "direct main"
description:
name: flutter_riverpod
sha256: "371f6e8acb69dbe8aa3e0a50c8a65f8a9352b599134d585cc4923261cb5ae4d6"
sha256: "0f1974eff5bbe774bf1d870e406fc6f29e3d6f1c46bd9c58e7172ff68a785d7d"
url: "https://pub.dev"
source: hosted
version: "2.1.1"
version: "2.5.1"
flutter_test:
dependency: "direct dev"
description: flutter
@ -106,58 +108,82 @@ packages:
dependency: "direct main"
description:
name: intl
sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d"
sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf
url: "https://pub.dev"
source: hosted
version: "0.18.1"
version: "0.19.0"
leak_tracker:
dependency: transitive
description:
name: leak_tracker
sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
url: "https://pub.dev"
source: hosted
version: "10.0.5"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
url: "https://pub.dev"
source: hosted
version: "3.0.5"
leak_tracker_testing:
dependency: transitive
description:
name: leak_tracker_testing
sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
url: "https://pub.dev"
source: hosted
version: "3.0.1"
lints:
dependency: transitive
description:
name: lints
sha256: "5cfd6509652ff5e7fe149b6df4859e687fca9048437857cb2e65c8d780f396e3"
sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452"
url: "https://pub.dev"
source: hosted
version: "2.0.0"
version: "2.1.1"
matcher:
dependency: transitive
description:
name: matcher
sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
url: "https://pub.dev"
source: hosted
version: "0.12.16"
version: "0.12.16+1"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41"
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
url: "https://pub.dev"
source: hosted
version: "0.5.0"
version: "0.11.1"
meta:
dependency: transitive
description:
name: meta
sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
url: "https://pub.dev"
source: hosted
version: "1.10.0"
version: "1.15.0"
path:
dependency: transitive
description:
name: path
sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
url: "https://pub.dev"
source: hosted
version: "1.8.3"
version: "1.9.0"
riverpod:
dependency: transitive
description:
name: riverpod
sha256: "899cd0999b2f3b798349d9b5639cfea81d406c011bd914097145ff92e91b29f9"
sha256: f21b32ffd26a36555e501b04f4a5dca43ed59e16343f1a30c13632b2351dfa4d
url: "https://pub.dev"
source: hosted
version: "2.1.1"
version: "2.5.1"
sky_engine:
dependency: transitive
description: flutter
@ -183,10 +209,10 @@ packages:
dependency: transitive
description:
name: state_notifier
sha256: "8fe42610f179b843b12371e40db58c9444f8757f8b69d181c97e50787caed289"
sha256: b8677376aa54f2d7c58280d5a007f9e8774f1968d1fb1c096adcb4792fba29bb
url: "https://pub.dev"
source: hosted
version: "0.7.2+1"
version: "1.0.0"
stream_channel:
dependency: transitive
description:
@ -215,10 +241,10 @@ packages:
dependency: transitive
description:
name: test_api
sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b"
sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
url: "https://pub.dev"
source: hosted
version: "0.6.1"
version: "0.7.2"
vector_math:
dependency: transitive
description:
@ -227,14 +253,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.4"
web:
vm_service:
dependency: transitive
description:
name: web
sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152
name: vm_service
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
url: "https://pub.dev"
source: hosted
version: "0.3.0"
version: "14.2.5"
sdks:
dart: ">=3.2.0-194.0.dev <4.0.0"
flutter: ">=3.0.0"
dart: ">=3.3.0 <4.0.0"
flutter: ">=3.18.0-18.0.pre.54"

View file

@ -16,7 +16,7 @@ dependencies:
flutter_riverpod: ^2.1.1
flutter_form_wizard:
path: ../
intl: ^0.18.0
intl: any
dev_dependencies:
flutter_test:

View file

@ -487,7 +487,7 @@ class FlutterFormController extends ChangeNotifier {
Future<void> previousStep() async {
_currentStep -= 1;
_options.onBack?.call(_currentStep);
_checkingPages = false;
notifyListeners();

View file

@ -0,0 +1,164 @@
import 'package:flutter/material.dart';
import 'package:flutter_form_wizard/flutter_form.dart';
import 'package:flutter_input_library/flutter_input_library.dart' as input;
class FlutterFormInputDropdown extends FlutterFormInputWidget<Object> {
const FlutterFormInputDropdown({
required super.controller,
required this.validationMessage,
this.items,
this.selectedItemBuilder,
this.value,
this.hint,
this.disabledHint,
this.onChanged,
this.onTap,
this.elevation = 8,
this.style,
this.icon,
this.iconDisabledColor,
this.iconEnabledColor,
this.iconSize = 24.0,
this.isDense = false,
this.isExpanded = false,
this.itemHeight,
this.focusColor,
this.autofocus = false,
this.dropdownColor,
this.decoration,
this.onSaved,
this.validator,
this.autovalidateMode,
this.menuMaxHeight,
this.enableFeedback,
this.alignment = Alignment.centerLeft,
this.borderRadius,
this.padding,
super.key,
super.focusNode,
super.label,
});
final List<DropdownMenuItem<Object?>>? items;
final List<Widget> Function(BuildContext)? selectedItemBuilder;
final Object? value;
final Widget? hint;
final Widget? disabledHint;
final void Function(Object?)? onChanged;
final void Function()? onTap;
final int elevation;
final TextStyle? style;
final Widget? icon;
final Color? iconDisabledColor;
final Color? iconEnabledColor;
final double iconSize;
final bool isDense;
final bool isExpanded;
final double? itemHeight;
final Color? focusColor;
final bool autofocus;
final Color? dropdownColor;
final InputDecoration? decoration;
final void Function(Object?)? onSaved;
final String? Function(Object?)? validator;
final AutovalidateMode? autovalidateMode;
final double? menuMaxHeight;
final bool? enableFeedback;
final AlignmentGeometry alignment;
final BorderRadius? borderRadius;
final EdgeInsetsGeometry? padding;
final String validationMessage;
@override
Widget build(BuildContext context) {
super.registerController(context);
return input.FlutterFormInputDropdown(
items: items,
selectedItemBuilder: selectedItemBuilder,
value: value,
hint: hint,
disabledHint: disabledHint,
onChanged: controller.onChanged,
onTap: () => onTap?.call(),
elevation: elevation,
style: style,
icon: icon,
iconDisabledColor: iconDisabledColor,
iconEnabledColor: iconEnabledColor,
iconSize: iconSize,
isDense: isDense,
isExpanded: isExpanded,
itemHeight: itemHeight,
focusColor: focusColor,
focusNode: focusNode,
autofocus: autofocus,
dropdownColor: dropdownColor,
decoration: decoration,
onSaved: controller.onSaved,
validator: validator ??
(value) => controller.onValidate(
value,
validationMessage,
),
autovalidateMode: autovalidateMode,
menuMaxHeight: menuMaxHeight,
enableFeedback: enableFeedback,
alignment: alignment,
borderRadius: borderRadius,
padding: padding,
);
}
}
class FlutterFormInputDropdownController
implements FlutterFormInputController<Object> {
FlutterFormInputDropdownController({
required this.id,
this.mandatory = false,
this.value,
this.checkPageTitle,
this.checkPageDescription,
this.onChanged,
this.onSubmit,
});
@override
String? id;
@override
Object? value;
@override
bool mandatory;
@override
String Function(Object? value)? checkPageTitle;
@override
String Function(Object? value)? checkPageDescription;
@override
void Function(Object? value)? onChanged;
@override
void Function(Object? value)? onSubmit;
@override
void onSaved(Object? value) {
this.value = value;
}
@override
String? onValidate(
Object? value,
String validationMessage,
) {
if (mandatory) {
if (value == null) {
return validationMessage;
}
}
return null;
}
}

View file

@ -23,6 +23,7 @@ class FlutterFormInputEmail extends FlutterFormInputWidget<String> {
bool? enabled,
this.validator,
this.decoration,
this.style,
}) : super(
enabled: enabled ?? true,
);
@ -30,12 +31,14 @@ class FlutterFormInputEmail extends FlutterFormInputWidget<String> {
final InputDecoration? decoration;
final String validationMessage;
final String? Function(String?)? validator;
final TextStyle? style;
@override
Widget build(BuildContext context) {
super.registerController(context);
return input.FlutterFormInputPlainText(
style: style,
enabled: enabled,
initialValue: controller.value,
onSaved: (value) {

View file

@ -7,6 +7,7 @@ export 'package:flutter_input_library/flutter_input_library.dart'
export 'input_carousel/input_carousel.dart';
export 'input_date_picker/input_date_picker.dart';
export 'input_dropdown.dart';
export 'input_email.dart';
export 'input_number_picker/input_number_picker.dart';
export 'input_password/input_password.dart';
@ -14,3 +15,4 @@ export 'input_phone.dart';
export 'input_plain_text.dart';
export 'input_slider/input_slider.dart';
export 'input_switch/input_switch.dart';
export 'multiple_choice.dart';

View file

@ -0,0 +1,159 @@
import 'package:flutter/material.dart';
import 'package:flutter_form_wizard/flutter_form.dart';
class FlutterFormInputMultipleChoice extends FlutterFormInputWidget<String> {
/// Creates a [FlutterFormInputMultipleChoice].
///
/// The [controller], [options], [builder], [validationMessage] parameters
/// are required.
/// The [key], [focusNode], [label] are optional.
const FlutterFormInputMultipleChoice({
required super.controller,
required this.options,
required this.builder,
required this.validationMessage,
super.focusNode,
super.label,
super.key,
this.mainAxisExtent,
this.childAspectRatio = 1,
this.mainAxisSpacing = 0,
this.crossAxisSpacing = 0,
this.crossAxisCount = 3,
this.height,
this.shrinkwrap = true,
this.validator,
});
final List<String> options;
final double? mainAxisExtent;
final double childAspectRatio;
final double mainAxisSpacing;
final double crossAxisSpacing;
final int crossAxisCount;
final double? height;
final bool shrinkwrap;
final Widget Function(
BuildContext context,
int index,
ValueNotifier<int?> selectedIndex,
FlutterFormInputController controller,
List<String> options,
FormFieldState<String> state,
) builder;
final String? Function(String? value, String validationMessage)? validator;
final String validationMessage;
@override
Widget build(BuildContext context) {
super.registerController(context);
var selectedIndex = ValueNotifier<int?>(null);
return FormField<String>(
onSaved: controller.onSaved,
validator: (value) =>
validator?.call(value, validationMessage) ??
controller.onValidate(value, validationMessage),
builder: (state) => SizedBox(
height: height,
child: Column(
children: [
GridView.builder(
physics: const NeverScrollableScrollPhysics(),
itemCount: options.length,
shrinkWrap: shrinkwrap,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
mainAxisExtent: mainAxisExtent,
childAspectRatio: childAspectRatio,
mainAxisSpacing: mainAxisSpacing,
crossAxisSpacing: crossAxisSpacing,
crossAxisCount: crossAxisCount,
),
itemBuilder: (context, index) => ListenableBuilder(
listenable: selectedIndex,
builder: (context, widget) => builder.call(
context,
index,
selectedIndex,
controller,
options,
state,
),
),
),
if (state.hasError)
Text(
state.errorText!,
style: const TextStyle(
color: Color(0xFFAD3645),
fontSize: 14.0,
fontWeight: FontWeight.bold,
),
)
else
const SizedBox.shrink(),
],
),
),
);
}
}
class FlutterFormInputMultipleChoiceController
implements FlutterFormInputController<String> {
/// Creates a [FlutterFormInputMultipleChoiceController].
///
/// The [id] parameter specifies the unique identifier for the controller.
/// The [mandatory] parameter specifies whether the input is mandatory.
/// The [value], [checkPageTitle], [checkPageDescription], [onChanged],
/// and [onSubmit] parameters are optional.
FlutterFormInputMultipleChoiceController({
required this.id,
this.mandatory = false,
this.value,
this.checkPageTitle,
this.checkPageDescription,
this.onChanged,
this.onSubmit,
});
@override
String? id;
@override
String? value;
@override
bool mandatory;
@override
String Function(String? value)? checkPageTitle;
@override
String Function(String? value)? checkPageDescription;
@override
void Function(String? value)? onChanged;
@override
void Function(String? value)? onSubmit;
@override
void onSaved(String? value) {
this.value = value;
}
@override
String? onValidate(
String? value,
String validationMessage,
) {
if (mandatory) {
if (value == null || value.isEmpty) {
return validationMessage;
}
}
return null;
}
}

View file

@ -22,6 +22,7 @@ import 'package:flutter/material.dart';
///
/// [onFinished] and [onNext] are both callbacks which give the users results.
/// [onNext] is called when the user goes to the next page.
/// [onBack] is called when the user goes back a page.
/// [onFinished] is called when the form is finished. When checkpage is set
/// [onFinished] is called when the checkpage is finished.
///
@ -35,6 +36,7 @@ class FlutterFormOptions {
required this.pages,
required this.onFinished,
required this.onNext,
this.onBack,
this.checkPage,
this.nextButton,
this.backButton,
@ -49,6 +51,11 @@ class FlutterFormOptions {
backButton;
final void Function(Map<int, Map<String, dynamic>>) onFinished;
final void Function(int pageNumber, Map<String, dynamic>) onNext;
/// [onBack] is called when the user goes back a page. The [pageNumber] is the
/// page the user is going back to. Not the page that the user was on when the
/// user pressed the back button.
final void Function(int pageNumber)? onBack;
final Axis scrollDirection;
final ScrollPhysics? scrollPhysics;
}

View file

@ -1,12 +1,12 @@
name: flutter_form_wizard
description: A new Flutter package project.
version: 6.3.1
version: 6.6.0
homepage: https://github.com/Iconica-Development/flutter_form_wizard
publish_to: none
publish_to: https://forgejo.internal.iconica.nl/api/packages/internal/pub
environment:
sdk: ">=2.18.0 <3.0.0"
sdk: ">=3.0.0 <4.0.0"
flutter: ">=1.17.0"
dependencies:
@ -14,11 +14,10 @@ dependencies:
sdk: flutter
flutter_localizations:
sdk: flutter
intl: ^0.18.0
intl: ">=0.18.0 <1.0.0"
flutter_input_library:
git:
url: https://github.com/Iconica-Development/flutter_input_library
ref: 3.2.1
hosted: https://forgejo.internal.iconica.nl/api/packages/internal/pub
version: ^3.4.0
dev_dependencies:
flutter_test:
@ -27,5 +26,4 @@ dev_dependencies:
git:
url: https://github.com/Iconica-Development/flutter_iconica_analysis
ref: 6.0.0
flutter: