feat(): riverpod & state management
#1
Merged
Alyve
merged 1 commits from feat/state-management
into main
2 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