Made the example working again

This commit is contained in:
Jacques Doeleman 2022-09-27 15:30:20 +02:00
parent 2741be487c
commit 63431dfad6
6 changed files with 185 additions and 137 deletions

View file

@ -1,35 +1,38 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_form/flutter_form.dart'; import 'package:flutter_form/flutter_form.dart';
import 'package:flutter_form/next_shell/form.dart';
import 'package:form_example/template_page.dart'; import 'package:form_example/template_page.dart';
class AgePage { class AgePage extends StatefulWidget {
ShellFormPage returnPage( const AgePage({
Size size, required this.inputController,
double fontSize, super.key,
int pageNumber, });
int amountOfPages,
) { final ShellFormInputNumberPickerController inputController;
return ShellFormPage(
child: TemplatePage( @override
State<AgePage> createState() => _AgePageState();
}
class _AgePageState extends State<AgePage> {
@override
Widget build(BuildContext context) {
var size = MediaQuery.of(context).size;
var fontSize = size.height / 40;
return TemplatePage(
size: size, size: size,
fontSize: fontSize, fontSize: fontSize,
title: "What is your age?", title: "What is your age?",
pageNumber: pageNumber, pageNumber: 1,
amountOfPages: amountOfPages, amountOfPages: 3,
shellFormWidgets: [ shellFormWidgets: [
ShellFormInputNumberPicker( ShellFormInputNumberPicker(
minValue: 12, minValue: 12,
maxValue: 120, maxValue: 120,
controller: ShellFormInputNumberPickerController( controller: widget.inputController,
id: "age",
checkPageTitle: (dynamic amount) {
return "Age: $amount years";
},
),
), ),
], ],
),
); );
} }
} }

View file

