Skip to content

Commit df83b58

Browse files
committed
Finishing example for multiple and single bloc
1 parent 014bdf3 commit df83b58

7 files changed

Lines changed: 560 additions & 138 deletions

File tree

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import 'package:flutter_bloc/flutter_bloc.dart';
2+
import 'package:flutter_multiple_bloc/api/thecocktaildb/api_the_cocktail_db_repository.dart';
3+
import 'package:flutter_multiple_bloc/model/randomcocktail/random_cocktail.dart';
4+
5+
abstract class TheCocktailDbState {}
6+
7+
class TheCocktailDbInitial extends TheCocktailDbState {}
8+
9+
class TheCocktailDbLoading extends TheCocktailDbState {}
10+
11+
class TheCocktailDbFailure extends TheCocktailDbState {
12+
final String errorMessage;
13+
14+
TheCocktailDbFailure(this.errorMessage);
15+
}
16+
17+
class TheCocktailDbLoaded extends TheCocktailDbState {
18+
final RandomCocktail randomCocktail;
19+
20+
TheCocktailDbLoaded(this.randomCocktail);
21+
}
22+
23+
class TheCocktailDbEvent {}
24+
25+
class TheCocktailDbBloc extends Bloc<TheCocktailDbEvent, TheCocktailDbState> {
26+
final ApiTheCocktailDbRepository _apiTheCocktailDbRepository = ApiTheCocktailDbRepository();
27+
28+
@override
29+
TheCocktailDbState get initialState => TheCocktailDbInitial();
30+
31+
@override
32+
Stream<TheCocktailDbState> mapEventToState(TheCocktailDbEvent event) async* {
33+
yield TheCocktailDbLoading();
34+
RandomCocktail randomCocktail = await _apiTheCocktailDbRepository.fetchRandomCocktail();
35+
if (randomCocktail.error != null) {
36+
yield TheCocktailDbFailure(randomCocktail.error);
37+
return;
38+
}
39+
yield TheCocktailDbLoaded(randomCocktail);
40+
}
41+
42+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import 'package:flutter_bloc/flutter_bloc.dart';
2+
import 'package:flutter_multiple_bloc/api/themealdb/api_the_meal_db_repository.dart';
3+
import 'package:flutter_multiple_bloc/model/randommeal/random_meal.dart';
4+
5+
abstract class TheMealDbState {}
6+
7+
class TheMealDbInitial extends TheMealDbState {}
8+
9+
class TheMealDbLoading extends TheMealDbState {}
10+
11+
class TheMealDbFailure extends TheMealDbState {
12+
final String errorMessage;
13+
14+
TheMealDbFailure(this.errorMessage);
15+
}
16+
17+
class TheMealDbLoaded extends TheMealDbState {
18+
final RandomMeal randomMeal;
19+
20+
TheMealDbLoaded(this.randomMeal);
21+
}
22+
23+
class TheMealDbEvent {}
24+
25+
class TheMealDbBloc extends Bloc<TheMealDbEvent, TheMealDbState> {
26+
final ApiTheMealDbRepository _apiTheMealDbRepository = ApiTheMealDbRepository();
27+
28+
@override
29+
TheMealDbState get initialState => TheMealDbInitial();
30+
31+
@override
32+
Stream<TheMealDbState> mapEventToState(TheMealDbEvent event) async* {
33+
yield TheMealDbLoading();
34+
RandomMeal randomMeal = await _apiTheMealDbRepository.fetchRandomMeal();
35+
if (randomMeal.error != null) {
36+
yield TheMealDbFailure(randomMeal.error);
37+
return;
38+
}
39+
yield TheMealDbLoaded(randomMeal);
40+
}
41+
42+
}
43+
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import 'package:flutter_bloc/flutter_bloc.dart';
2+
import 'package:flutter_multiple_bloc/api/thecocktaildb/api_the_cocktail_db_repository.dart';
3+
import 'package:flutter_multiple_bloc/api/themealdb/api_the_meal_db_repository.dart';
4+
import 'package:flutter_multiple_bloc/model/randomcocktail/random_cocktail.dart';
5+
import 'package:flutter_multiple_bloc/model/randommeal/random_meal.dart';
6+
7+
abstract class TheMealCocktailDbState {}
8+
9+
class TheMealCocktailDbInitial extends TheMealCocktailDbState {}
10+
11+
class TheMealCocktailDbLoading extends TheMealCocktailDbState {}
12+
13+
class TheMealCocktailDbFailure extends TheMealCocktailDbState {
14+
final String errorMessage;
15+
16+
TheMealCocktailDbFailure(this.errorMessage);
17+
}
18+
19+
class TheMealCocktailDbLoaded extends TheMealCocktailDbState {
20+
final RandomMeal randomMeal;
21+
final RandomCocktail randomCocktail;
22+
23+
TheMealCocktailDbLoaded(this.randomMeal, this.randomCocktail);
24+
}
25+
26+
class TheMealCocktailDbEvent {}
27+
28+
class TheMealCocktailDbBloc extends Bloc<TheMealCocktailDbEvent, TheMealCocktailDbState> {
29+
final ApiTheMealDbRepository _apiTheMealDbRepository = ApiTheMealDbRepository();
30+
final ApiTheCocktailDbRepository _apiTheCocktailDbRepository = ApiTheCocktailDbRepository();
31+
32+
@override
33+
TheMealCocktailDbState get initialState => TheMealCocktailDbInitial();
34+
35+
@override
36+
Stream<TheMealCocktailDbState> mapEventToState(TheMealCocktailDbEvent event) async* {
37+
yield TheMealCocktailDbLoading();
38+
RandomMeal randomMeal = await _apiTheMealDbRepository.fetchRandomMeal();
39+
if (randomMeal.error != null) {
40+
yield TheMealCocktailDbFailure(randomMeal.error);
41+
return;
42+
}
43+
RandomCocktail randomCocktail = await _apiTheCocktailDbRepository.fetchRandomCocktail();
44+
if (randomCocktail.error != null) {
45+
yield TheMealCocktailDbFailure(randomCocktail.error);
46+
return;
47+
}
48+
yield TheMealCocktailDbLoaded(randomMeal, randomCocktail);
49+
}
50+
51+
}

lib/main.dart

Lines changed: 5 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -1,111 +1,8 @@
11
import 'package:flutter/material.dart';
2+
import 'package:flutter_multiple_bloc/ui/single_bloc_app.dart';
23

3-
void main() => runApp(MyApp());
4+
// Example MultipleBloc
5+
/*void main() => runApp(MultipleBlocApp());*/
46

5-
class MyApp extends StatelessWidget {
6-
// This widget is the root of your application.
7-
@override
8-
Widget build(BuildContext context) {
9-
return MaterialApp(
10-
title: 'Flutter Demo',
11-
theme: ThemeData(
12-
// This is the theme of your application.
13-
//
14-
// Try running your application with "flutter run". You'll see the
15-
// application has a blue toolbar. Then, without quitting the app, try
16-
// changing the primarySwatch below to Colors.green and then invoke
17-
// "hot reload" (press "r" in the console where you ran "flutter run",
18-
// or simply save your changes to "hot reload" in a Flutter IDE).
19-
// Notice that the counter didn't reset back to zero; the application
20-
// is not restarted.
21-
primarySwatch: Colors.blue,
22-
),
23-
home: MyHomePage(title: 'Flutter Demo Home Page'),
24-
);
25-
}
26-
}
27-
28-
class MyHomePage extends StatefulWidget {
29-
MyHomePage({Key key, this.title}) : super(key: key);
30-
31-
// This widget is the home page of your application. It is stateful, meaning
32-
// that it has a State object (defined below) that contains fields that affect
33-
// how it looks.
34-
35-
// This class is the configuration for the state. It holds the values (in this
36-
// case the title) provided by the parent (in this case the App widget) and
37-
// used by the build method of the State. Fields in a Widget subclass are
38-
// always marked "final".
39-
40-
final String title;
41-
42-
@override
43-
_MyHomePageState createState() => _MyHomePageState();
44-
}
45-
46-
class _MyHomePageState extends State<MyHomePage> {
47-
int _counter = 0;
48-
49-
void _incrementCounter() {
50-
setState(() {
51-
// This call to setState tells the Flutter framework that something has
52-
// changed in this State, which causes it to rerun the build method below
53-
// so that the display can reflect the updated values. If we changed
54-
// _counter without calling setState(), then the build method would not be
55-
// called again, and so nothing would appear to happen.
56-
_counter++;
57-
});
58-
}
59-
60-
@override
61-
Widget build(BuildContext context) {
62-
// This method is rerun every time setState is called, for instance as done
63-
// by the _incrementCounter method above.
64-
//
65-
// The Flutter framework has been optimized to make rerunning build methods
66-
// fast, so that you can just rebuild anything that needs updating rather
67-
// than having to individually change instances of widgets.
68-
return Scaffold(
69-
appBar: AppBar(
70-
// Here we take the value from the MyHomePage object that was created by
71-
// the App.build method, and use it to set our appbar title.
72-
title: Text(widget.title),
73-
),
74-
body: Center(
75-
// Center is a layout widget. It takes a single child and positions it
76-
// in the middle of the parent.
77-
child: Column(
78-
// Column is also a layout widget. It takes a list of children and
79-
// arranges them vertically. By default, it sizes itself to fit its
80-
// children horizontally, and tries to be as tall as its parent.
81-
//
82-
// Invoke "debug painting" (press "p" in the console, choose the
83-
// "Toggle Debug Paint" action from the Flutter Inspector in Android
84-
// Studio, or the "Toggle Debug Paint" command in Visual Studio Code)
85-
// to see the wireframe for each widget.
86-
//
87-
// Column has various properties to control how it sizes itself and
88-
// how it positions its children. Here we use mainAxisAlignment to
89-
// center the children vertically; the main axis here is the vertical
90-
// axis because Columns are vertical (the cross axis would be
91-
// horizontal).
92-
mainAxisAlignment: MainAxisAlignment.center,
93-
children: <Widget>[
94-
Text(
95-
'You have pushed the button this many times:',
96-
),
97-
Text(
98-
'$_counter',
99-
style: Theme.of(context).textTheme.display1,
100-
),
101-
],
102-
),
103-
),
104-
floatingActionButton: FloatingActionButton(
105-
onPressed: _incrementCounter,
106-
tooltip: 'Increment',
107-
child: Icon(Icons.add),
108-
), // This trailing comma makes auto-formatting nicer for build methods.
109-
);
110-
}
111-
}
7+
// Example SingleBloc
8+
void main() => runApp(SingleBlocApp());

0 commit comments

Comments
 (0)