feat(): riverpod & state management
			#1
			
				
			
		
		
	 Merged
	
	
		
		
			
		
		
		
		
			
		
		
			
			
				Alyve
				merged 1 commits from feat/state-management  into main 3 years ago
			
		
	
	
@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					import 'package:flutter_riverpod/flutter_riverpod.dart';
 | 
				
			||||||
 | 
					import 'package:meals/models/Meal.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class FavoriteMealsNotifier extends StateNotifier<List<Meal>> {
 | 
				
			||||||
 | 
					  FavoriteMealsNotifier(List<Meal>? initialList) : super(initialList ?? []);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool toggleMealFavoriteStatus(Meal meal) {
 | 
				
			||||||
 | 
					    if (state.contains(meal)) {
 | 
				
			||||||
 | 
					      state = state.where((Meal m) => m.id != meal.id).toList();
 | 
				
			||||||
 | 
					      return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    state = [...state, meal];
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					final favoriteMealsProvider =
 | 
				
			||||||
 | 
					StateNotifierProvider<FavoriteMealsNotifier, List<Meal>>(
 | 
				
			||||||
 | 
					        (ref) => FavoriteMealsNotifier([]));
 | 
				
			||||||
@ -0,0 +1,55 @@
 | 
				
			|||||||
 | 
					import 'package:flutter_riverpod/flutter_riverpod.dart';
 | 
				
			||||||
 | 
					import 'package:meals/providers/meals_provider.dart';
 | 
				
			||||||
 | 
					import 'package:meals/screens/filters.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum Filter {
 | 
				
			||||||
 | 
					  glutenFree,
 | 
				
			||||||
 | 
					  lactoseFree,
 | 
				
			||||||
 | 
					  veggie,
 | 
				
			||||||
 | 
					  vegan,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class FiltersNotifier extends StateNotifier<Map<Filter, bool>> {
 | 
				
			||||||
 | 
					  FiltersNotifier()
 | 
				
			||||||
 | 
					      : super({
 | 
				
			||||||
 | 
					          Filter.glutenFree: false,
 | 
				
			||||||
 | 
					          Filter.lactoseFree: false,
 | 
				
			||||||
 | 
					          Filter.veggie: false,
 | 
				
			||||||
 | 
					          Filter.vegan: false,
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void setFilter(Filter filter, bool isActive) {
 | 
				
			||||||
 | 
					    state = {
 | 
				
			||||||
 | 
					      ...state,
 | 
				
			||||||
 | 
					      filter: isActive,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void setFilters(Map<Filter, bool> newFilters) {
 | 
				
			||||||
 | 
					    state = newFilters;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					final filtersProvider =
 | 
				
			||||||
 | 
					    StateNotifierProvider<FiltersNotifier, Map<Filter, bool>>(
 | 
				
			||||||
 | 
					        (ref) => FiltersNotifier());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					final filteredMealsProvider = Provider((ref) {
 | 
				
			||||||
 | 
					  final meals = ref.watch(mealsProvider);
 | 
				
			||||||
 | 
					  final activeFilters = ref.watch(filtersProvider);
 | 
				
			||||||
 | 
					  return meals.where((meal) {
 | 
				
			||||||
 | 
					    if (activeFilters[Filter.glutenFree]! && !meal.isGlutenFree) {
 | 
				
			||||||
 | 
					      return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (activeFilters[Filter.lactoseFree]! && !meal.isLactoseFree) {
 | 
				
			||||||
 | 
					      return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (activeFilters[Filter.veggie]! && !meal.isVegetarian) {
 | 
				
			||||||
 | 
					      return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (activeFilters[Filter.vegan]! && !meal.isVegan) {
 | 
				
			||||||
 | 
					      return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					  }).toList();
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					import 'package:flutter_riverpod/flutter_riverpod.dart';
 | 
				
			||||||
 | 
					import 'package:meals/data/dummy_categories.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					final mealsProvider = Provider((ref) => dummyMeals);
 | 
				
			||||||
					Loading…
					
					
				
		Reference in New Issue