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/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";
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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())
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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";
|
|
||||||
// },
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
],
|
],
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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());
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in a new issue