added provider for recipe wizard
This commit is contained in:
@@ -13,4 +13,12 @@ class Ingredient {
|
|||||||
this.possibleUnits = const [],
|
this.possibleUnits = const [],
|
||||||
this.preferredBrands = const [],
|
this.preferredBrands = const [],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) =>
|
||||||
|
identical(this, other) ||
|
||||||
|
other is Ingredient && other.title == title && other.type == type;
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode => Object.hash(title, type);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,4 +8,14 @@ class IngredientListEntry {
|
|||||||
final bool optional;
|
final bool optional;
|
||||||
|
|
||||||
IngredientListEntry(this.ingredient, this.amount, this.unit, this.optional);
|
IngredientListEntry(this.ingredient, this.amount, this.unit, this.optional);
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) =>
|
||||||
|
identical(this, other) ||
|
||||||
|
other is IngredientListEntry &&
|
||||||
|
ingredient == other.ingredient &&
|
||||||
|
amount == other.amount;
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode => Object.hash(ingredient.hashCode, amount.hashCode);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,26 +6,67 @@ class Recipe {
|
|||||||
final String title;
|
final String title;
|
||||||
final String description;
|
final String description;
|
||||||
final Difficulty difficulty;
|
final Difficulty difficulty;
|
||||||
final List<IngredientListEntry> ingredients = [];
|
final List<IngredientListEntry> ingredients;
|
||||||
final List<String> steps = [];
|
final List<String> steps;
|
||||||
final DateTime datePublished;
|
final DateTime datePublished;
|
||||||
final Duration prepTime;
|
final Duration prepTime;
|
||||||
final Duration cookTime;
|
final Duration cookTime;
|
||||||
final Duration totalTime;
|
final Duration totalTime;
|
||||||
final List<String> keywords = [];
|
final List<String> keywords;
|
||||||
final MealCategory mealCategory;
|
final MealCategory mealCategory;
|
||||||
final Cuisine cuisine;
|
final Cuisine cuisine;
|
||||||
|
|
||||||
Recipe({
|
Recipe({
|
||||||
required this.id,
|
this.id = -1,
|
||||||
required this.title,
|
this.title = '',
|
||||||
required this.description,
|
this.description = '',
|
||||||
required this.difficulty,
|
this.difficulty = Difficulty.notSelected,
|
||||||
required this.datePublished,
|
required this.datePublished,
|
||||||
required this.prepTime,
|
this.prepTime = const Duration(),
|
||||||
required this.cookTime,
|
this.cookTime = const Duration(),
|
||||||
required this.totalTime,
|
this.totalTime = const Duration(),
|
||||||
required this.mealCategory,
|
this.mealCategory = MealCategory.notSelected,
|
||||||
required this.cuisine,
|
this.cuisine = Cuisine.notSelected,
|
||||||
|
this.ingredients = const [],
|
||||||
|
this.keywords = const [],
|
||||||
|
this.steps = const [],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Recipe copyWith({
|
||||||
|
int? id,
|
||||||
|
String? title,
|
||||||
|
String? description,
|
||||||
|
Difficulty? difficulty,
|
||||||
|
List<IngredientListEntry>? ingredients,
|
||||||
|
List<String>? steps,
|
||||||
|
DateTime? datePublished,
|
||||||
|
Duration? prepTime,
|
||||||
|
Duration? cookTime,
|
||||||
|
Duration? totalTime,
|
||||||
|
List<String>? keywords,
|
||||||
|
MealCategory? mealCategory,
|
||||||
|
Cuisine? cuisine,
|
||||||
|
}) {
|
||||||
|
return Recipe(
|
||||||
|
id: id ?? this.id,
|
||||||
|
title: title ?? this.title,
|
||||||
|
description: description ?? this.description,
|
||||||
|
difficulty: difficulty ?? this.difficulty,
|
||||||
|
ingredients: ingredients != null
|
||||||
|
? List<IngredientListEntry>.from(ingredients)
|
||||||
|
: List<IngredientListEntry>.from(this.ingredients),
|
||||||
|
steps: steps != null
|
||||||
|
? List<String>.from(steps)
|
||||||
|
: List<String>.from(this.steps),
|
||||||
|
datePublished: datePublished ?? this.datePublished,
|
||||||
|
prepTime: prepTime ?? this.prepTime,
|
||||||
|
cookTime: cookTime ?? this.cookTime,
|
||||||
|
totalTime: totalTime ?? this.totalTime,
|
||||||
|
keywords: keywords != null
|
||||||
|
? List<String>.from(keywords)
|
||||||
|
: List<String>.from(this.keywords),
|
||||||
|
mealCategory: mealCategory ?? this.mealCategory,
|
||||||
|
cuisine: cuisine ?? this.cuisine,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
151
lib/services/providers/recipe_provider.dart
Normal file
151
lib/services/providers/recipe_provider.dart
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
import '../../models/ingredient_list_entry.dart';
|
||||||
|
import '../../models/recipe.dart';
|
||||||
|
import '../../src/enums.dart';
|
||||||
|
|
||||||
|
class RecipeProvider extends ChangeNotifier {
|
||||||
|
Recipe _recipe = Recipe(datePublished: DateTime.now());
|
||||||
|
|
||||||
|
Recipe get recipe => _recipe;
|
||||||
|
|
||||||
|
void updateTitle(String title, {bool silent = false}) {
|
||||||
|
_recipe = _recipe.copyWith(title: title);
|
||||||
|
if (!silent) {
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateDescription(String description, {bool silent = false}) {
|
||||||
|
_recipe = _recipe.copyWith(description: description);
|
||||||
|
if (!silent) {
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateDifficulty(Difficulty difficulty, {bool silent = false}) {
|
||||||
|
_recipe = _recipe.copyWith(difficulty: difficulty);
|
||||||
|
if (!silent) {
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateIngredients(List<IngredientListEntry> ingredients,
|
||||||
|
{bool silent = false}) {
|
||||||
|
_recipe = _recipe.copyWith(ingredients: ingredients);
|
||||||
|
if (!silent) {
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateSteps(List<String> steps, {bool silent = false}) {
|
||||||
|
_recipe = _recipe.copyWith(steps: steps);
|
||||||
|
if (!silent) {
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateDatePublished(DateTime datePublished, {bool silent = false}) {
|
||||||
|
_recipe = _recipe.copyWith(datePublished: datePublished);
|
||||||
|
if (!silent) {
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void updatePrepTime(Duration prepTime, {bool silent = false}) {
|
||||||
|
_recipe = _recipe.copyWith(prepTime: prepTime);
|
||||||
|
if (!silent) {
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateCookTime(Duration cookTime, {bool silent = false}) {
|
||||||
|
_recipe = _recipe.copyWith(cookTime: cookTime);
|
||||||
|
if (!silent) {
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateTotalTime(Duration totalTime, {bool silent = false}) {
|
||||||
|
_recipe = _recipe.copyWith(totalTime: totalTime);
|
||||||
|
if (!silent) {
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateKeywords(List<String> keywords, {bool silent = false}) {
|
||||||
|
_recipe = _recipe.copyWith(keywords: keywords);
|
||||||
|
if (!silent) {
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateMealCategory(MealCategory mealCategory, {bool silent = false}) {
|
||||||
|
_recipe = _recipe.copyWith(mealCategory: mealCategory);
|
||||||
|
if (!silent) {
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateCuisine(Cuisine cuisine, {bool silent = false}) {
|
||||||
|
_recipe = _recipe.copyWith(cuisine: cuisine);
|
||||||
|
if (!silent) {
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper methods for list operations
|
||||||
|
void addIngredient(IngredientListEntry ingredient, {bool silent = false}) {
|
||||||
|
_recipe = _recipe.copyWith(
|
||||||
|
ingredients: [..._recipe.ingredients, ingredient],
|
||||||
|
);
|
||||||
|
if (!silent) {
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void removeIngredient(IngredientListEntry ingredient, {bool silent = false}) {
|
||||||
|
_recipe = _recipe.copyWith(
|
||||||
|
ingredients: _recipe.ingredients.where((i) => i != ingredient).toList(),
|
||||||
|
);
|
||||||
|
if (!silent) {
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void addStep(String step, {bool silent = false}) {
|
||||||
|
_recipe = _recipe.copyWith(
|
||||||
|
steps: [..._recipe.steps, step],
|
||||||
|
);
|
||||||
|
if (!silent) {
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void removeStep(String step, {bool silent = false}) {
|
||||||
|
_recipe = _recipe.copyWith(
|
||||||
|
steps: _recipe.steps.where((s) => s != step).toList(),
|
||||||
|
);
|
||||||
|
if (!silent) {
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void addKeyword(String keyword, {bool silent = false}) {
|
||||||
|
_recipe = _recipe.copyWith(
|
||||||
|
keywords: [..._recipe.keywords, keyword],
|
||||||
|
);
|
||||||
|
if (!silent) {
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void removeKeyword(String keyword, {bool silent = false}) {
|
||||||
|
_recipe = _recipe.copyWith(
|
||||||
|
keywords: _recipe.keywords.where((k) => k != keyword).toList(),
|
||||||
|
);
|
||||||
|
if (!silent) {
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -16,6 +16,7 @@ enum Difficulty {
|
|||||||
}
|
}
|
||||||
|
|
||||||
enum IngredientType {
|
enum IngredientType {
|
||||||
|
notSelected,
|
||||||
vegetable,
|
vegetable,
|
||||||
meat,
|
meat,
|
||||||
fish,
|
fish,
|
||||||
@@ -28,6 +29,7 @@ enum IngredientType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
enum MealCategory {
|
enum MealCategory {
|
||||||
|
notSelected,
|
||||||
// Main Meals
|
// Main Meals
|
||||||
breakfast,
|
breakfast,
|
||||||
brunch,
|
brunch,
|
||||||
@@ -44,6 +46,7 @@ enum MealCategory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
enum Cuisine {
|
enum Cuisine {
|
||||||
|
notSelected,
|
||||||
// Asian Cuisines
|
// Asian Cuisines
|
||||||
chinese,
|
chinese,
|
||||||
japanese,
|
japanese,
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ dependencies:
|
|||||||
sdk: flutter
|
sdk: flutter
|
||||||
|
|
||||||
cupertino_icons: ^1.0.8
|
cupertino_icons: ^1.0.8
|
||||||
|
provider: ^6.1.2
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
|
|||||||
Reference in New Issue
Block a user