Files
Vocasia-LMS-Mobile-apps--TA…/lib/screens/home/components/home_page.dart

280 lines
12 KiB
Dart

import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'package:initial_folder/base_service.dart';
import 'package:initial_folder/providers/banners_provider.dart';
import 'package:initial_folder/providers/carts_provider.dart';
import 'package:initial_folder/providers/categories_provider.dart';
import 'package:initial_folder/providers/course_by_category_provider.dart';
import 'package:initial_folder/providers/detail_course_provider.dart';
import 'package:initial_folder/providers/latest_course_provider.dart';
import 'package:initial_folder/providers/lesson_course_provider.dart';
import 'package:initial_folder/providers/others_course_provider.dart';
import 'package:initial_folder/providers/promo_course_provider.dart';
import 'package:initial_folder/providers/promo_course_provider.dart' as promo;
import 'package:initial_folder/providers/top_course_provider.dart';
import 'package:initial_folder/screens/cart/cart_page.dart';
import 'package:initial_folder/screens/course/play_course_page.dart';
import 'package:initial_folder/screens/home/components/appBar/home_header.dart';
import 'package:initial_folder/screens/home/components/body_comp/certificate_voucher.dart';
import 'package:initial_folder/screens/home/components/body_comp/course_by_category.dart';
import 'package:initial_folder/screens/home/components/body_comp/home_categories.dart';
import 'package:initial_folder/screens/home/components/body_comp/latest_course.dart';
import 'package:initial_folder/screens/home/components/body_comp/lihat_semua_kategori.dart';
import 'package:initial_folder/screens/home/components/body_comp/populer_course.dart';
import 'package:initial_folder/screens/home/components/body_comp/promo_course.dart';
import 'package:initial_folder/services/categories_service.dart';
import 'package:initial_folder/services/course_by_category_service.dart';
import 'package:initial_folder/services/course_service.dart';
import 'package:initial_folder/services/lesson_course_service.dart';
import 'package:provider/provider.dart';
import '../../../size_config.dart';
import '../../../theme.dart';
import 'body_comp/others_course.dart';
import 'body_comp/carousel.dart';
class HomePage extends StatefulWidget {
static String routeName = "/homepage";
HomePage({
Key? key,
}) : super(key: key);
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
ScrollController _controller = ScrollController();
GlobalKey<NavigatorState> homeKey = GlobalKey<NavigatorState>();
@override
void initState() {
WidgetsBinding.instance.addPostFrameCallback((_) {
Provider.of<CartsProvider>(context, listen: false).getCarts();
});
_controller.addListener(() {
onScrol();
});
super.initState();
FirebaseMessaging.instance.getInitialMessage().then((message) {
if (message?.data['route'] == "/cart") {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => CartPage(),
));
} else if (message?.data['route'] == "/play_course") {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => MultiProvider(
providers: [
ChangeNotifierProvider(
create: (context) => LessonCourseProvider(
lessonCourseService: LessonCourseService(),
id: int.parse(message?.data['id_course'] ?? '0'),
),
),
ChangeNotifierProvider(
create: (context) => DetailCourseProvider(
courseService: CourseService(),
id: message?.data['id_course'] ?? '1'))
],
child: PlayCourse(
judul: message?.data['title'] ?? '',
instruktur: message?.data['instructur_name'] ?? '',
thumbnail: message?.data['thumbnail'] ??
'$baseUrl/uploads/courses_thumbnail/course_thumbnail_default_57.jpg',
courseeid: message?.data['id_course'] ?? '',
isQna: true,
),
),
),
);
}
});
}
void onScrol() async {
double maxScroll = _controller.position.maxScrollExtent;
double currentScroll = _controller.position.pixels;
if (maxScroll == currentScroll) {
await Provider.of<OthersCourseProvider>(context, listen: false)
.getOthersCourses();
}
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
void onRefresh() async {
Provider.of<OthersCourseProvider>(context, listen: false)
.getOthersCourses();
Provider.of<BannersProvider>(context, listen: false).getAllBanners();
Provider.of<PromoCourseProvider>(context, listen: false).getPromoCourse();
Provider.of<TopCourseProvider>(context, listen: false).getTopCourse();
Provider.of<LatestCourseProvider>(context, listen: false).getLatestCourse();
Provider.of<OthersCourseProvider>(context, listen: false).getOthersCourse();
setState(() {
print('Reloading page...');
});
}
@override
Widget build(BuildContext context) {
if (_controller.hasClients) {
if (_controller.position.pixels != _controller.position.maxScrollExtent) {
_controller.animateTo(0,
duration: Duration(milliseconds: 900), curve: Curves.linear);
}
}
return Navigator(
key: homeKey,
onGenerateRoute: (RouteSettings settings) {
return MaterialPageRoute(
settings: settings,
builder: (BuildContext context) {
if (settings.name == '/lihatSemuaKategori') {
return LihatSemuaKategori();
}
return Container(
color: Theme.of(context).colorScheme.background,
child: SafeArea(
child: Scaffold(
backgroundColor: Theme.of(context).colorScheme.background,
appBar: PreferredSize(
preferredSize:
Size.fromHeight(getProportionateScreenHeight(60)),
child: HomeHeader(),
),
body: RefreshIndicator(
onRefresh: () async {
setState(() {
print('loding test');
onRefresh();
});
},
child: ListView(
controller: _controller,
children: [
SizedBox(height: getProportionateScreenHeight(10)),
// Stack(
// children: [
// // Container(
// // height: getProportionateScreenWidth(140),
// // decoration: BoxDecoration(
// // image: DecorationImage(
// // image: AssetImage('assets/images/VectorBG.png'),
// // fit: BoxFit.fill,
// // alignment: AlignmentDirectional.topCenter,
// // ),
// // ),
// // ),
// Container(
// padding: EdgeInsets.fromLTRB(
// getProportionateScreenWidth(18.0),
// getProportionateScreenWidth(11.5),
// 0,
// 0),
// child: Begin()),
// SizedBox(height: getProportionateScreenWidth(24)),
// Container(
// // padding:
// // EdgeInsets.only(top: getProportionateScreenWidth(110)),
// //height: getProportionateScreenWidth(33),
// alignment: Alignment.bottomCenter,
// child: SearchField(),
// ),
// ],
// ),
// Container(
// padding: EdgeInsets.fromLTRB(getProportionateScreenWidth(18.0),
// getProportionateScreenWidth(11.5), 0, 0),
// child: Begin()),
// SizedBox(height: getProportionateScreenWidth(36)),
//SearchField(),
// SizedBox(height: getProportionateScreenWidth(12)),
CarouselWithIndicatorDemo(),
// Padding(
// padding: EdgeInsets.symmetric(
// horizontal: getProportionateScreenWidth(14)),
// child: Center(child: GopayVoucher()),
// ),
// SizedBox(height: 18),
// Program(),
HomeCategories(),
Padding(
padding: EdgeInsets.symmetric(
horizontal: getProportionateScreenWidth(14)),
child: CertificateVoucher(),
),
SizedBox(height: getProportionateScreenHeight(19)),
// Padding(
// padding: EdgeInsets.symmetric(
// horizontal: getProportionateScreenWidth(20)),
// child:
// Row(mainAxisAlignment: MainAxisAlignment.start, children: [
// Text('Pencarian Terpopuler',
// textAlign: TextAlign.left,
// style: secondaryTextStyle.copyWith(
// letterSpacing: 1,
// color: tenthColor,
// fontSize: getProportionateScreenWidth(14),
// fontWeight: semiBold)),
// ]),
// ),
// SizedBox(height: 10),
// Categories(),
Consumer<PromoCourseProvider>(
builder: (context, promoState, _) {
SizedBox(height: 20);
return promoState.state == promo.ResultState.HasData
? PromoCourse(text: "Promo")
: SizedBox();
},
),
SizedBox(height: 20),
PopulerCourse(text: "Kursus Teratas"),
LatestCourse(text: "Kursus Terbaru"),
SizedBox(height: getProportionateScreenHeight(25)),
OthersCourse(),
Provider.of<OthersCourseProvider>(context).loading
? Center(
child: SizedBox(
height: 30,
width: 30,
child: CircularProgressIndicator(
color: secondaryColor,
strokeWidth: 2,
),
),
)
: SizedBox(height: 30),
SizedBox(height: 25),
// ChangeNotifierProvider<CourseProvider>.value(
// value: CourseProvider(courseService: CourseService()),
// child: Course()),
// Recommendation(),
],
),
),
),
),
);
},
);
},
);
}
}