import 'dart:io'; import 'package:flutter/material.dart'; import 'package:kulinar_app/constants.dart'; import 'package:kulinar_app/models/data/recipe_data_class.dart'; import 'package:kulinar_app/models/data/settings_data_class.dart'; import 'package:kulinar_app/views/recipe_view.dart'; import 'package:kulinar_app/models/recipe_class.dart'; import 'package:kulinar_app/widgets/page_route_transitions.dart'; class RecipeCard extends StatefulWidget { const RecipeCard({Key? key, this.remote = false, this.inSearch = false, required this.recipe, this.redrawCallback, this.showToastCallback}) : super(key: key); final bool remote; final bool inSearch; final Recipe recipe; final Function? redrawCallback; final Function? showToastCallback; @override _RecipeCardState createState() => _RecipeCardState(); } class _RecipeCardState extends State { @override void dispose() { super.dispose(); } @override Widget build(BuildContext context) { return GestureDetector( onTap: _recipeCardPressed, child: Padding( padding: const EdgeInsets.only(top: 5.0, right: 5.0, left: 5.0), child: Card( elevation: 30.0, child: Padding( padding: const EdgeInsets.all(10.0), child: Column( children: [ _RecipeInfo(recipe: widget.recipe), _buildImage(), ], ), ), ), ), ); } Future _recipeCardPressed() async { await Navigator.push( context, SlideFromBottomRoute( child: RecipeView( remote: widget.remote, recipe: widget.recipe, redrawCallback: widget.redrawCallback, showToastCallback: widget.showToastCallback, ), ), ); try { if (!mounted || widget.redrawCallback == null) return; widget.redrawCallback!(); } catch (e) { print(e); } } Widget _buildImage() { if (widget.recipe.image == null) return Container(); if (SettingsData.settings["showPhotos"] == "3") return Container(); if (SettingsData.settings["showPhotos"] == "1" && !widget.inSearch) return Container(); if (SettingsData.settings["showPhotos"] == "2" && widget.inSearch) return Container(); return Padding( padding: const EdgeInsets.only(top: 10.0), child: Container( height: 200.0, decoration: BoxDecoration( borderRadius: BorderRadius.circular(5.0), image: DecorationImage( image: FileImage( File(widget.recipe.image!), ), fit: BoxFit.cover, ), ), ), ); } } class _RecipeInfo extends StatefulWidget { _RecipeInfo({Key? key, required this.recipe}) : super(key: key); final Recipe recipe; @override _RecipeInfoState createState() => _RecipeInfoState(); } class _RecipeInfoState extends State<_RecipeInfo> { @override Widget build(BuildContext context) { return Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ _buildRecipeInfo(), _buildFavortiteIcon(), ], ); } List _buildRating(int rating) { List _result = []; if (rating == 0) return _result; for (int i = 0; i < 5; i++) { _result.add(rating >= 1 ? Icon(Icons.star_rounded) : Icon(Icons.star_border_rounded)); rating--; } return _result; } Widget _buildRecipeInfo() { return Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.all(2.0), child: Text( widget.recipe.title!, style: cRecipeTitleStyle, overflow: TextOverflow.ellipsis, ), ), Padding( padding: const EdgeInsets.only(bottom: 2.0, left: 2.0), child: Text( widget.recipe.description!, style: cRecipeDescriptionStyle, overflow: TextOverflow.ellipsis, maxLines: 1, ), ), Padding( padding: const EdgeInsets.only(bottom: 2.0), child: Row( children: _buildRating(widget.recipe.rating), ), ), ], ), ); } Widget _buildFavortiteIcon() { return IconButton( icon: widget.recipe.favorite ? Icon(Icons.favorite_rounded, color: Colors.red) : Icon(Icons.favorite_border_rounded), onPressed: () { widget.recipe.toggleFavorite(); RecipeData.save(); setState(() {}); }, ); } }