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_form/flutter_form.dart';
import 'package:flutter_form/next_shell/form.dart';
import 'package:form_example/template_page.dart';
class AgePage {
ShellFormPage returnPage(
Size size,
double fontSize,
int pageNumber,
int amountOfPages,
) {
return ShellFormPage(
child: TemplatePage(
size: size,
fontSize: fontSize,
title: "What is your age?",
pageNumber: pageNumber,
amountOfPages: amountOfPages,
shellFormWidgets: [
ShellFormInputNumberPicker(
minValue: 12,
maxValue: 120,
controller: ShellFormInputNumberPickerController(
id: "age",
checkPageTitle: (dynamic amount) {
return "Age: $amount years";
},
),
),
],
),
class AgePage extends StatefulWidget {
const AgePage({
required this.inputController,
super.key,
});
final ShellFormInputNumberPickerController inputController;
@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,
fontSize: fontSize,
title: "What is your age?",
pageNumber: 1,
amountOfPages: 3,
shellFormWidgets: [
ShellFormInputNumberPicker(
minValue: 12,
maxValue: 120,
controller: widget.inputController,
),
],
);
}
}

View file

@ -1,26 +1,42 @@
import 'package:flutter/material.dart';
import 'package:flutter_form/flutter_form.dart';
import 'package:flutter_form/next_shell/form.dart';
import 'package:form_example/template_page.dart';
class CarouselPage {
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",
},
];
class CarouselPage extends StatefulWidget {
const CarouselPage({
required this.inputController,
required this.cars,
super.key,
});
final ShellFormInputCarouselController inputController;
final List<Map<String, dynamic>> cars;
@override
State<CarouselPage> createState() => _CarouselPageState();
}
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() {
return cars.map((car) {
return widget.cars.map((car) {
return Builder(
builder: (BuildContext context) {
return Column(
@ -61,34 +77,4 @@ class CarouselPage {
);
}).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_form/flutter_form.dart';
import 'package:flutter_form/next_shell/form.dart';
import 'package:form_example/template_page.dart';
class NamePage {
ShellFormPage returnPage(
Size size,
double fontSize,
int pageNumber,
int amountOfPages,
) {
return ShellFormPage(
child: TemplatePage(
size: size,
fontSize: fontSize,
pageNumber: pageNumber,
amountOfPages: amountOfPages,
title: "Please enter your name",
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: const EdgeInsets.fromLTRB(40, 0, 40, 40),
child: ShellFormInputPlainText(
label: const Text("First Name"),
controller: ShellFormInputPlainTextController(
mandatory: true,
id: "firstName",
checkPageTitle: (dynamic firstName) {
return "First Name: $firstName";
},
),
),
class NamePage extends StatefulWidget {
const NamePage({
required this.firstNameController,
required this.lastNameController,
super.key,
});
final ShellFormInputPlainTextController firstNameController;
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,
fontSize: fontSize,
pageNumber: 3,
amountOfPages: 3,
title: "Please enter your name",
shellFormWidgets: [
Padding(
padding: const EdgeInsets.fromLTRB(40, 0, 40, 40),
child: ShellFormInputPlainText(
label: const Text("First Name"),
controller: widget.firstNameController,
),
// 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";
// },
// ),
// ),
// ),
],
),
),
Padding(
padding: const EdgeInsets.fromLTRB(40, 0, 40, 0),
child: ShellFormInputPlainText(
label: const Text("Last Name"),
controller: widget.lastNameController,
),
),
],
);
}
}

View file

@ -19,6 +19,62 @@ class _FormExampleState extends ConsumerState<FormExample> {
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
Widget build(BuildContext context) {
var size = MediaQuery.of(context).size;
@ -60,8 +116,8 @@ class _FormExampleState extends ConsumerState<FormExample> {
color: Colors.white,
),
),
onPressed: () {
formController.autoNextStep();
onPressed: () async {
await formController.autoNextStep();
},
child: Text(checkingPages ? "Save" : "Next Page"),
),
@ -99,9 +155,23 @@ class _FormExampleState extends ConsumerState<FormExample> {
return Container();
},
pages: [
AgePage().returnPage(size, fontSize, 1, 3),
// NamePage().returnPage(size, fontSize, 2, 3),
CarouselPage().returnPage(size, fontSize, 3, 3),
ShellFormPage(
child: AgePage(
inputController: ageInputController,
),
),
ShellFormPage(
child: CarouselPage(
inputController: carouselInputController,
cars: cars,
),
),
ShellFormPage(
child: NamePage(
firstNameController: firstNameController,
lastNameController: lastNameController,
),
),
],
checkPage: CheckPageExample()
.showCheckpage(context, size, fontSize, checkPageText),

View file

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

View file

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