基本完成

This commit is contained in:
zhutao
2025-08-28 16:27:56 +08:00
commit 5d7d233d2e
132 changed files with 6390 additions and 0 deletions

View File

@@ -0,0 +1,27 @@
import 'package:flutter/material.dart';
class AppBackend extends StatelessWidget {
final Widget child;
const AppBackend({super.key, required this.child});
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
padding: EdgeInsets.all(15),
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Color(0xffdff8fb),
Color(0xffffffff),
Color(0xffdff8fb),
],
),
),
child: SafeArea(child: child),
);
}
}

View File

@@ -0,0 +1,43 @@
import 'package:flutter/material.dart';
class AppHeader extends StatefulWidget {
const AppHeader({super.key});
@override
State<AppHeader> createState() => _AppHeaderState();
}
class _AppHeaderState extends State<AppHeader> {
@override
Widget build(BuildContext context) {
return SafeArea(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
spacing: 10,
children: [
Image.asset(
"assets/image/logo.png",
width: 44,
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"FoodSafe",
style: TextStyle(fontWeight: FontWeight.bold),
),
Text(
"AI Health Guardian",
style: Theme.of(context).textTheme.labelSmall,
),
],
),
],
),
],
),
);
}
}

View File

@@ -0,0 +1,45 @@
import 'package:flutter/material.dart';
class AsyncImage extends StatelessWidget {
final String url;
final double? width;
const AsyncImage({
super.key,
required this.url,
this.width,
});
@override
Widget build(BuildContext context) {
return SizedBox(
width: width,
child: Image.network(
url,
fit: BoxFit.cover,
// 加载中的样式
loadingBuilder: (context, child, loadingProgress) {
if (loadingProgress == null) {
return child; // 加载完成,直接返回图片
}
return Container(
color: Colors.grey[200],
alignment: Alignment.center,
child: CircularProgressIndicator(strokeWidth: 2),
);
},
// 加载失败的样式
errorBuilder: (context, error, stackTrace) {
return Container(
color: Colors.grey[200],
child: const Icon(
Icons.broken_image,
size: 30,
color: Colors.grey,
),
);
},
),
);
}
}