added provider for recipe wizard

This commit is contained in:
2025-02-10 19:55:18 +01:00
parent f72e9dae2b
commit d2e3b158cb
6 changed files with 226 additions and 12 deletions

View File

@@ -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);
} }

View File

@@ -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);
} }

View File

@@ -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,
);
}
} }

View 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();
}
}
}

View File

@@ -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,

View File

@@ -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: