Display dish list

This commit is contained in:
2020-11-02 19:56:29 +01:00
parent 2ae32ac276
commit 8137807e27
5 changed files with 288 additions and 16 deletions

View File

@@ -0,0 +1,63 @@
import 'package:flutter/material.dart';
import '../services.dart';
class DishCard extends StatelessWidget {
final Dish dish;
DishCard({@required this.dish});
@override
Widget build(BuildContext context) {
return Card(
color: Colors.grey[800],
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
margin: EdgeInsets.symmetric(horizontal: 12, vertical: 5),
child: InkWell(
onTap: () {},
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Container(
child: ClipRRect(
child: Image.network(
dish.imgUrl,
width: 80,
height: 80,
fit: BoxFit.cover,
),
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(12),
topLeft: Radius.circular(12)),
),
padding: EdgeInsets.only(right: 8),
),
Expanded(
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Text(
dish.name,
overflow: TextOverflow.ellipsis,
maxLines: 1,
style: TextStyle(color: Colors.orange[600], fontSize: 16),
),
Text(
'${dish.price}',
style: TextStyle(color: Colors.grey[300], fontSize: 14),
),
],
)),
Container(
child: Icon(
Icons.arrow_right,
color: Colors.white,
size: 24,
),
)
],
),
),
);
}
}

View File

@@ -0,0 +1,152 @@
import 'package:flutter/material.dart';
import '../services.dart';
import 'dishCard.dart';
class DishList extends StatelessWidget {
final String id;
final List<String> categories;
DishList({@required this.id, @required this.categories});
final MenuiServices services = new MenuiServices();
@override
Widget build(BuildContext context) {
return Stack(children: [
ListView(children: [
SizedBox(height: 24),
FutureBuilder<List<Dish>>(
future: services.fetchAllDishes(id),
builder:
(BuildContext context, AsyncSnapshot<List<Dish>> snapshot) {
if (snapshot.hasData) {
final List<Dish> dishes = snapshot.data;
return ListView.builder(
controller: ScrollController(),
shrinkWrap: true,
itemCount: categories.length,
itemBuilder: (context, index) {
final filteredDishes =
filterDishesByCategory(dishes, categories[index]);
return ExpansionTile(
leading: Icon(
Icons.fastfood_rounded,
color: Colors.orange,
),
title: Text(
categories[index],
style: TextStyle(color: Colors.grey[300]),
),
children: <Widget>[
ListView.builder(
primary: false,
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemCount: filteredDishes.length,
itemBuilder: (context, index) {
return Container(
child: DishCard(dish: filteredDishes[index]),
);
},
)
],
);
},
);
} else {
return Center(
child: CircularProgressIndicator(),
);
}
}),
]),
Positioned.fill(
bottom: 20,
child: Align(
alignment: Alignment.bottomCenter,
child: FloatingActionButton.extended(
backgroundColor: Colors.grey[900],
onPressed: () {
Navigator.pop(context);
},
icon: Icon(
Icons.keyboard_arrow_down_rounded,
color: Colors.orange,
),
label: Text(
'Zamknij',
style:
TextStyle(color: Colors.white, fontWeight: FontWeight.w400),
),
),
))
]);
}
List<Dish> filterDishesByCategory(List<Dish> dishes, String category) {
List<Dish> result = [];
for (var dish in dishes) {
if (dish.category == category) {
result.add(dish);
}
}
return result;
}
}
/*
class DishList extends StatelessWidget {
final String id;
final List<String> categories;
DishList({@required this.id, @required this.categories});
final MenuiServices services = new MenuiServices();
@override
Widget build(BuildContext context) {
return ListView(children: [
FutureBuilder<List<Dish>>(
future: services.fetchAllDishes(id),
builder: (BuildContext context, AsyncSnapshot<List<Dish>> snapshot) {
if (snapshot.hasData) {
final List<Dish> dishes = snapshot.data;
return ListView.builder(
controller: ScrollController(),
shrinkWrap: true,
itemCount: categories.length,
itemBuilder: (context, index) {
final filteredDishes =
filterDishesByCategory(dishes, categories[index]);
return ExpansionTile(
leading: Icon(
Icons.fastfood_rounded,
color: Colors.orange,
),
title: Text(
categories[index],
style: TextStyle(color: Colors.grey[300]),
),
children: <Widget>[
ListView.builder(
primary: false,
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemCount: filteredDishes.length,
itemBuilder: (context, index) {
return Container(
child: DishCard(dish: filteredDishes[index]),
);
},
)
],
);
},
);
} else {
return Center(
child: CircularProgressIndicator(),
);
}
}),
]);
} */

View File

@@ -0,0 +1,10 @@
/* import 'package:flutter/material.dart';
import '../services.dart'; */
/*
class MapWithMarkers extends StatelessWidget {
@override
Widget build(BuildContext context) {
return
}
}
*/

View File

