From 914e17fa3cce240b1b12b5050b2305e5a328511b Mon Sep 17 00:00:00 2001 From: broodjeaap89 Date: Sun, 25 Jul 2021 15:27:11 +0200 Subject: [PATCH] so Floor just sucks? commit before reverting --- lib/entities/PizzaDatabase.g.dart | 2 +- lib/entities/PizzaRecipe/PizzaRecipe.dart | 25 ++++---- lib/entities/PizzaRecipe/RecipeStep.dart | 9 +-- lib/entities/dao/AppDao.dart | 38 ++++++++++++ lib/entities/dao/IngridientDao.dart | 2 +- lib/main.dart | 4 ++ .../AddPizzaEvent/AddPizzaEventPage.dart | 6 +- .../AddPizzaEvent/PickPizzaRecipePage.dart | 61 +++++++++++++++++++ lib/pages/PizzaEventsPage.dart | 2 +- lib/util.dart | 12 +--- lib/widgets/PizzaRecipeWidget.dart | 37 +++++++++++ 11 files changed, 163 insertions(+), 35 deletions(-) create mode 100644 lib/entities/dao/AppDao.dart create mode 100644 lib/widgets/PizzaRecipeWidget.dart diff --git a/lib/entities/PizzaDatabase.g.dart b/lib/entities/PizzaDatabase.g.dart index a021ffe..e1e4ddc 100644 --- a/lib/entities/PizzaDatabase.g.dart +++ b/lib/entities/PizzaDatabase.g.dart @@ -433,7 +433,7 @@ class _$IngredientDao extends IngredientDao { } @override - Future> getPizzaRecipeSteps(int pizzaRecipeId) async { + Future> getPizzaRecipeIngredients(int pizzaRecipeId) async { return _queryAdapter.queryList( 'SELECT * FROM Ingredient WHERE pizzaRecipeId = ?1', mapper: (Map row) => Ingredient( diff --git a/lib/entities/PizzaRecipe/PizzaRecipe.dart b/lib/entities/PizzaRecipe/PizzaRecipe.dart index a4f82b0..937376d 100644 --- a/lib/entities/PizzaRecipe/PizzaRecipe.dart +++ b/lib/entities/PizzaRecipe/PizzaRecipe.dart @@ -1,6 +1,5 @@ import 'package:floor/floor.dart'; import 'package:flutter/material.dart'; -import 'package:pizzaplanner/entities/PizzaDatabase.dart'; import 'package:pizzaplanner/util.dart'; import 'package:pizzaplanner/entities/PizzaRecipe/Ingredient.dart'; @@ -17,9 +16,11 @@ class PizzaRecipe { final String name; final String description; - //final List ingredients; + @ignore + List ingredients = []; - //final List recipeSteps; + @ignore + List recipeSteps = []; PizzaRecipe(this.name, this.description, {this.id}); @@ -36,9 +37,6 @@ class PizzaRecipe { } Future getIngredientsTable(int pizzaCount, int doughBallSize) async { - final database = await getDatabase(); - final ingredientDao = database.ingredientDao; - final ingredients = await ingredientDao.getPizzaRecipeSteps(this.id!); return Table( border: TableBorder.all(), columnWidths: const { @@ -56,7 +54,7 @@ class PizzaRecipe { ) ] + - ingredients.map((ingredient) => + this.ingredients.map((ingredient) => ingredient.getIngredientTableRow(pizzaCount, doughBallSize)) .toList() ); @@ -124,14 +122,16 @@ class PizzaRecipe { return Tuple4(pizzaRecipe, ingredients, recipeSteps, recipeSubSteps); } - Future getMinDuration() async { - List recipeSteps = await this.getRecipeSteps(); + Duration getMinDuration() { return Duration(seconds: recipeSteps.map((recipeStep) => recipeStep.getWaitMinInSeconds()).reduce((a, b) => a+b)); } + Duration getMaxDuration() { + return Duration(seconds: recipeSteps.map((recipeStep) => recipeStep.getWaitMaxInSeconds()).reduce((a, b) => a+b)); + } + Future getCurrentDuration() async { - List recipeSteps = await this.getRecipeSteps(); - return Duration(seconds: recipeSteps.map((recipeStep) => recipeStep.getCurrentWaitInSeconds()).reduce((a, b) => a+b)); + return Duration(seconds: this.recipeSteps.map((recipeStep) => recipeStep.getCurrentWaitInSeconds()).reduce((a, b) => a+b)); } String toString() { @@ -141,8 +141,7 @@ class PizzaRecipe { Future
getStepTimeTable(DateTime startTime) async { List stepRows = []; DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(startTime.millisecondsSinceEpoch); - List recipeSteps = await this.getRecipeSteps(); - for (var recipeStep in recipeSteps.reversed) { + for (var recipeStep in this.recipeSteps.reversed) { Duration stepWaitDuration = Duration(seconds: recipeStep.getCurrentWaitInSeconds()); stepRows.add( TableRow( diff --git a/lib/entities/PizzaRecipe/RecipeStep.dart b/lib/entities/PizzaRecipe/RecipeStep.dart index f0ed265..724981b 100644 --- a/lib/entities/PizzaRecipe/RecipeStep.dart +++ b/lib/entities/PizzaRecipe/RecipeStep.dart @@ -21,7 +21,8 @@ class RecipeStep { late int waitValue; final String description; - // final List subSteps; + @ignore + List subSteps = []; RecipeStep(this.pizzaRecipeId, this.name, this.description, this.waitDescription, this.waitUnit, this.waitMin, this.waitMax, {this.id}) { waitValue = waitMin; @@ -61,10 +62,4 @@ class RecipeStep { int getCurrentWaitInSeconds() { return convertToSeconds(this.waitValue); } - - static Future> getRecipeStepForRecipe(PizzaRecipe pizzaRecipe) async { - final database = await getDatabase(); - final recipeStepDao = database.recipeStepDao; - return recipeStepDao.getPizzaRecipeSteps(pizzaRecipe.id!); - } } \ No newline at end of file diff --git a/lib/entities/dao/AppDao.dart b/lib/entities/dao/AppDao.dart new file mode 100644 index 0000000..d368100 --- /dev/null +++ b/lib/entities/dao/AppDao.dart @@ -0,0 +1,38 @@ +import 'package:pizzaplanner/entities/PizzaDatabase.dart'; +import 'package:pizzaplanner/entities/PizzaRecipe/PizzaRecipe.dart'; +import 'package:pizzaplanner/util.dart'; + + +class AppDao { + static const DATABASE_PATH = "pizza.db"; + + static Future> getPizzaRecipes() async { + final database = await $FloorPizzaDatabase.databaseBuilder(DATABASE_PATH).build(); + final pizzaRecipeDao = database.pizzaRecipeDao; + final recipeStepDao = database.recipeStepDao; + final recipeSubStepDao = database.recipeSubStepDao; + final ingredientDao = database.ingredientDao; + + List pizzaRecipes = await pizzaRecipeDao.getAllPizzaRecipes(); + + if (pizzaRecipes.isEmpty){ + await loadYamlRecipesIntoDb(); + pizzaRecipes = await pizzaRecipeDao.getAllPizzaRecipes(); + } + + for (var pizzaRecipe in pizzaRecipes) { + pizzaRecipe.ingredients = await ingredientDao.getPizzaRecipeIngredients(pizzaRecipe.id!); + print(pizzaRecipe.ingredients); + pizzaRecipe.recipeSteps = await recipeStepDao.getPizzaRecipeSteps(pizzaRecipe.id!); + print(pizzaRecipe.recipeSteps); + for (var pizzaRecipeStep in pizzaRecipe.recipeSteps){ + pizzaRecipeStep.subSteps = await recipeSubStepDao.getRecipeStepSubSteps(pizzaRecipeStep.id!); + print(pizzaRecipeStep.subSteps); + } + } + + return pizzaRecipes; + } + + +} \ No newline at end of file diff --git a/lib/entities/dao/IngridientDao.dart b/lib/entities/dao/IngridientDao.dart index a33e907..e7699d2 100644 --- a/lib/entities/dao/IngridientDao.dart +++ b/lib/entities/dao/IngridientDao.dart @@ -11,7 +11,7 @@ abstract class IngredientDao { Stream findIngredientById(int id); @Query("SELECT * FROM Ingredient WHERE pizzaRecipeId = :pizzaRecipeId") - Future> getPizzaRecipeSteps(int pizzaRecipeId); + Future> getPizzaRecipeIngredients(int pizzaRecipeId); @insert Future insertIngredient(Ingredient ingredient); diff --git a/lib/main.dart b/lib/main.dart index e1d772d..7c00935 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:pizzaplanner/pages/AddPizzaEvent/AddPizzaEventPage.dart'; +import 'package:pizzaplanner/pages/AddPizzaEvent/PickPizzaRecipePage.dart'; import 'package:pizzaplanner/pages/PizzaEventsPage.dart'; void main() { @@ -24,6 +25,9 @@ class RouteGenerator { case "/": { return MaterialPageRoute(builder: (context) => PizzaEventsPage()); } + case "/pickRecipe": { + return MaterialPageRoute(builder: (context) => PickPizzaRecipePage()); + } case "/add": { return MaterialPageRoute(builder: (context) => AddPizzaEventPage()); } diff --git a/lib/pages/AddPizzaEvent/AddPizzaEventPage.dart b/lib/pages/AddPizzaEvent/AddPizzaEventPage.dart index eb1d734..13b3f5b 100644 --- a/lib/pages/AddPizzaEvent/AddPizzaEventPage.dart +++ b/lib/pages/AddPizzaEvent/AddPizzaEventPage.dart @@ -15,7 +15,7 @@ class AddPizzaEventPage extends StatefulWidget { class AddPizzaEventPageState extends State { String name = ""; late Future pizzaRecipe; - final Future> pizzaRecipes = getRecipes(); + //final Future> pizzaRecipes = getRecipes(); int pizzaCount = 1; int doughBallSize = 250; DateTime eventTime = DateTime.now(); @@ -61,7 +61,7 @@ class AddPizzaEventPageState extends State { children: [ Icon(FontAwesome5.pizza_slice), Container(width: 25), - Expanded( + /*Expanded( child: FutureBuilder>( future: pizzaRecipes, builder: (BuildContext context, AsyncSnapshot> snapshot){ @@ -84,7 +84,7 @@ class AddPizzaEventPageState extends State { } } ), - ) + )*/ ] ), Row( diff --git a/lib/pages/AddPizzaEvent/PickPizzaRecipePage.dart b/lib/pages/AddPizzaEvent/PickPizzaRecipePage.dart index e69de29..7134ad3 100644 --- a/lib/pages/AddPizzaEvent/PickPizzaRecipePage.dart +++ b/lib/pages/AddPizzaEvent/PickPizzaRecipePage.dart @@ -0,0 +1,61 @@ +import 'package:flutter/material.dart'; +import 'package:pizzaplanner/entities/PizzaRecipe/PizzaRecipe.dart'; +import 'package:pizzaplanner/entities/dao/AppDao.dart'; +import 'package:pizzaplanner/widgets/PizzaRecipeWidget.dart'; + +class PickPizzaRecipePage extends StatefulWidget { + @override + PickPizzaRecipePageState createState() => PickPizzaRecipePageState(); +} + +class PickPizzaRecipePageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Add Pizza2 Event"), + ), + resizeToAvoidBottomInset: false, + body: Container( + padding: EdgeInsets.all(8), + child: Column( + children: [ + Expanded( + flex: 80, + child: FutureBuilder( + future: AppDao.getPizzaRecipes(), + builder: (BuildContext context, AsyncSnapshot> snapshot) { + if (snapshot.hasData && !snapshot.hasError){ + return ListView( + children: snapshot.data!.map((pizzaRecipe) { + return PizzaRecipeWidget(pizzaRecipe); + }).toList(), + ); + } else if (snapshot.hasError){ + print(snapshot.error); + return Text("Something went wrong"); + } else { + return Text("Loading Pizza Recipes"); + } + } + ) + ), + Divider(), + SizedBox( + width: double.infinity, + height: 70, + child: Container( + color: Colors.blue, + child: TextButton( + child: Text("Review", style: TextStyle(color: Colors.white)), + onPressed: () { + }, + ) + ) + ) + ] + ) + ) + ); + } +} diff --git a/lib/pages/PizzaEventsPage.dart b/lib/pages/PizzaEventsPage.dart index a9b242d..df892b4 100644 --- a/lib/pages/PizzaEventsPage.dart +++ b/lib/pages/PizzaEventsPage.dart @@ -28,7 +28,7 @@ class PizzaEventsState extends State { onPressed: () async { final dynamic newPizzaEvent = await Navigator.pushNamed( context, - "/add", + "/pickRecipe", ); if (newPizzaEvent != null){ diff --git a/lib/util.dart b/lib/util.dart index 6470d17..11d7106 100644 --- a/lib/util.dart +++ b/lib/util.dart @@ -5,14 +5,7 @@ import 'package:intl/intl.dart'; import 'package:pizzaplanner/entities/PizzaDatabase.dart'; import 'package:pizzaplanner/entities/PizzaRecipe/PizzaRecipe.dart'; -Future> getRecipes() async { - final database = await getDatabase(); - final pizzaRecipeDao = database.pizzaRecipeDao; - final pizzaRecipes = await pizzaRecipeDao.getAllPizzaRecipes(); - if (pizzaRecipes.isNotEmpty) { - return pizzaRecipes; - } - +Future> loadYamlRecipesIntoDb() async { // load recipes from yaml files in the asset directory final manifestContent = await rootBundle.loadString('AssetManifest.json'); final Map manifestMap = json.decode(manifestContent); @@ -23,10 +16,11 @@ Future> getRecipes() async { var parsedPizzaRecipe = await PizzaRecipe.fromYaml(filePath); await parsedPizzaRecipe.item1.insert(); newPizzaRecipes.add(parsedPizzaRecipe.item1); - + print(parsedPizzaRecipe.item1.name); parsedPizzaRecipe.item2.forEach((ingredient) async { await ingredient.insert(); }); parsedPizzaRecipe.item3.forEach((recipeStep) async { await recipeStep.insert(); }); parsedPizzaRecipe.item4.forEach((recipeSubStep) async { await recipeSubStep.insert(); }); + print(parsedPizzaRecipe.item1.description); } } return newPizzaRecipes; diff --git a/lib/widgets/PizzaRecipeWidget.dart b/lib/widgets/PizzaRecipeWidget.dart new file mode 100644 index 0000000..8d4c0cc --- /dev/null +++ b/lib/widgets/PizzaRecipeWidget.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:pizzaplanner/entities/PizzaRecipe/PizzaRecipe.dart'; + +class PizzaRecipeWidget extends StatelessWidget { + final PizzaRecipe pizzaRecipe; + + PizzaRecipeWidget(this.pizzaRecipe); + + @override + Widget build(BuildContext context) { + return Container( + height: 120, + color: Colors.blueAccent, + child: Container( + padding: const EdgeInsets.all(8), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text(pizzaRecipe.name), + ] + ), + Text(pizzaRecipe.description), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text("${pizzaRecipe.getMinDuration().inHours.round()} to ${pizzaRecipe.getMaxDuration().inHours.round()} hours") + ] + ) + ] + ) + ) + ); + } +} \ No newline at end of file