Aidra Driver 1.3.5+68
Aidra Driver - Your path to green energy
Loading...
Searching...
No Matches
elearning_screen.dart
Go to the documentation of this file.
1import 'package:aidra_drive/core/ui/theme/color_palette.dart';
2import 'package:aidra_drive/core/ui/widgets/logo_header.dart';
3import 'package:flutter/material.dart';
4import 'package:flutter_bloc/flutter_bloc.dart';
5import 'package:flutter_screenutil/flutter_screenutil.dart';
6import 'package:go_router/go_router.dart';
7
8import '../../../../core/router/routes.dart';
9import '../../../../core/ui/widgets/custom_scaffold.dart';
10import '../../../../core/ui/widgets/faild_to_fetch_data_view.dart';
11import '../../domain/entities/course_entity.dart';
12import '../logic/cubit/elearning_v2_cubit.dart';
13import '../widgets/course_card.dart';
14
16 const ElearningScreen({super.key});
17
18 @override
19 State<ElearningScreen> createState() => _ElearningScreenState();
20}
21
22class _ElearningScreenState extends State<ElearningScreen> {
23 @override
24 void initState() {
25 super.initState();
27 }
29 void _loadCourses() {
30 context.read<ElearningV2Cubit>().loadCourses();
31 }
32
33 @override
34 Widget build(BuildContext context) {
35 return BlocBuilder<ElearningV2Cubit, ElearningV2State>(
36 builder: (context, state) {
37 return CustomScaffold(
38 isLeadingVisible: false,
39 backgroundColor: ColorPalette.antiFlashWhite,
40 isLoading: state is LoadingCoursesState,
41 body: SafeArea(
42 child: _buildBody(state),
43 ),
44 );
45 },
46 );
47 }
48
50 if (state is CoursesLoadedState) {
51 return _buildCoursesGrid(state.courses);
52 } else if (state is CoursesLoadingFailureState) {
53 return FailedToFetchDataView(
54 onRetry: _loadCourses,
55 );
56 } else {
57 return const SizedBox();
58 }
59 }
60
61 Widget _buildCoursesGrid(List<CourseEntity> courses) {
62 return Padding(
63 padding: EdgeInsets.symmetric(horizontal: 16.r),
65 crossAxisAlignment: CrossAxisAlignment.start,
66 children: [
67 LogoHeader(title: 'E-Learning'),
68 Image.asset('assets/images/banner_2.png'),
69 SizedBox(height: 10.sp),
70 Expanded(
71 child: courses.isEmpty
72 ? Center(
73 child: Text(
74 'No courses available',
75 style: Theme.of(context).textTheme.bodySmall,
76 ),
77 )
78 : GridView.builder(
79 gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
80 crossAxisCount: 2,
81 crossAxisSpacing: 12.r,
82 mainAxisSpacing: 12.r,
83 childAspectRatio: 0.78,
84 ),
85 itemCount: courses.length,
86 itemBuilder: (context, index) {
87 final CourseEntity course = courses[index];
88 return CourseCard(
89 course: course,
90 onTap: () {
91 context.push(
92 Routes.courseDetailsScreen.route,
93 extra: course.id,
94 ).then((_) {
95 _loadCourses();
96 });
97 },
98 );
99 },
100 ),
101 ),
102 SizedBox(height: 10.sp),
103 ],
104 ),
105 );
106 }
107}
override void initState()
class App extends StatefulWidget build(BuildContext context)
Definition app.dart:31
bool isLoading
static const antiFlashWhite
const ElearningScreen({super.key})
override State< ElearningScreen > createState()
final Widget child
final EdgeInsets padding
Widget _buildBody()
const ElearningScreen({super.key})
Widget _buildCoursesGrid(List< CourseEntity > courses)
void _loadCourses()
abstract class ElearningV2State extends Equatable courses
const CoursesLoadedState(this.courses)
final String title
style Text( '${ 'scheduling.reference'.tr()}:${collection.internalCode}', style:Theme.of(context).textTheme.bodySmall,)
style SizedBox(height:2.h)
style Column(crossAxisAlignment:CrossAxisAlignment.end, children:[Container(padding:EdgeInsets.symmetric(horizontal:8.w, vertical:4.h), decoration:BoxDecoration(color:ColorPalette.tiffanyBlue.withValues(alpha:0.1), borderRadius:BorderRadius.circular(12),), child:Text(collection.type ?? '', style:Theme.of(context).textTheme.bodySmall?.copyWith(color:ColorPalette.tiffanyBlue, fontWeight:FontWeight.bold,),),),],)