Aidra Connect 10.0.2+16
Aidra Connect Mobile Application
Loading...
Searching...
No Matches
elearning_v2_screen.dart
Go to the documentation of this file.
1import 'package:connect/core/localization/app_localizations.dart';
2import 'package:connect/core/router/routes.dart';
3import 'package:connect/features/elearning_v2/domain/entities/course_entity.dart';
4import 'package:flutter/material.dart';
5import 'package:flutter_bloc/flutter_bloc.dart';
6import 'package:flutter_screenutil/flutter_screenutil.dart';
7import 'package:go_router/go_router.dart';
8
9import '../../../../core/ui/screens/views/faild_to_fetch_data_view.dart';
10import '../../../../core/ui/widgets/custom_scaffold.dart';
11import '../logic/cubit/elearning_v2_cubit.dart';
12import '../widgets/course_card.dart';
13
15 const ElearningV2Screen({super.key});
16
17 @override
18 State<ElearningV2Screen> createState() => _ElearningV2ScreenState();
19}
20
21class _ElearningV2ScreenState extends State<ElearningV2Screen> {
22 @override
23 void initState() {
24 super.initState();
26 }
28 void _loadCourses() {
29 context.read<ElearningV2Cubit>().loadCourses();
30 }
31
32 @override
33 Widget build(BuildContext context) {
34 return BlocBuilder<ElearningV2Cubit, ElearningV2State>(
35 builder: (context, state) {
36 return CustomScaffold(
37 title: AppLocalizations.of(context).translate('E-Learning'),
38 isLoading: state is LoadingCoursesState,
39 isLeadingVisible: false,
40 body: SafeArea(
41 child: _buildBody(state),
42 ),
43 );
44 },
45 );
46 }
47
49 if (state is CoursesLoadedState) {
50 return _buildCoursesGrid(state.courses);
51 } else if (state is CoursesLoadingFailureState) {
52 return FailedToFetchDataView(
53 onRetry: _loadCourses,
54 );
55 } else {
56 return const SizedBox();
57 }
58 }
59
61 return Padding(
62 padding: EdgeInsets.all(16.r),
63 child: Column(
64 crossAxisAlignment: CrossAxisAlignment.start,
65 children: [
66 Image.asset('assets/images/banner4.png'),
67 SizedBox(height: 10.sp),
68 Expanded(
69 child: courses.isEmpty
70 ? Center(
71 child: Text(
72 AppLocalizations.of(context)
73 .translate('No courses available'),
74 style: Theme.of(context).textTheme.bodySmall,
75 ),
76 )
77 : GridView.builder(
78 gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
79 crossAxisCount: 2,
80 crossAxisSpacing: 12.r,
81 mainAxisSpacing: 12.r,
82 childAspectRatio: 0.78,
83 ),
84 itemCount: courses.length,
85 itemBuilder: (context, index) {
86 final CourseEntity course = courses[index];
87 return CourseCard(
88 course: course,
89 onTap: () {
90 context
91 .push(
92 Routes.courseDetailsScreen.route,
93 extra: course.id,
94 )
95 .then((_) {
96 _loadCourses();
97 });
98 },
99 );
100 },
101 ),
102 ),
103 ],
104 ),
105 );
106 }
107}
String translate(String key)
static AppLocalizations of(BuildContext context)
override State< ElearningV2Screen > createState()
const ElearningV2Screen({super.key})
Widget _buildBody(ElearningV2State state)
final Widget child
final EdgeInsets padding
override void initState()
void _loadCourses()
const ElearningV2Screen({super.key})
Widget _buildCoursesGrid(courses)
abstract class ElearningV2State extends Equatable courses
const CoursesLoadedState(this.courses)
override Widget build(BuildContext context)
final String title