@ -1,26 +1,42 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_form/flutter_form.dart'; import 'package:flutter_form/flutter_form.dart';
import 'package:flutter_form/next_shell/form.dart';
import 'package:form_example/template_page.dart'; import 'package:form_example/template_page.dart';
class CarouselPage { class CarouselPage extends StatefulWidget {
final List<Map<String, dynamic>> cars = [ const CarouselPage({
{ required this.inputController,
"title": "Mercedes", required this.cars,
"description": "Mercedes is a car", super.key,
}, });
{
"title": "BMW", final ShellFormInputCarouselController inputController;
"description": "BMW is a car", final List<Map<String, dynamic>> cars;
},
{ @override
"title": "Mazda", State<CarouselPage> createState() => _CarouselPageState();
'description': "Mazda is a car", }
},
]; class _CarouselPageState extends State<CarouselPage> {
@override
Widget build(BuildContext context) {
var size = MediaQuery.of(context).size;
var fontSize = size.height / 40;
return TemplatePage(
size: size,
fontSize: fontSize,
title: "What's your favorite car?",
pageNumber: 2,
amountOfPages: 3,
shellFormWidgets: [
ShellFormInputCarousel(
controller: widget.inputController, items: getCars())
],
);
}
List<Widget> getCars() { List<Widget> getCars() {
return cars.map((car) { return widget.cars.map((car) {
return Builder( return Builder(
builder: (BuildContext context) { builder: (BuildContext context) {
return Column( return Column(
@ -61,34 +77,4 @@ class CarouselPage {
); );
}).toList(); }).toList();
} }
ShellFormPage returnPage(
Size size,
double fontSize,
int pageNumber,
int amountOfPages,
) {
return ShellFormPage(
child: TemplatePage(
size: size,
fontSize: fontSize,
title: "What's your favorite car?",
pageNumber: pageNumber,
amountOfPages: amountOfPages,
shellFormWidgets: [
ShellFormInputCarousel(
controller: ShellFormInputCarouselController(
id: 'carCarousel',
checkPageTitle: (dynamic index) {
return cars[index]["title"];
},
checkPageDescription: (dynamic index) {
return cars[index]["description"];
},
),
items: getCars())
],
),
);
}
} }

View file

@ -1,64 +1,49 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_form/flutter_form.dart'; import 'package:flutter_form/flutter_form.dart';
import 'package:flutter_form/next_shell/form.dart';
import 'package:form_example/template_page.dart'; import 'package:form_example/template_page.dart';
class NamePage { class NamePage extends StatefulWidget {
ShellFormPage returnPage( const NamePage({
Size size, required this.firstNameController,
double fontSize, required this.lastNameController,
int pageNumber, super.key,
int amountOfPages, });
) {
return ShellFormPage( final ShellFormInputPlainTextController firstNameController;
child: TemplatePage( final ShellFormInputPlainTextController lastNameController;
@override
State<NamePage> createState() => _NamePageState();
}
class _NamePageState extends State<NamePage> {
@override
Widget build(BuildContext context) {
var size = MediaQuery.of(context).size;
var fontSize = size.height / 40;
return TemplatePage(
size: size, size: size,
fontSize: fontSize, fontSize: fontSize,
pageNumber: pageNumber, pageNumber: 3,
amountOfPages: amountOfPages, amountOfPages: 3,
title: "Please enter your name", title: "Please enter your name",
shellFormWidgets: [ shellFormWidgets: [
// Padding(
// padding: const EdgeInsets.fromLTRB(40, 0, 40, 40),
// child: ShellFormInputPlainText(
// label: const Text("Name"),
// controller: ShellFormInputPlainTextController(
// mandatory: true,
// id: "name",
// checkPageTitle: (dynamic name) {
// return "Name: $name";
// },
// ),
// ),
// ),
Padding( Padding(
padding: const EdgeInsets.fromLTRB(40, 0, 40, 40), padding: const EdgeInsets.fromLTRB(40, 0, 40, 40),
child: ShellFormInputPlainText( child: ShellFormInputPlainText(
label: const Text("First Name"), label: const Text("First Name"),
controller: ShellFormInputPlainTextController( controller: widget.firstNameController,
mandatory: true,
id: "firstName",
checkPageTitle: (dynamic firstName) {
return "First Name: $firstName";
},
), ),
), ),
Padding(
padding: const EdgeInsets.fromLTRB(40, 0, 40, 0),
child: ShellFormInputPlainText(
label: const Text("Last Name"),
controller: widget.lastNameController,
),
), ),
// Padding(
// padding: const EdgeInsets.fromLTRB(40, 0, 40, 0),
// child: ShellFormInputPlainText(
// label: const Text("Last Name"),
// controller: ShellFormInputPlainTextController(
// mandatory: true,
// id: "lastName",
// checkPageTitle: (dynamic lastName) {
// return "Last Name: $lastName";
// },
// ),
// ),
// ),
], ],
),
); );
} }
} }

View file

@ -19,6 +19,62 @@ class _FormExampleState extends ConsumerState<FormExample> {
final String checkPageText = "All entered info: "; final String checkPageText = "All entered info: ";
final ageInputController = ShellFormInputNumberPickerController(
id: "age",
checkPageTitle: (dynamic amount) {
return "Age: $amount years";
},
);
late final ShellFormInputCarouselController carouselInputController;
final List<Map<String, dynamic>> cars = [
{
"title": "Mercedes",
"description": "Mercedes is a car",
},
{
"title": "BMW",
"description": "BMW is a car",
},
{
"title": "Mazda",
'description': "Mazda is a car",
},
];
ShellFormInputPlainTextController firstNameController =
ShellFormInputPlainTextController(
mandatory: true,
id: "firstName",
checkPageTitle: (dynamic firstName) {
return "First Name: $firstName";
},
);
ShellFormInputPlainTextController lastNameController =
ShellFormInputPlainTextController(
mandatory: true,
id: "lastName",
checkPageTitle: (dynamic lastName) {
return "Last Name: $lastName";
},
);
@override
void initState() {
super.initState();
carouselInputController = ShellFormInputCarouselController(
id: 'carCarousel',
checkPageTitle: (dynamic index) {
return cars[index]["title"];
},
checkPageDescription: (dynamic index) {
return cars[index]["description"];
},
);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var size = MediaQuery.of(context).size; var size = MediaQuery.of(context).size;
@ -60,8 +116,8 @@ class _FormExampleState extends ConsumerState<FormExample> {
color: Colors.white, color: Colors.white,
), ),
), ),
onPressed: () { onPressed: () async {
formController.autoNextStep(); await formController.autoNextStep();
}, },
child: Text(checkingPages ? "Save" : "Next Page"), child: Text(checkingPages ? "Save" : "Next Page"),
), ),
@ -99,9 +155,23 @@ class _FormExampleState extends ConsumerState<FormExample> {
return Container(); return Container();
}, },
pages: [ pages: [
AgePage().returnPage(size, fontSize, 1, 3), ShellFormPage(
// NamePage().returnPage(size, fontSize, 2, 3), child: AgePage(
CarouselPage().returnPage(size, fontSize, 3, 3), inputController: ageInputController,
),
),
ShellFormPage(
child: CarouselPage(
inputController: carouselInputController,
cars: cars,
),
),
ShellFormPage(
child: NamePage(
firstNameController: firstNameController,
lastNameController: lastNameController,
),
),
], ],
checkPage: CheckPageExample() checkPage: CheckPageExample()
.showCheckpage(context, size, fontSize, checkPageText), .showCheckpage(context, size, fontSize, checkPageText),

View file

@ -430,6 +430,8 @@ class ShellFormController extends ChangeNotifier {
_options.onFinished(getAllResults()); _options.onFinished(getAllResults());
} else { } else {
if (validateAndSaveCurrentStep()) { if (validateAndSaveCurrentStep()) {
FocusManager.instance.primaryFocus?.unfocus();
_options.onNext( _options.onNext(
_currentStep, _formPageControllers[_currentStep].getAllValues()); _currentStep, _formPageControllers[_currentStep].getAllValues());

View file

@ -28,7 +28,9 @@ class ShellFormInputNumberPicker extends ShellFormInputWidget {
return NumberPickerFormField( return NumberPickerFormField(
minValue: minValue, minValue: minValue,
maxValue: maxValue, maxValue: maxValue,
onSaved: (value) => controller.onSaved(value), onSaved: (value) {
controller.onSaved(value);
},
validator: (value) => controller.onValidate(value, _), validator: (value) => controller.onValidate(value, _),
initialValue: controller.value ?? minValue, initialValue: controller.value ?? minValue,
); );