@@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../services.dart'; import '../services.dart';
import 'lineOfIcons.dart'; import 'lineOfIcons.dart';
import 'dishList.dart';
class RestaurantView extends StatelessWidget { class RestaurantView extends StatelessWidget {
final String id; final String id;
@@ -10,6 +11,8 @@ class RestaurantView extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
services.fetchAllDishes(id);
List<String> categories = [];
return Scaffold( return Scaffold(
body: Container( body: Container(
decoration: BoxDecoration(color: Colors.grey[850]), decoration: BoxDecoration(color: Colors.grey[850]),
@@ -19,6 +22,7 @@ class RestaurantView extends StatelessWidget {
(BuildContext context, AsyncSnapshot<Restaurant> snapshot) { (BuildContext context, AsyncSnapshot<Restaurant> snapshot) {
if (snapshot.hasData) { if (snapshot.hasData) {
final Restaurant restaurant = snapshot.data; final Restaurant restaurant = snapshot.data;
categories = restaurant.categories;
return Column( return Column(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.stretch, crossAxisAlignment: CrossAxisAlignment.stretch,
@@ -154,11 +158,11 @@ class RestaurantView extends StatelessWidget {
floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
floatingActionButton: FloatingActionButton.extended( floatingActionButton: FloatingActionButton.extended(
onPressed: () { onPressed: () {
showMenu(context); showMenu(context, categories);
}, },
label: Text( label: Text(
'Pokaż menu', 'Menu',
style: TextStyle(color: Colors.white), style: TextStyle(color: Colors.white, fontWeight: FontWeight.w400),
), ),
icon: Icon( icon: Icon(
Icons.arrow_upward_rounded, Icons.arrow_upward_rounded,
@@ -168,17 +172,19 @@ class RestaurantView extends StatelessWidget {
)); ));
} }
showMenu(BuildContext context) { showMenu(BuildContext context, List<String> categories) {
showModalBottomSheet( if (categories.isNotEmpty) {
context: context, showModalBottomSheet(
builder: (BuildContext context) { backgroundColor: Colors.grey[850],
return Container( isScrollControlled: true,
decoration: BoxDecoration( context: context,
image: DecorationImage( builder: (BuildContext context) {
image: AssetImage("img/bg_tile.jpg"), fit: BoxFit.cover)), return DishList(
child: Text('qweqweqweqweqweqw'), categories: categories,
); id: id,
}); );
});
}
} }
} }

View File

@@ -38,6 +38,46 @@ class MenuiServices {
} }
} }
Future<List<Dish>> fetchAllDishes(String id) async {
final response =
await http.get('${backendURL}restaurant/dishes?restaurantId=$id');
if (response.statusCode != 400 &&
response.statusCode != 404 &&
response.statusCode != 500) {
final List decodedResponse = json.decode(response.body);
List<Dish> dishes = [];
if (decodedResponse.isNotEmpty && decodedResponse != null) {
for (var dish in decodedResponse) {
final thisAllergens = dish['allergens'];
final Dish thisDish = new Dish(
id: dish['_id'],
restaurantId: dish['restaurantId'],
name: dish['name'],
category: dish['category'],
price: dish['price'],
notes: dish['notes'],
imgUrl: dish['imgUrl'],
weight: dish['weight'],
ingredients: dish['ingredients'],
vegetarian: dish['vegetarian'],
vegan: dish['vegan'],
glicemicIndex: dish['glicemicIndex'],
kCal: dish['kCal'],
allergens: new MenuiAllergens(
thisAllergens['gluten'],
thisAllergens['lactose'],
thisAllergens['soy'],
thisAllergens['eggs'],
thisAllergens['seaFood'],
thisAllergens['peanuts'],
thisAllergens['sesame']));
dishes.add(thisDish);
}
}
return dishes;
}
}
Future<Restaurant> fetchRestaurant(String id) async { Future<Restaurant> fetchRestaurant(String id) async {
final response = await http.get('${backendURL}restaurant?restaurantId=$id'); final response = await http.get('${backendURL}restaurant?restaurantId=$id');
if (response.statusCode == 200 || response.statusCode == 304) { if (response.statusCode == 200 || response.statusCode == 304) {
@@ -45,6 +85,7 @@ class MenuiServices {
final workingHours = decoded['workingHours']; final workingHours = decoded['workingHours'];
final tags = decoded['tags']; final tags = decoded['tags'];
final links = decoded['links']; final links = decoded['links'];
final List<String> categories = decoded['categories'].cast<String>();
final List responseLunchMenu = decoded['lunchMenu']; final List responseLunchMenu = decoded['lunchMenu'];
List<MenuiLunchMenuSet> lunchMenu = []; List<MenuiLunchMenuSet> lunchMenu = [];
if (responseLunchMenu != null) { if (responseLunchMenu != null) {
@@ -77,7 +118,7 @@ class MenuiServices {
description: decoded['description'], description: decoded['description'],
links: new MenuiLinks( links: new MenuiLinks(
links['facebook'], links['instagram'], links['www']), links['facebook'], links['instagram'], links['www']),
categories: decoded['categories'], categories: categories,
tags: new MenuiTags( tags: new MenuiTags(
tags['cardPayments'], tags['cardPayments'],
tags['petFriendly'], tags['petFriendly'],
@@ -204,7 +245,7 @@ class Restaurant {
MenuiTags tags; MenuiTags tags;
MenuiLinks links; MenuiLinks links;
String phone; String phone;
List categories; List<String> categories;
String lunchHours; String lunchHours;
List<MenuiLunchMenuSet> lunchMenu; List<MenuiLunchMenuSet> lunchMenu;
List dishes; List dishes;