diff --git a/CHANGELOG.md b/CHANGELOG.md index d7a448f..70a6ea9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ ## 0.0.1 - September 29th 2022 - Initial release + +## 0.0.2 - October 12th 2022 + +- 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. diff --git a/README.md b/README.md index 325c1fa..0c102f1 100644 --- a/README.md +++ b/README.md @@ -24,13 +24,15 @@ Flutter Form has two paramaters: options and formController. Each of these param Options: -| Parameter | Explaination | -| ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| checkPage | If this is set the form will feature a checkpage at the end so the end user can verify and alter his answers. | -| nextButton | The button which is put in the stack of the Form. An onTap has to be implemented and should call to the FormController. Standard call is autoNextStep(). | -| backButton | Same as the nextButton. A widget that is put in the stack of the Form. An onTap has to be implemented and should call to the FormController. Standard call is previousStep(). | -| onFinised | The callback that will be called when the last page is finished. If checkPage is enabled this will call after the checkPage is passed. | -| onNext | The callback that is called when the user finishes a page. PageNumber is also provided. | +| Parameter | Explaination | +| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| checkPage | If this is set the form will feature a checkpage at the end so the end user can verify and alter his answers. | +| nextButton | The button which is put in the stack of the Form. An onTap has to be implemented and should call to the FormController. Standard call is autoNextStep(). | +| backButton | Same as the nextButton. A widget that is put in the stack of the Form. An onTap has to be implemented and should call to the FormController. Standard call is previousStep(). | +| onFinised | The callback that will be called when the last page is finished. If checkPage is enabled this will call after the checkPage is passed. | +| onNext | The callback that is called when the user finishes a page. PageNumber is also provided. | +| scrollDirection | The abilty to set the scroll direction of the forms .pageview | +| scrollPhysics | The ability to set the scroll physics of scroll views in each form page. | FormController: diff --git a/lib/src/form.dart b/lib/src/form.dart index bcefc97..faceaa6 100644 --- a/lib/src/form.dart +++ b/lib/src/form.dart @@ -229,6 +229,7 @@ class _FlutterFormState extends ConsumerState { return Stack( children: [ PageView( + scrollDirection: _formController._options.scrollDirection, controller: _formController.getPageController(), physics: const NeverScrollableScrollPhysics(), children: [ @@ -238,6 +239,8 @@ class _FlutterFormState extends ConsumerState { child: fs.FormState( formController: _formController.getFormPageControllers()[i], child: CustomScrollView( + physics: _formController._options.scrollPhysics ?? + const ClampingScrollPhysics(), slivers: [ SliverFillRemaining( hasScrollBody: false, @@ -255,6 +258,8 @@ class _FlutterFormState extends ConsumerState { widget.options.checkPage!.title!, Expanded( child: CustomScrollView( + physics: _formController._options.scrollPhysics ?? + const ClampingScrollPhysics(), slivers: [ SliverFillRemaining( hasScrollBody: false, @@ -504,6 +509,9 @@ class FlutterFormController extends ChangeNotifier { } Future nextStep() async { + _options.onNext( + _currentStep, _formPageControllers[_currentStep].getAllValues()); + _currentStep += 1; if (_currentStep >= _options.pages.length && _options.checkPage != null) { diff --git a/lib/src/widgets/input/input_types/input_plain_text.dart b/lib/src/widgets/input/input_types/input_plain_text.dart index a8d44f3..f9d57bd 100644 --- a/lib/src/widgets/input/input_types/input_plain_text.dart +++ b/lib/src/widgets/input/input_types/input_plain_text.dart @@ -12,8 +12,19 @@ class FlutterFormInputPlainText extends FlutterFormInputWidget { Key? key, required FlutterFormInputController controller, Widget? label, + this.decoration, + this.textAlignVertical, + this.expands = false, + this.maxLines, + this.maxLength, }) : super(key: key, controller: controller, label: label); + final InputDecoration? decoration; + final TextAlignVertical? textAlignVertical; + final bool expands; + final int? maxLines; + final int? maxLength; + @override Widget build(BuildContext context, WidgetRef ref) { String Function(String, {List? params}) _ = @@ -21,54 +32,73 @@ class FlutterFormInputPlainText extends FlutterFormInputWidget { super.registerController(context); + InputDecoration inputDecoration = decoration ?? + InputDecoration( + label: label ?? const Text("Plain text"), + ); + return TextFormField( initialValue: controller.value, onSaved: (value) => controller.onSaved(value), validator: (value) => controller.onValidate(value, _), - decoration: InputDecoration( - label: label ?? const Text("Plain text"), - ), + decoration: inputDecoration, + textAlignVertical: textAlignVertical, + expands: expands, + maxLines: maxLines, + maxLength: maxLength, ); } } -/// Input for an plain text with extra styling used in a [FlutterForm]. +/// Input for a multi line plain text field [FlutterForm]. /// /// Standard controller is [FlutterFormInputPlainTextController]. -class FlutterFormInputPlainTextWhiteWithBorder extends FlutterFormInputWidget { - const FlutterFormInputPlainTextWhiteWithBorder({ +/// +/// Hint can be set to set a hint inside the field. +/// +/// MaxCharacters can be set to set a maximum amount of characters. +class FlutterFormInputMultiLine extends StatelessWidget { + const FlutterFormInputMultiLine({ Key? key, - required FlutterFormInputController controller, - Widget? label, + required this.controller, + this.label, this.hint, - }) : super(key: key, controller: controller, label: label); + this.maxCharacters, + }) : super(key: key); + + final FlutterFormInputController controller; + final Widget? label; final String? hint; + final int? maxCharacters; @override - Widget build(BuildContext context, WidgetRef ref) { - String Function(String, {List? params}) _ = - getTranslator(context, ref); - - super.registerController(context); - - return TextFormField( - initialValue: controller.value, - onSaved: (value) => controller.onSaved(value), - validator: (value) => controller.onValidate(value, _), - decoration: InputDecoration( - hintText: hint, - floatingLabelBehavior: FloatingLabelBehavior.never, - isDense: true, - border: const OutlineInputBorder( - borderSide: BorderSide(color: Color(0xFF979797)), + Widget build(BuildContext context) { + return Column( + children: [ + Expanded( + child: FlutterFormInputPlainText( + label: label, + controller: controller, + textAlignVertical: TextAlignVertical.top, + expands: true, + maxLines: null, + maxLength: maxCharacters, + decoration: InputDecoration( + hintText: hint, + floatingLabelBehavior: FloatingLabelBehavior.never, + isDense: true, + border: const OutlineInputBorder( + borderSide: BorderSide(color: Color(0xFF979797)), + ), + focusedBorder: const OutlineInputBorder( + borderSide: BorderSide(color: Color(0xFF979797)), + ), + filled: true, + ), + ), ), - focusedBorder: const OutlineInputBorder( - borderSide: BorderSide(color: Color(0xFF979797)), - ), - fillColor: Colors.white, - filled: true, - ), + ], ); } } diff --git a/lib/utils/form.dart b/lib/utils/form.dart index 01dc684..f186237 100644 --- a/lib/utils/form.dart +++ b/lib/utils/form.dart @@ -14,6 +14,10 @@ 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. /// [onFinished] is called when the form is finished. When checkpage is set [onFinished] is called when the checkpage is finished. +/// +/// [scrollDirection] can be set to change the Axis on which the pageview slides. Defaults to horizontal. +/// +/// [scrollPhysics] can be set to set the scroll phyisics of the scroll views in each page. Default to [ClampingScrollPhysics]. class FlutterFormOptions { final List pages; @@ -23,6 +27,8 @@ class FlutterFormOptions { backButton; final void Function(Map>) onFinished; final void Function(int pageNumber, Map) onNext; + final Axis scrollDirection; + final ScrollPhysics? scrollPhysics; const FlutterFormOptions({ required this.pages, @@ -31,6 +37,8 @@ class FlutterFormOptions { this.backButton, required this.onFinished, required this.onNext, + this.scrollDirection = Axis.horizontal, + this.scrollPhysics, }); }