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

180 lines
5.4 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/course.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/course_provider.dart';
import 'package:provider/provider.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class CoursePage extends StatefulWidget {
final Diagnosis? diagnosis;
const CoursePage({
super.key,
this.diagnosis,
});
@override
State<CoursePage> createState() => _CoursePageState();
}
class _CoursePageState extends State<CoursePage> {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
context.read<CourseProvider>().start(context, widget.diagnosis);
});
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () => FocusManager.instance.primaryFocus?.unfocus(),
child: Scaffold(
appBar: TitleAppBar(
title: AppLocalizations.of(context).course,
shadowColor: Colors.transparent,
),
body: Stack(
alignment: Alignment.topCenter,
children: [
SafeArea(
bottom: false,
child: Column(
children: [
const ServiceItemsFilter<CourseProvider>(),
_CourseListLayout(),
],
),
),
],
),
),
);
}
}
class _CourseListLayout extends StatelessWidget {
@override
Widget build(BuildContext context) {
final List<Course> courses = context.select<CourseProvider, List<Course>>(
(provider) => provider.filtedList!.map((e) => e as Course).toList());
return Expanded(
child: MyRefreshIndicator(
onRefresh: () async {},
children: courses.isEmpty
? [
Container(
padding: EdgeInsets.only(top: 16.sp),
alignment: Alignment.topCenter,
child: Text(
AppLocalizations.of(context).no_related_course,
style: context.bL!.copyWith(color: context.inversePrimary),
),
)
]
: [
SizedBox(
width: context.width(1),
child: Column(
children: List.generate(
courses.length,
(index) {
return _CourseUnitLayout(
index: index,
course: courses[index],
);
},
)
.separator(SizedBox(
height: 54.sp,
))
.toList(),
),
),
],
),
);
}
}
class _CourseUnitLayout extends StatelessWidget {
final int index;
final Course course;
const _CourseUnitLayout({
required this.index,
required this.course,
});
@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(course.image)),
),
),
),
Column(
children: [
Container(
width: context.width(1),
padding: EdgeInsets.symmetric(horizontal: 27.sp),
child: Text(
languageProvider.getLocaleString(course.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(course.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(),
);
}
}