Skip to content

Commit 97649f1

Browse files
committed
Perbaikan bloc di UI Search Meals
Perbaikan bloc di UI Search Meals yang error ketika menu tersebut dibuka kedua kali karena disebabkan oleh stream si bloc yang tertutup ketika dibuka kedua kali UI tersebut
1 parent 1658e0d commit 97649f1

File tree

2 files changed

+29
-15
lines changed

2 files changed

+29
-15
lines changed

lib/src/blocs/searchmeals/search_meals_bloc.dart

+5-4
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,12 @@ import 'package:food_recipe/src/resources/food_api_repository.dart';
66
import 'package:rxdart/rxdart.dart';
77

88
class SearchMealsBloc {
9-
// ignore: close_sinks
109
final _publishSubjectSearchMealsByKeyword = PublishSubject<SearchMeals>();
1110
final _foodApiRepository = FoodApiRepository();
1211
final _favoriteMealRepository = FavoriteMealRepository();
1312

1413
dispose() {
15-
/*_publishSubjectSearchMealsByKeyword.close();*/
14+
_publishSubjectSearchMealsByKeyword.close();
1615
}
1716

1817
Observable<SearchMeals> get resultSearchMealsByKeyword =>
@@ -28,6 +27,10 @@ class SearchMealsBloc {
2827
await _foodApiRepository.getSearchMealsByKeyword(keyword);
2928
List<FavoriteMeal> listFavoriteMeals =
3029
await _favoriteMealRepository.getAllFavoriteMeals();
30+
if (searchMeals.searchMealsItems == null) {
31+
_publishSubjectSearchMealsByKeyword.sink.add(SearchMeals(searchMealsItems: []));
32+
return;
33+
}
3134
List<SearchMealsItem> listSearchMealsItem =
3235
searchMeals.searchMealsItems.where((searchMealsItem) {
3336
for (FavoriteMeal favoriteMeal in listFavoriteMeals) {
@@ -57,5 +60,3 @@ class SearchMealsBloc {
5760
return await _favoriteMealRepository.deleteFavoriteMealById(id);
5861
}
5962
}
60-
61-
final searchMealsBloc = SearchMealsBloc();

lib/src/ui/searchmeals/search_meals_screen.dart

+24-11
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,17 @@ class SearchMealsScreen extends StatefulWidget {
1313
}
1414

1515
class _SearchMealsScreenState extends State<SearchMealsScreen> {
16+
SearchMealsBloc _searchMealsBloc;
17+
18+
@override
19+
void initState() {
20+
_searchMealsBloc = SearchMealsBloc();
21+
super.initState();
22+
}
23+
1624
@override
1725
void dispose() {
18-
searchMealsBloc.dispose();
26+
_searchMealsBloc.dispose();
1927
super.dispose();
2028
}
2129

@@ -63,7 +71,7 @@ class _SearchMealsScreenState extends State<SearchMealsScreen> {
6371

6472
Widget _buildResultSearchMeals(MediaQueryData mediaQuery) {
6573
return StreamBuilder(
66-
stream: searchMealsBloc.resultSearchMealsByKeyword,
74+
stream: _searchMealsBloc.resultSearchMealsByKeyword,
6775
builder: (BuildContext context, AsyncSnapshot<SearchMeals> snapshot) {
6876
if (snapshot.hasData) {
6977
SearchMeals searchMeals = snapshot.data;
@@ -78,7 +86,7 @@ class _SearchMealsScreenState extends State<SearchMealsScreen> {
7886
itemCount: searchMeals.searchMealsItems.length,
7987
itemBuilder: (context, index) {
8088
var searchMealsItem = searchMeals.searchMealsItems[index];
81-
return CardMeal(searchMealsItem);
89+
return CardMeal(searchMealsItem, _searchMealsBloc);
8290
},
8391
);
8492
} else if (snapshot.hasError) {
@@ -100,7 +108,7 @@ class _SearchMealsScreenState extends State<SearchMealsScreen> {
100108
horizontal: 12.0,
101109
vertical: 8.0,
102110
),
103-
child: TextFieldSearch(),
111+
child: TextFieldSearch(_searchMealsBloc),
104112
),
105113
);
106114
}
@@ -125,8 +133,9 @@ class _SearchMealsScreenState extends State<SearchMealsScreen> {
125133

126134
class CardMeal extends StatefulWidget {
127135
final SearchMealsItem searchMealsItem;
136+
final SearchMealsBloc searchMealsBloc;
128137

129-
CardMeal(this.searchMealsItem);
138+
CardMeal(this.searchMealsItem, this.searchMealsBloc);
130139

131140
@override
132141
_CardMealState createState() => _CardMealState();
@@ -206,7 +215,7 @@ class _CardMealState extends State<CardMeal> {
206215
onTap: () {
207216
var isFavorite = widget.searchMealsItem.isFavorite;
208217
if (isFavorite) {
209-
searchMealsBloc
218+
widget.searchMealsBloc
210219
.deleteFavoriteMealById(
211220
widget.searchMealsItem.idMeal)
212221
.then((status) {
@@ -216,14 +225,14 @@ class _CardMealState extends State<CardMeal> {
216225
});
217226
} else {
218227
Future<LookupMealsById> lookupMealsById =
219-
searchMealsBloc.getDetailMealById(
228+
widget.searchMealsBloc.getDetailMealById(
220229
widget.searchMealsItem.idMeal);
221230
lookupMealsById.then((value) {
222231
if (value != null) {
223232
var item = value.lookupMealsbyIdItems[0];
224233
FavoriteMeal favoriteMeal =
225234
FavoriteMeal.fromJson(item.toJson());
226-
searchMealsBloc
235+
widget.searchMealsBloc
227236
.addFavoriteMeal(favoriteMeal)
228237
.then((status) {
229238
setState(() {
@@ -265,6 +274,10 @@ class _CardMealState extends State<CardMeal> {
265274
}
266275

267276
class TextFieldSearch extends StatefulWidget {
277+
final SearchMealsBloc searchMealsBloc;
278+
279+
TextFieldSearch(this.searchMealsBloc);
280+
268281
@override
269282
_TextFieldSearchState createState() => _TextFieldSearchState();
270283
}
@@ -297,12 +310,12 @@ class _TextFieldSearchState extends State<TextFieldSearch> {
297310
onChanged: (value) {
298311
setState(() {});
299312
if (value.isEmpty) {
300-
searchMealsBloc.searchMealsByKeyword(value);
313+
widget.searchMealsBloc.searchMealsByKeyword(value);
301314
}
302315
},
303316
onSubmitted: (value) {
304317
setState(() {});
305-
searchMealsBloc.searchMealsByKeyword(value);
318+
widget.searchMealsBloc.searchMealsByKeyword(value);
306319
},
307320
),
308321
),
@@ -311,7 +324,7 @@ class _TextFieldSearchState extends State<TextFieldSearch> {
311324
: GestureDetector(
312325
onTap: () {
313326
setState(() => _textEditingControllerKeyword.clear());
314-
searchMealsBloc.searchMealsByKeyword("");
327+
widget.searchMealsBloc.searchMealsByKeyword("");
315328
},
316329
child: Icon(
317330
Icons.clear,

0 commit comments

Comments
 (0)