APP_NEW/lib/Page/Service/product_page.dart
2025-03-11 21:17:14 +08:00

169 lines
5.1 KiB
Dart

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:lamiter/Class/Diagnosis/diagnosis.dart';
import 'package:lamiter/Class/Service/product.dart';
import 'package:lamiter/Component/AppBar/title_app_bar.dart';
import 'package:lamiter/Component/Service/service_items_filter.dart';
import 'package:lamiter/Component/refresh_indicator.dart';
import 'package:lamiter/Extension/build_context.dart';
import 'package:lamiter/Extension/iterable.dart';
import 'package:lamiter/Provider/Language/language_provider.dart';
import 'package:lamiter/Provider/Service/product_provider.dart';
import 'package:provider/provider.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class ProductPage extends StatefulWidget {
final Diagnosis? diagnosis;
const ProductPage({
super.key,
this.diagnosis,
});
@override
State<ProductPage> createState() => _ProductPageState();
}
class _ProductPageState extends State<ProductPage> {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
context.read<ProductProvider>().start(context, widget.diagnosis);
});
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () => FocusManager.instance.primaryFocus?.unfocus(),
child: Scaffold(
appBar: TitleAppBar(
title: AppLocalizations.of(context).product,
shadowColor: Colors.transparent,
),
body: Stack(
alignment: Alignment.topCenter,
children: [
SafeArea(
bottom: false,
child: Column(
children: [
const ServiceItemsFilter<ProductProvider>(),
_ProductListLayout(),
],
),
),
],
),
),
);
}
}
class _ProductListLayout extends StatelessWidget {
@override
Widget build(BuildContext context) {
final List<Product> companiesProducts =
context.select<ProductProvider, List<Product>>((provider) =>
provider.filtedList!.map((e) => e as Product).toList());
return Expanded(
child: MyRefreshIndicator(
onRefresh: () async {},
children: companiesProducts.isEmpty
? [
Container(
padding: EdgeInsets.only(top: 16.sp),
alignment: Alignment.topCenter,
child: Text(
AppLocalizations.of(context).no_related_product,
style: context.bL!.copyWith(color: context.inversePrimary),
),
)
]
: [
SizedBox(
width: context.width(1),
child: Wrap(
children:
List.generate(companiesProducts.length, (index) {
return _ProductUnitLayout(
index: index,
product: companiesProducts[index],
);
})),
),
],
),
);
}
}
class _ProductUnitLayout extends StatelessWidget {
final int index;
final Product product;
const _ProductUnitLayout({
required this.index,
required this.product,
});
@override
Widget build(BuildContext context) {
final languageProvider = Provider.of<LanguageProvider>(context);
return Column(
children: [
Container(
width: context.width(0.5),
height: context.width(0.5 * 4 / 3),
alignment: Alignment.bottomCenter,
decoration: BoxDecoration(
image: DecorationImage(
fit: BoxFit.cover,
image: MemoryImage(base64Decode(product.image)),
),
),
),
Container(
width: context.width(0.5),
padding: EdgeInsets.symmetric(horizontal: 6.sp),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
languageProvider.getLocaleString(product.productCategoryName),
style: context.lS),
Row(
children: [
Text('', style: TextStyle(fontSize: 7.sp)),
Text(languageProvider.getLocaleString(product.companyName),
style: context.lS),
],
),
],
),
),
Container(
width: context.width(0.5),
padding: EdgeInsets.symmetric(horizontal: 6.sp),
child: Text(
languageProvider.getLocaleString(product.name),
style: TextStyle(fontSize: 13.sp, fontWeight: FontWeight.w700),
),
),
Container(
width: context.width(0.5),
padding: EdgeInsets.symmetric(horizontal: 6.sp),
child: Text('CN¥ ${product.price.toString()}', style: context.lL),
),
]
.firstPadding(EdgeInsets.only(bottom: 6.sp))
.lastPadding(EdgeInsets.only(bottom: 18.sp))
.separator(SizedBox(height: 3.sp))
.toList(),
);
}
}