You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
meals/lib/screens/tabs.dart

126 lines
3.4 KiB
Dart

import 'package:flutter/material.dart';
import 'package:meals/data/dummy_categories.dart';
import 'package:meals/screens/CategoriesScreen.dart';
import 'package:meals/screens/MealsScreen.dart';
import 'package:meals/screens/filters.dart';
import 'package:meals/widgets/main_drawer.dart';
import '../models/Meal.dart';
const kDefaultFilters = {
Filter.glutenFree: false,
Filter.lactoseFree: false,
Filter.veggie: false,
Filter.vegan: false,
};
class TabsScreen extends StatefulWidget {
const TabsScreen({Key? key}) : super(key: key);
@override
State<TabsScreen> createState() => _TabsScreenState();
}
class _TabsScreenState extends State<TabsScreen> {
int _selectedPageIndex = 0;
final List<Meal> _favoriteMeals = [];
Map<Filter, bool> _selectedFilters = kDefaultFilters;
void _showInfoMessage(String message) {
ScaffoldMessenger.of(context).clearSnackBars();
ScaffoldMessenger.of(context)
.showSnackBar(SnackBar(content: Text(message)));
}
void _selectPage(int index) {
setState(() {
_selectedPageIndex = index;
});
}
void _toggleFavoriteMeal(Meal meal) {
if (_favoriteMeals.contains(meal)) {
setState(() {
_favoriteMeals.remove(meal);
});
_showInfoMessage('Meal is no longer a favorite');
} else {
setState(() {
_favoriteMeals.add(meal);
_showInfoMessage('Meal has been added to your favorites');
});
}
}
void _setScreen(String identifier) async {
Navigator.of(context).pop();
switch (identifier) {
case 'filters':
final results = await Navigator.of(context)
.push<Map<Filter, bool>>(MaterialPageRoute(
builder: (ctx) => FiltersScreen(
currentFilters: _selectedFilters,
)));
setState(() {
_selectedFilters = results ?? kDefaultFilters;
});
break;
}
}
@override
Widget build(BuildContext context) {
Widget activePage;
String? activePageTitle;
final availableMeals = dummyMeals.where((meal) {
if (_selectedFilters[Filter.glutenFree]! && !meal.isGlutenFree) {
return false;
}
if (_selectedFilters[Filter.lactoseFree]! && !meal.isLactoseFree) {
return false;
}
if (_selectedFilters[Filter.veggie]! && !meal.isVegetarian) {
return false;
}
if (_selectedFilters[Filter.vegan]! && !meal.isVegan) {
return false;
}
return true;
}).toList();
switch (_selectedPageIndex) {
case 1:
activePageTitle = 'Favorites';
activePage = MealsScreen(
meals: _favoriteMeals,
onToggleFavorite: _toggleFavoriteMeal,
);
break;
default:
activePageTitle = 'Pick your category';
activePage = CategoriesScreen(
availableMeals: availableMeals,
onToggleFavorite: _toggleFavoriteMeal,
);
}
return Scaffold(
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'),
],
),
);
}
}