MoodCanvas/lib/screens/home/gallery_screen.dart
fengshengxiong 91b7eebbf2 接入TopON
2026-01-22 16:34:55 +08:00

255 lines
9.4 KiB
Dart

import 'package:aesthetica_wallpaper/providers/editor_provider.dart';
import 'package:aesthetica_wallpaper/providers/recipe_provider.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:aesthetica_wallpaper/models/image_category.dart';
import 'package:aesthetica_wallpaper/models/recipe.dart';
class GalleryScreen extends StatelessWidget {
const GalleryScreen({super.key});
@override
Widget build(BuildContext context) {
// 从路由参数中获取分类数据
final category =
ModalRoute.of(context)!.settings.arguments as ImageCategory;
return Scaffold(
backgroundColor: Colors.black,
appBar: AppBar(
title: Text(
category.name,
style: const TextStyle(
color: Colors.white,
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
backgroundColor: Colors.grey[900],
elevation: 0,
iconTheme: const IconThemeData(color: Colors.white),
),
body: Column(
children: [
// 分类信息卡片
Container(
width: double.infinity,
margin: const EdgeInsets.all(16),
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
gradient: const LinearGradient(
colors: [Colors.pinkAccent, Colors.purpleAccent],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
borderRadius: BorderRadius.circular(16),
),
child: Row(
children: [
Container(
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: Colors.white.withValues(alpha: 0.2),
borderRadius: BorderRadius.circular(12),
),
child: const Icon(Icons.image, color: Colors.white, size: 24),
),
const SizedBox(width: 16),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
category.name,
style: const TextStyle(
color: Colors.white,
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 4),
Text(
'${category.images.length} wallpapers available',
style: TextStyle(
color: Colors.white.withValues(alpha: 0.8),
fontSize: 14,
),
),
],
),
),
],
),
),
// 图片网格
Expanded(
child: GridView.builder(
padding: const EdgeInsets.symmetric(horizontal: 16),
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
crossAxisSpacing: 12,
mainAxisSpacing: 12,
childAspectRatio: 0.85, // 调整宽高比,让图片更方正
),
itemCount: category.images.length,
itemBuilder: (context, index) {
final imageName = category.images[index];
final imagePath = category.getImagePath(imageName);
return Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(16),
boxShadow: [
BoxShadow(
color: Colors.black.withValues(alpha: 0.3),
blurRadius: 8,
offset: const Offset(0, 4),
),
],
),
child: ClipRRect(
borderRadius: BorderRadius.circular(16),
child: Stack(
fit: StackFit.expand,
children: [
// 图片
Image.asset(imagePath, fit: BoxFit.cover),
// 渐变蒙版
Container(
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [
Colors.transparent,
Colors.black.withValues(alpha: 0.3),
],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
),
),
),
// 点击区域
Positioned.fill(
child: InkWell(
onTap: () {
Provider.of<EditorProvider>(
context,
listen: false,
).startEditing(imagePath);
Navigator.pushNamed(context, '/editor');
},
borderRadius: BorderRadius.circular(16),
),
),
// 收藏按钮
Positioned(
top: 8,
right: 8,
child: Consumer<RecipeProvider>(
builder: (context, recipeProvider, child) {
final isFavorited = recipeProvider.recipes.any(
(recipe) => recipe.baseImagePath == imagePath,
);
return GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () => _toggleFavorite(
context,
imagePath,
recipeProvider,
),
child: Container(
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
color: Colors.black.withValues(alpha: 0.6),
shape: BoxShape.circle,
),
child: Icon(
isFavorited
? Icons.favorite
: Icons.favorite_border,
color: isFavorited
? Colors.pinkAccent
: Colors.white,
size: 18,
),
),
);
},
),
),
// 图片序号
Positioned(
bottom: 8,
left: 8,
child: Container(
padding: const EdgeInsets.symmetric(
horizontal: 8,
vertical: 4,
),
decoration: BoxDecoration(
color: Colors.black.withValues(alpha: 0.6),
borderRadius: BorderRadius.circular(12),
),
child: Text(
'${index + 1}',
style: const TextStyle(
color: Colors.white,
fontSize: 12,
fontWeight: FontWeight.bold,
),
),
),
),
],
),
),
);
},
),
),
],
),
);
}
// 切换收藏状态
void _toggleFavorite(
BuildContext context,
String imagePath,
RecipeProvider recipeProvider,
) {
final existingRecipe = recipeProvider.recipes.firstWhere(
(recipe) => recipe.baseImagePath == imagePath,
orElse: () => Recipe(id: '', baseImagePath: ''),
);
if (existingRecipe.id.isEmpty) {
// 创建新的收藏
final newRecipe = Recipe(
id: DateTime.now().millisecondsSinceEpoch.toString(),
baseImagePath: imagePath,
);
recipeProvider.addRecipe(newRecipe);
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('Added to favorites!'),
backgroundColor: Colors.green,
duration: Duration(seconds: 2),
),
);
} else {
// 取消收藏
recipeProvider.deleteRecipe(existingRecipe.id);
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('Removed from favorites'),
backgroundColor: Colors.orange,
duration: Duration(seconds: 2),
),
);
}
}
}