feat(): navigate to meals'es category + meal card

feat/state-management
Alysson 2 years ago
parent 3c94b603a5
commit 083a617c95

@ -40,4 +40,13 @@ class Meal {
final bool isLactoseFree; final bool isLactoseFree;
final bool isVegan; final bool isVegan;
final bool isVegetarian; final bool isVegetarian;
String get beautifulComplexity {
return complexity.name[0].toUpperCase() + complexity.name.substring(1);
}
String get beautifulAffordability {
return affordability.name[0].toUpperCase() +
affordability.name.substring(1);
}
} }

@ -1,9 +1,24 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:meals/data/dummy_categories.dart'; import 'package:meals/data/dummy_categories.dart';
import 'package:meals/models/Category.dart';
import 'package:meals/models/Meal.dart';
import 'package:meals/screens/MealsScreen.dart';
import 'package:meals/widgets/CategoryGridItem.dart'; import 'package:meals/widgets/CategoryGridItem.dart';
class CategoriesScreen extends StatelessWidget { class CategoriesScreen extends StatelessWidget {
const CategoriesScreen({Key? key}); const CategoriesScreen({super.key});
void _selectCategory(BuildContext context, Category category) {
final meals = dummyMeals
.where((Meal meal) => meal.categories.contains(category.id))
.toList();
Navigator.push(
context,
MaterialPageRoute(
builder: (ctx) =>
MealsScreen(title: category.title, meals: meals)));
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -21,7 +36,14 @@ class CategoriesScreen extends StatelessWidget {
), ),
children: [ children: [
for (final category in availableCategories) for (final category in availableCategories)
CategoryGridItem(category: category) CategoryGridItem(
category: category,
onClickCallback: () {
_selectCategory(
context,
category,
);
})
]), ]),
); );
} }

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:meals/models/Meal.dart'; import 'package:meals/models/Meal.dart';
import 'package:meals/widgets/MealItem.dart';
class MealsScreen extends StatelessWidget { class MealsScreen extends StatelessWidget {
final String title; final String title;
@ -33,7 +34,7 @@ class MealsScreen extends StatelessWidget {
) )
: ListView.builder( : ListView.builder(
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return Text(meals[index].title); return MealItem(meal: meals[index]);
}, },
itemCount: meals.length, itemCount: meals.length,
); );

@ -3,13 +3,15 @@ import 'package:meals/models/Category.dart';
class CategoryGridItem extends StatelessWidget { class CategoryGridItem extends StatelessWidget {
final Category category; final Category category;
final void Function() onClickCallback;
const CategoryGridItem({super.key, required this.category}); const CategoryGridItem(
{super.key, required this.category, required this.onClickCallback});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return InkWell( return InkWell(
onTap: () {}, onTap: onClickCallback,
borderRadius: BorderRadius.circular(8), borderRadius: BorderRadius.circular(8),
child: Container( child: Container(
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),

@ -0,0 +1,75 @@
import 'package:flutter/material.dart';
import 'package:meals/models/Meal.dart';
import 'package:meals/widgets/meal_item%20treat.dart';
import 'package:transparent_image/transparent_image.dart';
class MealItem extends StatelessWidget {
final Meal meal;
const MealItem({Key? key, required this.meal}) : super(key: key);
@override
Widget build(BuildContext context) {
return Card(
margin: const EdgeInsets.all(8),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
clipBehavior: Clip.hardEdge,
elevation: 2,
child: InkWell(
onTap: () {},
child: Stack(
children: [
FadeInImage(
placeholder: MemoryImage(kTransparentImage),
image: NetworkImage(meal.imageUrl),
fit: BoxFit.cover,
height: 200,
width: double.infinity,
),
Positioned(
bottom: 0,
left: 0,
right: 0,
child: Container(
color: Colors.black54,
padding:
const EdgeInsets.symmetric(vertical: 6, horizontal: 44),
child: Column(
children: [
Text(
meal.title,
maxLines: 2,
textAlign: TextAlign.center,
softWrap: true,
overflow: TextOverflow.ellipsis,
style: const TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
const SizedBox(
height: 24,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
MealItemTreat(
icon: Icons.schedule,
label: '${meal.duration} mins.'),
MealItemTreat(
icon: Icons.work, label: meal.beautifulComplexity),
MealItemTreat(
icon: Icons.attach_money,
label: meal.beautifulAffordability),
],
)
],
),
),
),
],
),
),
);
}
}

@ -0,0 +1,22 @@
import 'package:flutter/material.dart';
class MealItemTreat extends StatelessWidget {
final IconData icon;
final String label;
const MealItemTreat({Key? key, required this.icon, required this.label})
: super(key: key);
@override
Widget build(BuildContext context) {
return Row(
children: [
Icon(icon, size: 17, color: Colors.white),
const SizedBox(width: 6),
Text(
label,
style: const TextStyle(color: Colors.white),
)
],
);
}
}

@ -296,6 +296,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.4.16" version: "0.4.16"
transparent_image:
dependency: "direct main"
description:
name: transparent_image
sha256: e8991d955a2094e197ca24c645efec2faf4285772a4746126ca12875e54ca02f
url: "https://pub.dev"
source: hosted
version: "2.0.1"
typed_data: typed_data:
dependency: transitive dependency: transitive
description: description:

@ -36,6 +36,7 @@ dependencies:
# Use with the CupertinoIcons class for iOS style icons. # Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.2 cupertino_icons: ^1.0.2
google_fonts: ^4.0.3 google_fonts: ^4.0.3
transparent_image: ^2.0.1
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:

Loading…
Cancel
Save