Files
food_hub_app/lib/widgets/recipe/card.dart
2025-11-23 00:02:41 +08:00

92 lines
2.6 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_common/widget/common_widget.dart';
import 'package:food_hub_app/models/recipe.dart';
import 'package:food_hub_app/widgets/common/image.dart';
class RecipeCard extends StatelessWidget {
final RecipeSummary recipe;
const RecipeCard({super.key, required this.recipe});
void navigatorToRecipeDetail(BuildContext context) {
Navigator.pushNamed(context, '/recipeDetail', arguments: {'id': recipe.id});
}
@override
Widget build(BuildContext context) {
final List<String> imageUrls =
recipe.recordList.reversed.map((record) => record.imageUrl).toList();
return CommonCard(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
CommonImage(imageUrls: imageUrls, index: 0),
SizedBox(height: 8),
GestureDetector(
onTap: () => navigatorToRecipeDetail(context),
child: _buildRecipeContent(),
),
],
),
);
}
Widget _buildRecipeContent() {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
recipe.name,
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
SizedBox(height: 5),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
_buildIconText(
icon: Icons.food_bank,
text: recipe.category,
color: Color(0xFF6A5ACD),
),
const SizedBox(width: 12),
_buildIconText(
icon: Icons.thumb_up_alt_outlined,
text: recipe.likeCount.toString(),
color: Color(0xFFDC143C),
),
const SizedBox(width: 12),
_buildIconText(
icon: Icons.star_outline,
text: recipe.favouriteCount.toString(),
color: Color(0xFF20B2AA),
),
],
)
],
);
}
// 通用图标文本组件
Widget _buildIconText({
required IconData icon,
required String text,
Color color = Colors.grey,
double iconSize = 16,
double textSize = 16,
double spacing = 2,
}) {
return Row(
children: [
Icon(icon, size: iconSize, color: color),
SizedBox(width: spacing),
Text(text, style: TextStyle(fontSize: textSize, color: color)),
],
);
}
}