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

185 lines
5.7 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/treatment.dart';
import 'package:lamiter/Component/AppBar/title_app_bar.dart';
import 'package:lamiter/Component/Button/my_text_button.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/treatment_provider.dart';
import 'package:provider/provider.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class TreatmentPage extends StatefulWidget {
final Diagnosis? diagnosis;
const TreatmentPage({
super.key,
this.diagnosis,
});
@override
State<TreatmentPage> createState() => _TreatmentPageState();
}
class _TreatmentPageState extends State<TreatmentPage> {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
context.read<TreatmentProvider>().start(context, widget.diagnosis);
});
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () => FocusManager.instance.primaryFocus?.unfocus(),
child: Scaffold(
appBar: TitleAppBar(
title: AppLocalizations.of(context).treatment,
shadowColor: Colors.transparent,
),
body: Stack(
alignment: Alignment.topCenter,
children: [
SafeArea(
bottom: false,
child: Column(
children: [
const ServiceItemsFilter<TreatmentProvider>(),
_TreatmentListLayout(),
],
),
),
],
),
),
);
}
}
class _TreatmentListLayout extends StatelessWidget {
@override
Widget build(BuildContext context) {
final List<Treatment> companiesTreatments =
context.select<TreatmentProvider, List<Treatment>>((provider) =>
provider.filtedList!.map((e) => e as Treatment).toList());
return Expanded(
child: MyRefreshIndicator(
onRefresh: () async {},
children: companiesTreatments.isEmpty
? [
Container(
padding: EdgeInsets.only(top: 16.sp),
alignment: Alignment.topCenter,
child: Text(
AppLocalizations.of(context).no_related_treatment,
style: context.bL!.copyWith(color: context.inversePrimary),
),
)
]
: [
SizedBox(
width: context.width(1),
child: Column(
children: List.generate(
companiesTreatments.length,
(index) {
return _TreatmentUnitLayout(
index: index,
companyName: companiesTreatments[index].companyName,
treatment: companiesTreatments[index],
);
},
)
.separator(SizedBox(
height: 54.sp,
))
.toList(),
),
),
],
),
);
}
}
class _TreatmentUnitLayout extends StatelessWidget {
final int index;
final String companyName;
final Treatment treatment;
const _TreatmentUnitLayout({
required this.index,
required this.companyName,
required this.treatment,
});
@override
Widget build(BuildContext context) {
final languageProvider = Provider.of<LanguageProvider>(context);
return Column(
children: [
Container(
width: context.width(1),
height: context.width(1),
alignment: Alignment.bottomCenter,
decoration: BoxDecoration(
image: DecorationImage(
fit: BoxFit.cover,
image: MemoryImage(base64Decode(treatment.image)),
),
),
),
Column(
children: [
Container(
width: context.width(1),
padding: EdgeInsets.symmetric(horizontal: 27.sp),
child: Text(
languageProvider.getLocaleString(treatment.name),
style: TextStyle(
fontSize: 13.sp,
fontWeight: FontWeight.bold,
color: context.inverseSurface.withOpacity(0.75),
),
textAlign: TextAlign.justify,
),
),
Container(
width: context.width(1),
padding: EdgeInsets.symmetric(horizontal: 27.sp),
child: Text(
languageProvider.getLocaleString(treatment.description),
style: TextStyle(
fontSize: 13.sp,
fontWeight: FontWeight.normal,
color: context.inverseSurface.withOpacity(0.85),
),
textAlign: TextAlign.justify,
),
),
].separator(SizedBox(height: 6.sp)).toList(),
),
MyTextButton(
width: context.width(0.4),
height: 36.sp,
text: AppLocalizations.of(context).sign_up_now,
fontSize: 13.sp,
enabled: true,
),
]
.firstPadding(EdgeInsets.only(bottom: 3.sp))
.separator(SizedBox(height: 18.sp))
.toList(),
);
}
}