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