flow_builder 0.0.1-dev.3
flow_builder: ^0.0.1-dev.3 copied to clipboard
Flutter Flows made easy! A Flutter package which simplifies flows with a flexible, declarative API.
flow_builder #
Flutter Flows made easy!
Usage #
Define a Flow State #
class Profile extends Equatable {
const Profile({this.name, this.age, this.weight});
final String name;
final int age;
final int weight;
Profile copyWith({String name, int age, int weight}) {
return Profile(
name: name ?? this.name,
age: age ?? this.age,
weight: weight ?? this.weight,
);
}
@override
List<Object> get props => [name, age, weight];
}
Define a Flow #
FlowBuilder<Profile>(
state: const Profile(),
builder: (context, profile) {
return [
MaterialPage(child: NameForm()),
if (profile.name != null) MaterialPage(child: AgeForm()),
if (profile.age != null) MaterialPage(child: WeightForm()),
];
},
);
Update the Flow State #
class NameForm extends StatefulWidget {
@override
_NameFormState createState() => _NameFormState();
}
class _NameFormState extends State<NameForm> {
var _name = '';
void _continuePressed() {
context.flow<Profile>().update((profile) => profile.copyWith(name: _name));
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Name')),
body: Center(
child: Column(
children: <Widget>[
TextField(
onChanged: (value) => setState(() => _name = value),
decoration: InputDecoration(
labelText: 'Name',
hintText: 'John Doe',
),
),
RaisedButton(
child: const Text('Continue'),
onPressed: _name.isNotEmpty ? _continuePressed : null,
)
],
),
),
);
}
}
Complete the Flow #
class WeightForm extends StatefulWidget {
@override
_WeightFormState createState() => _WeightFormState();
}
class _WeightFormState extends State<WeightForm> {
int _weight;
void _continuePressed() {
context
.flow<Profile>()
.complete((profile) => profile.copyWith(weight: _weight));
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Weight')),
body: Center(
child: Column(
children: <Widget>[
TextField(
onChanged: (value) => setState(() => _weight = int.parse(value)),
decoration: InputDecoration(
labelText: 'Weight (lbs)',
hintText: '170',
),
keyboardType: TextInputType.number,
),
RaisedButton(
child: const Text('Continue'),
onPressed: _weight != null ? _continuePressed : null,
)
],
),
),
);
}
}