mirror of
https://github.com/Iconica-Development/flutter_form_wizard.git
synced 2025-05-19 19:03:47 +02:00
Made the example working again
This commit is contained in:
parent
2741be487c
commit
63431dfad6
6 changed files with 185 additions and 137 deletions
|
@ -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(
|
||||
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: pageNumber,
|
||||
amountOfPages: amountOfPages,
|
||||
pageNumber: 1,
|
||||
amountOfPages: 3,
|
||||
shellFormWidgets: [
|
||||
ShellFormInputNumberPicker(
|
||||
minValue: 12,
|
||||
maxValue: 120,
|
||||
controller: ShellFormInputNumberPickerController(
|
||||
id: "age",
|
||||
checkPageTitle: (dynamic amount) {
|
||||
return "Age: $amount years";
|
||||
},
|
||||
),
|
||||
controller: widget.inputController,
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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())
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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(
|
||||
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: pageNumber,
|
||||
amountOfPages: amountOfPages,
|
||||
pageNumber: 3,
|
||||
amountOfPages: 3,
|
||||
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";
|
||||
},
|
||||
controller: widget.firstNameController,
|
||||
),
|
||||
),
|
||||
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";
|
||||
// },
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -430,6 +430,8 @@ class ShellFormController extends ChangeNotifier {
|
|||
_options.onFinished(getAllResults());
|
||||
} else {
|
||||
if (validateAndSaveCurrentStep()) {
|
||||
FocusManager.instance.primaryFocus?.unfocus();
|
||||
|
||||
_options.onNext(
|
||||
_currentStep, _formPageControllers[_currentStep].getAllValues());
|
||||
|
||||
|
|
|
@ -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,
|
||||
);
|
||||
|
|
Loading…
Reference in a new issue