1) _glutenFreeFilterSet 이하4개 설정 값의 초기값을 false로 설정해두었다.
2) 최초 초기값 이후에 설정된 값에 대해서는 initState를 통해 화면을 이동하더라도 값이 계속 저장되게끔 세팅했다.
3) WillPopScope를 통해 pop(뒤로가기)가 될 때, 값을 전달해줄 수 있게 하였다. 해당 값을 tabs화면에서 사용하게 된다.
이 때, 반환되어야 하는 값은 futre이기 때문에 async를 사용해준다. (정확히 잘 이해 안되도 넘어가자. return 값이 false인데 아마 pop이후 return값을 다시 확인 하기 위해 callback을 하기 때문인거 같다. 이때 return 값이 true면 한번 더 pop되고 false면 한번만 pop된다)
_showInfoMessage('Meal is no longer a favorite.');
} else {
setState(() {
_favoriteMeals.add(meal);
_showInfoMessage('Marked as a favorite!');
});
}
}
void_selectPage(int index) {
setState(() {
_selectedPageIndex = index;
});
}
void_setScreen(String identifier) async {
Navigator.of(context).pop();
if (identifier =='filters') {
final result =awaitNavigator.of(context).push<Map<Filter, bool>>(
MaterialPageRoute(
builder: (ctx) =>FiltersScreen(
currentFilters: _selectedFilters,
),
),
);
setState(() {
_selectedFilters = result ?? kInitialFilters;
});
}
}
@override
Widgetbuild(BuildContext context) {
final availableMeals = dummyMeals.where((meal) {
if (_selectedFilters[Filter.glutenFree]!&&!meal.isGlutenFree) {
returnfalse;
}
if (_selectedFilters[Filter.lactoseFree]!&&!meal.isLactoseFree) {
returnfalse;
}
if (_selectedFilters[Filter.vegetarian]!&&!meal.isVegetarian) {
returnfalse;
}
if (_selectedFilters[Filter.vegan]!&&!meal.isVegan) {
returnfalse;
}
returntrue;
}).toList();
Widget activePage =CategoriesScreen(
onToggleFavorite: _toggleMealFavoriteStatus,
availableMeals: availableMeals,
);
var activePageTitle ='Categories';
if (_selectedPageIndex ==1) {
activePage =MealsScreen(
meals: _favoriteMeals,
onToggleFavorite: _toggleMealFavoriteStatus,
);
activePageTitle ='Your Favorites';
}
returnScaffold(
appBar:AppBar(
title:Text(activePageTitle),
),
drawer:MainDrawer(
onSelectScreen: _setScreen,
),
body: activePage,
bottomNavigationBar:BottomNavigationBar(
onTap: _selectPage,
currentIndex: _selectedPageIndex,
items:const [
BottomNavigationBarItem(
icon:Icon(Icons.set_meal),
label:'Categories',
),
BottomNavigationBarItem(
icon:Icon(Icons.star),
label:'Favorites',
),
],
),
);
}
}
1) 위에 설명한 필터 화면에 초기값을 전달해주기 위해 _selectedFilters부분을 설정했다. 해당 값의 초기 값은
kInitialFilters 이다. (이때 k를 붙이는이유는 전역 변수에 사용할 때) 그리고 A ?? B의 뜻은 A가 null이 아니면 A를 사용 null이면 B 값을 쓴다는 뜻이다.
2)_setScreen를 async await 구문으로, 사용하였는데 이유는 필터스크린에서 넘어 오는 값이 futre이기 때문이다. 따라서 필터스크린에서 값을 받게되면 result 값에 담기게 되고, 마지막 setState 부분을 통해 result의 값이 _selectedFilters의 값으로 할당된다.
3) availableMeals를 통해 _selectedFilters에서 필터된 값을 추출하여, 최종적으로 availableMeals에는 필터링된 값이 리스트에 담기게 된다. 해당 availableMeals값은 카테고리 화면으로 넘겨준다.