Commit b9fe2174 authored by NguyenTienManh's avatar NguyenTienManh

update 16-2

parent c0c1c56e
...@@ -9,152 +9,139 @@ import '../bloc/comment_bloc.dart'; ...@@ -9,152 +9,139 @@ import '../bloc/comment_bloc.dart';
import '../model/comment_model.dart'; import '../model/comment_model.dart';
class CommentWidget extends StatelessWidget { class CommentWidget extends StatelessWidget {
//CommentWidget({Key? key}) : super(key: key);
CommentModel? commentModel; CommentModel? commentModel;
Function(CommentModel commentModel)? onData; Function(CommentModel commentModel)? onData;
CommentWidget(this.onData, {super.key}); CommentWidget(this.onData, {super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
BlocProvider.of<CommentBloc>(context).add(
RequestComment(context: context));
PageController _pageController = new PageController(); PageController _pageController = new PageController();
return return
BlocConsumer<CommentBloc, CommentState>( Container(
listener: (context, state) async {}, color: AppColors.background,
builder: (context, state) { child: Column(
return children: [
Container( Padding(
color: AppColors.background, padding: const EdgeInsets.fromLTRB(20, 0, 0, 0),
child: Column( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Padding( const Text('Nhan xet cua phu huynh',style: TextStyle(fontWeight: FontWeight.bold,fontSize: 15),),
padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), TextButton(
child: Row( child: Text('Xem Them >>'),
mainAxisAlignment: MainAxisAlignment.spaceBetween, onPressed: () {}
children: [ )
const Text('Nhan xet cua phu huynh',style: TextStyle(fontWeight: FontWeight.bold,fontSize: 15),), ],
TextButton( ),
child: Text('Xem Them >>'), ),
onPressed: () { BlocBuilder<CommentBloc, CommentState>(
print('Pressed'); builder: (context, state) {
} if(state is CommentInitial){
) return const Text('CommentInitial');
], }
), if(state is CommentFailed){
), return const Text('CommentFailed');
BlocBuilder<CommentBloc, CommentState>( }
builder: (context, state) { if(state is CommentLoading){
if(state is CommentInitial){ return const Text('CommentLoading');
return const Text('CommentInitial'); }
} if(state is CommentSuccess){
if(state is CommentFailed){ commentModel = state.commentModel;
//const CircularProgressIndicator(); onData!(commentModel!);
return Text('CommentFailed'); return
} Container(
if(state is CommentLoading){ decoration: const BoxDecoration(
return const Text('CommentLoading'); borderRadius: BorderRadius.all(Radius.circular(10)),
} boxShadow: [
if(state is CommentSuccess){ BoxShadow(
commentModel = state.commentModel; color: AppColors.primary,
onData!(commentModel!); spreadRadius: 0.5,
return ),
Container( ],
decoration: const BoxDecoration( ),
borderRadius: BorderRadius.all(Radius.circular(10)), height: checkLandscape(context)?getHeight(context)*0.5:getHeight(context)*0.3,
boxShadow: [ width: double.maxFinite,
BoxShadow( child:
color: AppColors.primary, PageView.builder(
spreadRadius: 0.5, //itemCount: state.commentModel.data!.length,
), itemBuilder: (BuildContext context, int index) {
], return
), Stack(children: [
height: checkLandscape(context)?getHeight(context)*0.5:getHeight(context)*0.3, Container(
width: double.maxFinite, decoration: const BoxDecoration(
child: borderRadius: BorderRadius.all(Radius.circular(10)),
PageView.builder( color: AppColors.white,
//itemCount: state.commentModel.data!.length, boxShadow: [
itemBuilder: (BuildContext context, int index) { BoxShadow(
return color: AppColors.primary_light,
Stack(children: [ spreadRadius: 1,
Container( ),
decoration: const BoxDecoration( ],
borderRadius: BorderRadius.all(Radius.circular(10)), ),
color: AppColors.white, child: PageView.builder(
boxShadow: [ controller: _pageController,
BoxShadow( itemBuilder: (context, index) {
color: AppColors.primary_light, return
spreadRadius: 1, Column(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Row(children: [
ClipRRect(
borderRadius: BorderRadius.circular(50),
child: Image.network(state.commentModel.data![index].createUserAvatar!=null?state.commentModel.data![index].createUserAvatar!:Images.ongbut_happy,
fit: BoxFit.fill,height: 60,width: 60,
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Column(children: [
Text(state.commentModel.data![index].createUserFullName!),
Text(state.commentModel.data![index].createUserFullName!)
],),
)
],),
),
Text(state.commentModel.data![index].courseKeyword!=null?state.commentModel.data![index].courseKeyword!:'',style: const TextStyle(fontWeight: FontWeight.bold),),
Padding(
padding: const EdgeInsets.fromLTRB(10, 0, 10, 0),
child:
Text(state.commentModel.data![index].content!=null?state.commentModel.data![index].content!:'',style: const TextStyle(fontSize: 15),
softWrap: false,
maxLines: 4,
overflow: TextOverflow.ellipsis),
), ),
], ],
), );
child: PageView.builder( },
controller: _pageController, itemCount: state.commentModel.data!.length,
itemBuilder: (context, index) { ),
return ),
Column( Column(
children: [ mainAxisAlignment: MainAxisAlignment.end,
Padding( crossAxisAlignment: CrossAxisAlignment.center,
padding: const EdgeInsets.all(8.0), children: [
child: Row(children: [ Container(
ClipRRect( padding: const EdgeInsets.all(10),
borderRadius: BorderRadius.circular(50), child: Center(child: SmoothPageIndicator(
child: Image.network(state.commentModel.data![index].createUserAvatar!=null?state.commentModel.data![index].createUserAvatar!:Images.ongbut_happy, controller: _pageController,
fit: BoxFit.fill,height: 60,width: 60, count: state.commentModel.data!.length,
), effect: const WormEffect(),
), onDotClicked: (index) => _pageController.animateToPage(index, duration: const Duration(milliseconds: 1), curve: Curves.bounceOut),
Padding( ),),
padding: const EdgeInsets.all(8.0), ),
child: Column(children: [ ],),
Text(state.commentModel.data![index].createUserFullName!), ],);
Text(state.commentModel.data![index].createUserFullName!) },
],), onPageChanged: (int index) {}),
) );
],), }
), return const Text('NewFailed');
Text(state.commentModel.data![index].courseKeyword!=null?state.commentModel.data![index].courseKeyword!:'',style: const TextStyle(fontWeight: FontWeight.bold),), }
Padding(
padding: const EdgeInsets.fromLTRB(10, 0, 10, 0),
child:
Text(state.commentModel.data![index].content!=null?state.commentModel.data![index].content!:'',style: const TextStyle(fontSize: 15),
softWrap: false,
maxLines: 4,
overflow: TextOverflow.ellipsis),
),
],
);
},
itemCount: state.commentModel.data!.length,
),
),
Column(
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
padding: const EdgeInsets.all(10),
child: Center(child: SmoothPageIndicator( controller: _pageController,
count: state.commentModel.data!.length,
effect: const WormEffect(),
onDotClicked: (index) => _pageController.animateToPage(index, duration: const Duration(milliseconds: 1), curve: Curves.bounceOut),
),),
),
],),
],);
},
onPageChanged: (int index) {
}),
);
}
return const Text('NewFailed');
}
),
const SizedBox(height: 100,),
],
), ),
); SizedBox(height: checkLandscape(context)?getHeight(context)*0.1:getHeight(context)*0.1,),
} ],
),
); );
} }
} }
...@@ -18,120 +18,112 @@ class CourseWidget extends StatelessWidget { ...@@ -18,120 +18,112 @@ class CourseWidget extends StatelessWidget {
List<ListData> listData = []; List<ListData> listData = [];
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
BlocProvider.of<CourseBloc>(context).add( return Container(
RequestCourse(context: context)); color: AppColors.background,
return child: Column(
BlocConsumer<CourseBloc, CourseState>( children: [
listener: (context, state) async {}, Padding(
builder: (context, state) { padding: const EdgeInsets.fromLTRB(20, 0, 0, 0),
return Container( child: Row(
color: AppColors.background, mainAxisAlignment: MainAxisAlignment.spaceBetween,
child: Column(
children: [ children: [
Padding( const Text('Tham Gia Khoa Hoc Thu',style: TextStyle(fontWeight: FontWeight.bold,fontSize: 15),),
padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), TextButton(
child: Row( child: const Text('Xem Them>>'),
mainAxisAlignment: MainAxisAlignment.spaceBetween, onPressed: () {
children: [ Navigator.push(
const Text('Tham Gia Khoa Hoc Thu',style: TextStyle(fontWeight: FontWeight.bold,fontSize: 15),), context,
TextButton( MaterialPageRoute(
child: const Text('Xem Them>>'), builder: (_) => SearchWidget(),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => SearchWidget(),
)).then((value) { )).then((value) {
if (value != null && value is bool && value) {} if (value != null && value is bool && value) {}
}); });
} }
) )
], ],
), ),
), ),
BlocBuilder<CourseBloc, CourseState>( BlocBuilder<CourseBloc, CourseState>(
builder: (context, state) { builder: (context, state) {
if(state is CourseInitial){ if(state is CourseInitial){
const CircularProgressIndicator(); const CircularProgressIndicator();
} }
if(state is CourseLoading){ if(state is CourseLoading){
return const CircularProgressIndicator(); return const CircularProgressIndicator();
} }
if(state is CourseFailed){ if(state is CourseFailed){
return Text(state.message.toString()); return Text(state.message.toString());
} }
if(state is CourseSuccess){ if(state is CourseSuccess){
listData = state.courseModel.data!.listData!; listData = state.courseModel.data!.listData!;
return
Swiper(
itemHeight: 340,
itemWidth: double.maxFinite,
layout: SwiperLayout.TINDER,
itemBuilder: (BuildContext context, int index) {
return return
Swiper( Container(
itemHeight: 340, decoration: const BoxDecoration(
itemWidth: double.maxFinite, boxShadow: [
layout: SwiperLayout.TINDER, BoxShadow(
itemBuilder: (BuildContext context, int index) { color: AppColors.primary,
return spreadRadius: 1,
Container( ),
decoration: const BoxDecoration( ],
boxShadow: [ color: Colors.white,
BoxShadow( borderRadius: BorderRadius.all(Radius.circular(10)),
color: AppColors.primary, ),
spreadRadius: 1, child: Column(children: [
),
],
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(10)),
),
child: Column(children: [
ClipRRect( ClipRRect(
borderRadius: BorderRadius.circular(8.0), borderRadius: BorderRadius.circular(8.0),
child: child:
Image.network(listData[index].image!=null?listData[index].image!:'https://oss.myitsol.com/imes-public/2022/12/11/neymar_145527553.PNG', Image.network(listData[index].image!=null?listData[index].image!:'https://oss.myitsol.com/imes-public/2022/12/11/neymar_145527553.PNG',
fit: BoxFit.fill,height: 200,width: double.maxFinite, fit: BoxFit.fill,height: 200,width: double.maxFinite,
errorBuilder: (BuildContext context, Object exception, errorBuilder: (BuildContext context, Object exception,
StackTrace? stackTrace) { StackTrace? stackTrace) {
return Image.asset(Images.load_err); return Image.asset(Images.load_err);
}, },
), ),
), ),
Padding( Padding(
padding: const EdgeInsets.all(10.0), padding: const EdgeInsets.all(10.0),
child: child:
Text(listData[index].type!), Text(listData[index].type!),
//Text('abc'), //Text('abc'),
), ),
Padding( Padding(
padding: const EdgeInsets.all(10.0), padding: const EdgeInsets.all(10.0),
child: child:
Text(listData[index].name!), Text(listData[index].name!),
), ),
],), ],),
); );
}, },
itemCount: listData.length, itemCount: listData.length,
onTap: (index){ onTap: (index){
Navigator.push( Navigator.push(
context, context,
MaterialPageRoute( MaterialPageRoute(
builder: (_) => CourseDetailWidget(listData[index].courseId!,listData[index].image!=null?listData[index].image! builder: (_) => CourseDetailWidget(listData[index].courseId!,listData[index].image!=null?listData[index].image!
:'https://oss.myitsol.com/imes-public/2022/12/11/neymar_145527553.PNG'), :'https://oss.myitsol.com/imes-public/2022/12/11/neymar_145527553.PNG'),
)).then((value) { )).then((value) {
if (value != null && value is bool && value) {} if (value != null && value is bool && value) {}
}); });
}, },
); );
} }
return const Text('CourseFailed'); return const Text('CourseFailed');
} }
) )
], ],
), ),
); );
}
);
} }
} }
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
...@@ -9,7 +8,6 @@ import 'package:ongbut_ntmanh/app/module/lession/widgets/lession_widget.dart'; ...@@ -9,7 +8,6 @@ import 'package:ongbut_ntmanh/app/module/lession/widgets/lession_widget.dart';
import 'package:ongbut_ntmanh/const/colors.dart'; import 'package:ongbut_ntmanh/const/colors.dart';
import 'package:ongbut_ntmanh/widgets/widgets_util.dart'; import 'package:ongbut_ntmanh/widgets/widgets_util.dart';
import '../../../../res/images/images.dart'; import '../../../../res/images/images.dart';
import '../../playvideo/page/play_video.dart';
import '../bloc/course_detail_bloc.dart'; import '../bloc/course_detail_bloc.dart';
class CourseDetailWidget extends StatelessWidget { class CourseDetailWidget extends StatelessWidget {
...@@ -20,104 +18,100 @@ class CourseDetailWidget extends StatelessWidget { ...@@ -20,104 +18,100 @@ class CourseDetailWidget extends StatelessWidget {
List<ListLesson> listLesion = []; List<ListLesson> listLesion = [];
CourseDetailWidget(this.courseId,this.image, {super.key}); CourseDetailWidget(this.courseId,this.image, {super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
BlocProvider.of<CourseDetailBloc>(context).add( CourseDetailBloc bloc = CourseDetailBloc()..add(RequestCourseDetail(context: context,idCourse: courseId));
RequestCourseDetail(context: context,idCourse: courseId)); // BlocProvider.of<CourseDetailBloc>(context).add(
// RequestCourseDetail(context: context,idCourse: courseId));
return return
Scaffold( Scaffold(
appBar: AppBar(title: const Text('Chi Tiet Khoa Hoc'),), appBar: AppBar(title: const Text('Chi Tiet Khoa Hoc'),),
body: body:
Column(children: [ Column(children: [
Image.network(image, fit: BoxFit.fill,height: checkLandscape(context)?getHeight(context)*0.5:getHeight(context)*0.3,width: double.maxFinite, Image.network(image, fit: BoxFit.fill,height: checkLandscape(context)?getHeight(context)*0.5:getHeight(context)*0.3,width: double.maxFinite,
errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) { errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) {
return Image.asset(Images.load_err,fit: BoxFit.fill,height: checkLandscape(context)?getHeight(context)*0.5:getHeight(context)*0.3,width: double.maxFinite,); return Image.asset(Images.load_err,fit: BoxFit.fill,height: checkLandscape(context)?getHeight(context)*0.5:getHeight(context)*0.3,width: double.maxFinite,);
}, },
), ),
Expanded( Expanded(
child: BlocConsumer<CourseDetailBloc, CourseDetailState>( child:
listener: (context, state) async {}, BlocBuilder<CourseDetailBloc, CourseDetailState>(
builder: (context, state) { bloc: bloc,
return builder: (context, state) {
BlocBuilder<CourseDetailBloc, CourseDetailState>( if(state is CourseDetailInitial){
builder: (context, state) { return const CircularProgressIndicator();
if(state is CourseDetailInitial){ }
return const Text('SchoolInitial'); if(state is CourseDetailFailed){
} return Text(state.message.toString());
if(state is CourseDetailFailed){ }
return Text(state.message.toString()); if(state is CourseDetailLoading){
} return const CircularProgressIndicator();
if(state is CourseDetailLoading){ }
return const CircularProgressIndicator(); if(state is CourseDetailSuccess){
} chapters = state.courseDetailModel.data!.chapters!;
if(state is CourseDetailSuccess){
chapters = state.courseDetailModel.data!.chapters!;
if(chapters.isEmpty){ if(chapters.isEmpty){
return const Text('Chua Co Noi Dung Khoa Hoc',style: TextStyle(fontSize: 15,color: AppColors.red_light),); return const Text('Chua Co Noi Dung Khoa Hoc',style: TextStyle(fontSize: 15,color: AppColors.red_light),);
} }
if(chapters.isNotEmpty){ if(chapters.isNotEmpty){
return return
Column( Column(
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [
Padding(
padding: const EdgeInsets.fromLTRB(10, 10, 0, 0),
child: Column(
children: [ children: [
Padding( Row(
padding: const EdgeInsets.fromLTRB(10, 10, 0, 0), mainAxisAlignment: MainAxisAlignment.spaceBetween,
child: Column(
children: [ children: [
Row( // Image.asset(Images.see,height: 20,width: 20,),
mainAxisAlignment: MainAxisAlignment.spaceBetween, TextButton(onPressed: (){},
children: [ child: const Text('Thong Tin chi tiet',
// Image.asset(Images.see,height: 20,width: 20,),
TextButton(onPressed: (){},
child: const Text('Thong Tin chi tiet',
style: TextStyle(fontSize: 15),)), style: TextStyle(fontSize: 15),)),
// const Text('Thong Tin chi tiet',style: TextStyle(fontWeight: FontWeight.bold,fontSize: 15),), // const Text('Thong Tin chi tiet',style: TextStyle(fontWeight: FontWeight.bold,fontSize: 15),),
TextButton( TextButton(
child: const Text('Nhan xet ve khoa hoc',style: TextStyle(color: AppColors.black),), child: const Text('Nhan xet ve khoa hoc',style: TextStyle(color: AppColors.black),),
onPressed: () { onPressed: () {
print('Pressed'); print('Pressed');
} }
) )
],
),
], ],
), ),
), ],
Expanded( ),
child: Padding( ),
padding: const EdgeInsets.fromLTRB(10, 10, 0, 0), Expanded(
child: child: Padding(
ListView.builder( padding: const EdgeInsets.fromLTRB(10, 10, 0, 0),
itemCount: chapters.length, child:
physics: const AlwaysScrollableScrollPhysics(), ListView.builder(
itemBuilder: (context, index) { itemCount: chapters.length,
return physics: const AlwaysScrollableScrollPhysics(),
itemBuilder: (context, index) {
return
ExpansionTile( ExpansionTile(
title: Text(chapters[index].name!), title: Text(chapters[index].name!),
children: [ children: [
chapters[index].listLesson!.isNotEmpty?_buildLesion(chapters[index]):const Text(''), chapters[index].listLesson!.isNotEmpty?_buildLesion(chapters[index]):const Text(''),
], ],
); );
}, },
),
),
), ),
],); ),
} ),
} ],);
return const Text('Default CourseDetail!!!!!'); }
} }
); return const Text('Default CourseDetail!!!!!');
} }
),
), ),
), ],)
],)
); );
} }
...@@ -128,46 +122,45 @@ class CourseDetailWidget extends StatelessWidget { ...@@ -128,46 +122,45 @@ class CourseDetailWidget extends StatelessWidget {
itemCount: chapters.listLesson!.length, itemCount: chapters.listLesson!.length,
itemBuilder: (context, index){ itemBuilder: (context, index){
return return
InkWell( InkWell(
onTap: (){ onTap: (){
chapters.listLesson![0].free == true? chapters.listLesson![0].free == true?
Navigator.push( Navigator.push(
context, context,
MaterialPageRoute(builder: (context) => LessionWidget(lessonID: chapters.listLesson![index].lessonId!)), MaterialPageRoute(builder: (context) => LessionWidget(lessonID: chapters.listLesson![index].lessonId!)),
):const Text(''); ):const Text('');
}, },
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ mainAxisSize: MainAxisSize.max,
Padding( crossAxisAlignment: CrossAxisAlignment.center,
padding: const EdgeInsets.fromLTRB(30, 3, 0, 3), children: [
child: Image.asset(Images.o,height: 10,width: 10,)), Padding(
Padding( padding: const EdgeInsets.fromLTRB(30, 3, 0, 3),
padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), child: Image.asset(Images.o,height: 10,width: 10,)),
child: Padding(
Container( padding: const EdgeInsets.fromLTRB(0, 0, 0, 0),
width: checkLandscape(context)?getWidth(context)*0.8:getWidth(context)*0.6, child:
child: Text(chapters.listLesson![index].name!=null?chapters.listLesson![index].name!:'',style: const TextStyle(fontSize: 12), Container(
width: checkLandscape(context)?getWidth(context)*0.25:getHeight(context)*0.25,
child: Text(chapters.listLesson![index].name!=null?chapters.listLesson![index].name!:'',style: TextStyle(fontSize: 12, overflow: TextOverflow.ellipsis),
softWrap: false, softWrap: false,
maxLines: 1, maxLines: 1,),
overflow: TextOverflow.ellipsis), ),
), ),
), Padding(
Padding(
padding: const EdgeInsets.fromLTRB(20, 3, 20, 3),
child: chapters.listLesson![0].free == true ?Padding(
padding: const EdgeInsets.fromLTRB(20, 3, 20, 3), padding: const EdgeInsets.fromLTRB(20, 3, 20, 3),
child: Image.asset(Images.see,height: 20,width: 20,), child: chapters.listLesson![0].free == true ?Padding(
):Padding( padding: const EdgeInsets.fromLTRB(20, 3, 20, 3),
padding: const EdgeInsets.fromLTRB(20, 3, 20, 3), child: Image.asset(Images.see,height: 20,width: 20,),
child: Image.asset(Images.uneye,height: 20,width: 20,), ):Padding(
padding: const EdgeInsets.fromLTRB(20, 3, 20, 3),
child: Image.asset(Images.uneye,height: 20,width: 20,),
),
), ),
), ],),
],), );
);
} }
); );
} }
} }
\ No newline at end of file
...@@ -14,29 +14,23 @@ String lessonID; ...@@ -14,29 +14,23 @@ String lessonID;
BlocProvider.of<LessonBloc>(context).add( BlocProvider.of<LessonBloc>(context).add(
RequestLesson(context: context, lessonID: lessonID)); RequestLesson(context: context, lessonID: lessonID));
return return
BlocConsumer<LessonBloc, LessonState>( BlocBuilder<LessonBloc, LessonState>(
listener: (context, state) async {},
builder: (context, state) { builder: (context, state) {
return if(state is LessonInitial){
BlocBuilder<LessonBloc, LessonState>( return const CircularProgressIndicator();
builder: (context, state) { }
if(state is LessonInitial){ if(state is LessonFailed){
return const Text('LessonInitial'); return const Text('LessonFailed');
} }
if(state is LessonFailed){ if(state is LessonLoading){
return const Text('LessonFailed'); return const CircularProgressIndicator();
} }
if(state is LessonLoading){ if(state is LessonSuccess){
return const CircularProgressIndicator(); return
} PlayVideoPage(link: state.lessonModel.data!.length>3?state.lessonModel.data![3].playlist![0].link!:'ES1NU-uwX-Q');
if(state is LessonSuccess){ // state.lessonModel.data!.length>3?PlayVideoPage(link: state.lessonModel.data![3].playlist![0].link!):const Text('Xin Loi khong co Video');
return }
PlayVideoPage(link: state.lessonModel.data!.length>3?state.lessonModel.data![3].playlist![0].link!:'ES1NU-uwX-Q'); return const Text('NewFailed');
// state.lessonModel.data!.length>3?PlayVideoPage(link: state.lessonModel.data![3].playlist![0].link!):const Text('Xin Loi khong co Video');
}
return const Text('NewFailed');
}
);
} }
); );
} }
......
...@@ -2,14 +2,14 @@ import 'package:flutter/material.dart'; ...@@ -2,14 +2,14 @@ import 'package:flutter/material.dart';
import '../model/login_model.dart'; import '../model/login_model.dart';
class LoginDetailsPage extends StatelessWidget { class LoginDetailPage extends StatelessWidget {
LoginModel loginModels;
LoginDetailsPage(this.loginModels, {Key? key}) : super(key: key); LoginDetailPage({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar(title: const Text('Details!')), appBar: AppBar(title: const Text('Details!')),
body: Text(loginModels.session_state), body: Text("acssea"),
); );
} }
} }
...@@ -15,94 +15,102 @@ class LoginPage extends StatelessWidget { ...@@ -15,94 +15,102 @@ class LoginPage extends StatelessWidget {
return return
BlocConsumer<LoginBloc, LoginState>( BlocConsumer<LoginBloc, LoginState>(
listener: (context, state) async { listener: (context, state) async {
// if(state is LoginSuccess){
// _userController.text='';
// _passController.text='';
// }
// hàm sẽ đc gọi mỗi khi có sự thay đổi state của Bloc.ví dụ: // hàm sẽ đc gọi mỗi khi có sự thay đổi state của Bloc.ví dụ:
// if(state is MyStateSuccess){ // if(state is MyStateSuccess){
// // Thực hiện hành động // // Thực hiện hành động
// } // }
}, },
builder: (context, state) { builder: (context, state) {
return return _buildUI(context);
Container( },
color: AppColors.background, );
child: Column( }
children: [ }
Padding(
padding: const EdgeInsets.fromLTRB(0, 20, 0, 0),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: const [
Text('Dang Ky & Tu Van',style: TextStyle(fontWeight: FontWeight.bold,fontSize: 16),),
],
),
),
Padding(
padding: const EdgeInsets.only(left: 60, right: 60),
child:
TextFormField(
decoration: const InputDecoration(
labelText: 'Product Name',
),
controller: _userController,
),
),
Padding(
padding: const EdgeInsets.only(left: 60, right: 60),
child:
TextFormField(
decoration: const InputDecoration(
labelText: 'PassWord',
),
controller: _passController,
),
),
Padding( Widget _buildUI(BuildContext context){
padding: const EdgeInsets.all(20.0), return
child: OutlinedButton( Container(
style: OutlinedButton.styleFrom( color: AppColors.background,
minimumSize: const Size.fromHeight(50), child: Column(
backgroundColor: AppColors.primary, children: [
shape: RoundedRectangleBorder( Padding(
borderRadius: BorderRadius.circular(20.0), padding: const EdgeInsets.fromLTRB(0, 20, 0, 0),
), child: Row(
), mainAxisAlignment: MainAxisAlignment.center,
onPressed: () async { children: const [
BlocProvider.of<LoginBloc>(context).add( Text('Dang Ky & Tu Van',style: TextStyle(fontWeight: FontWeight.bold,fontSize: 16),),
RequestLogin( ],
context: context, ),
username: _userController.text, ),
password: _passController.text)); Padding(
}, padding: const EdgeInsets.only(left: 60, right: 60),
child: Text("Dang Nhap".toUpperCase(), child:
style: const TextStyle( TextFormField(
color: AppColors.white, decoration: const InputDecoration(
fontWeight: FontWeight.bold),) labelText: 'Product Name',
),
controller: _userController,
),
),
Padding(
padding: const EdgeInsets.only(left: 60, right: 60),
child:
TextFormField(
decoration: const InputDecoration(
labelText: 'PassWord',
),
controller: _passController,
),
),
Padding(
padding: const EdgeInsets.all(20.0),
child: OutlinedButton(
style: OutlinedButton.styleFrom(
minimumSize: const Size.fromHeight(50),
backgroundColor: AppColors.primary,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20.0),
), ),
), ),
BlocBuilder<LoginBloc, LoginState>( onPressed: () async {
builder: (context, state) { BlocProvider.of<LoginBloc>(context).add(
if (state is LoginLoading) { RequestLogin(
return const CircularProgressIndicator(); context: context,
} username: _userController.text,
if (state is LoginFailed) { password: _passController.text));
return const Text('login false!'); },
} child: Text("Dang Nhap".toUpperCase(),
if (state is LoginInitial) { style: const TextStyle(
return color: AppColors.white,
const Text('LoginInitial'); fontWeight: FontWeight.bold),)
}
if (state is LoginSuccess) {
return
const Text('Dang Nhap Thanh Cong');
}
return const CircularProgressIndicator();
}),
],
), ),
); ),
}, BlocBuilder<LoginBloc, LoginState>(
builder: (context, state) {
if (state is LoginLoading) {
return const CircularProgressIndicator();
}
if (state is LoginFailed) {
return const Text('login false!');
}
if (state is LoginInitial) {
return
const Text('LoginInitial');
}
if (state is LoginSuccess) {
return
const Text('Dang Nhap Thanh Cong');
}
return const CircularProgressIndicator();
}),
],
),
); );
}
} }
...@@ -14,130 +14,122 @@ class NewWidget extends StatelessWidget { ...@@ -14,130 +14,122 @@ class NewWidget extends StatelessWidget {
NewModel? newModel; NewModel? newModel;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
BlocProvider.of<NewBloc>(context).add(
RequestNew(context: context));
return return
BlocConsumer<NewBloc, NewState>( Container(
listener: (context, state) async {}, color: AppColors.background,
builder: (context, state) { child: Column(
return children: [
Container( Padding(
color: AppColors.background, padding: const EdgeInsets.fromLTRB(20, 0, 0, 0),
child: Column( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Padding( const Text('Tin Tuc',style: TextStyle(fontWeight: FontWeight.bold,fontSize: 15),),
padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), TextButton(
child: Row( child: const Text('Xem Them>>'),
mainAxisAlignment: MainAxisAlignment.spaceBetween, onPressed: () {
children: [ // Navigator.push(
const Text('Tin Tuc',style: TextStyle(fontWeight: FontWeight.bold,fontSize: 15),), // context,
TextButton( // MaterialPageRoute(
child: const Text('Xem Them>>'), // builder: (_) => SearchWidget(),
onPressed: () { //
// Navigator.push( // )).then((value) {
// context, // if (value != null && value is bool && value) {}
// MaterialPageRoute( // });
// builder: (_) => SearchWidget(), }
// )
// )).then((value) { ],
// if (value != null && value is bool && value) {} ),
// }); ),
} BlocBuilder<NewBloc, NewState>(
) builder: (context, state) {
], if(state is NewInitial){
), return const Text('NewInitial');
), }
BlocBuilder<NewBloc, NewState>( if(state is NewFailed){
builder: (context, state) { //const CircularProgressIndicator();
if(state is NewInitial){ return Text('NewInitial');
return const Text('NewInitial'); }
} if(state is NewLoading){
if(state is NewFailed){ return const Text('NewInitial');
//const CircularProgressIndicator(); }
return Text('NewInitial'); if(state is NewSuccess){
} return
if(state is NewLoading){ Container(
return const Text('NewInitial'); padding: EdgeInsets.fromLTRB(20, 0, 0, 0),
} decoration: const BoxDecoration(
if(state is NewSuccess){
return
Container(
padding: EdgeInsets.fromLTRB(20, 0, 0, 0),
decoration: const BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(10)), borderRadius: BorderRadius.all(Radius.circular(10)),
// boxShadow: [ // boxShadow: [
// BoxShadow( // BoxShadow(
// //color: AppColors.primary_light, // //color: AppColors.primary_light,
// spreadRadius: 1, // spreadRadius: 1,
// ), // ),
// ], // ],
),
height: checkLandscape(context)?getHeight(context)*0.5:getHeight(context)*0.35,
width: double.maxFinite,
child:
ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: state.newModel.data!.length,
itemBuilder: (context, index) {
return
Container(
padding: const EdgeInsets.all(10),
decoration: const BoxDecoration(
color: AppColors.background,
), ),
height: checkLandscape(context)?getHeight(context)*0.5:getHeight(context)*0.35, height: checkLandscape(context)?getHeight(context)*0.5:getHeight(context)*0.3,
width: double.maxFinite, width: checkLandscape(context)?getWidth(context)*0.3:getWidth(context)*0.6,
child: child:
ListView.builder( Container(
scrollDirection: Axis.horizontal, decoration: const BoxDecoration(
itemCount: state.newModel.data!.length, color: AppColors.white,
itemBuilder: (context, index) { borderRadius: BorderRadius.all(Radius.circular(10)),
return boxShadow: [
Container( BoxShadow(
padding: const EdgeInsets.all(10), color: AppColors.primary,
decoration: const BoxDecoration( spreadRadius: 0.5,
color: AppColors.background, ),
), ],
height: checkLandscape(context)?getHeight(context)*0.5:getHeight(context)*0.3, ),
width: checkLandscape(context)?getWidth(context)*0.3:getWidth(context)*0.6, child: Column(
child: //load_err
Container( children: [
decoration: const BoxDecoration( ClipRRect(
color: AppColors.white, borderRadius: BorderRadius.circular(8.0),
borderRadius: BorderRadius.all(Radius.circular(10)), child:
boxShadow: [ Image.network(
BoxShadow( state.newModel.data![index].urlImageRepresent!,
color: AppColors.primary, fit: BoxFit.fill,height:checkLandscape(context)?getHeight(context)*0.3:getHeight(context)*0.2,width: double.maxFinite,
spreadRadius: 0.5, errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) {
), return Image.asset(Images.load_err,fit: BoxFit.fill,height: checkLandscape(context)?getHeight(context)*0.3:getHeight(context)*0.2,width: double.maxFinite,);
], },
),
child: Column(
//load_err
children: [
ClipRRect(
borderRadius: BorderRadius.circular(8.0),
child:
Image.network(
state.newModel.data![index].urlImageRepresent!,
fit: BoxFit.fill,height:checkLandscape(context)?getHeight(context)*0.3:getHeight(context)*0.2,width: double.maxFinite,
errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) {
return Image.asset(Images.load_err,fit: BoxFit.fill,height: checkLandscape(context)?getHeight(context)*0.3:getHeight(context)*0.2,width: double.maxFinite,);
},
),
),
Padding(
padding: const EdgeInsets.fromLTRB(0, 20, 0, 0),
child: Text(state.newModel.data![index].title!),
),
Padding(
padding: const EdgeInsets.fromLTRB(0, 5, 0, 0),
child: Text(state.newModel.data![index].title!),
),
],
),
), ),
); ),
}, Padding(
), padding: const EdgeInsets.fromLTRB(0, 20, 0, 0),
); child: Text(state.newModel.data![index].title!),
),
Padding(
padding: const EdgeInsets.fromLTRB(0, 5, 0, 0),
child: Text(state.newModel.data![index].title!),
),
],
),
),
);
},
),
);
} }
return const Text('NewFailed'); return const Text('NewFailed');
} }
) )
], ],
), ),
);
}
); );
} }
} }
...@@ -3,38 +3,85 @@ import 'package:flutter/material.dart'; ...@@ -3,38 +3,85 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:youtube_player_flutter/youtube_player_flutter.dart'; import 'package:youtube_player_flutter/youtube_player_flutter.dart';
class PlayVideoPage extends StatelessWidget { class PlayVideoPage extends StatefulWidget {
String link; String link;
PlayVideoPage({required this.link,Key? key}) : super(key: key); PlayVideoPage({required this.link,Key? key}) : super(key: key);
@override
State<PlayVideoPage> createState() => _PlayVideoPageState();
}
class _PlayVideoPageState extends State<PlayVideoPage> {
late YoutubePlayerController _controller; late YoutubePlayerController _controller;
// late TextEditingController _idController;
// late TextEditingController _seekToController;
// final List<String> _ids = [
// 'nPt8bK2gbaU',
// ];
@override
void initState() {
super.initState();
_controller =
YoutubePlayerController(
// initialVideoId: "nPt8bK2gbaU",
// initialVideoId: widget.link,
initialVideoId: YoutubePlayer.convertUrlToId(widget.link).toString(),
flags: const YoutubePlayerFlags(
mute: false,
autoPlay: true,
disableDragSeek: false,
loop: false,
isLive: false,
forceHD: false,
enableCaption: true,
),
);
}
@override
void deactivate() {
// Pauses video while navigating to next page.
_controller.pause();
super.deactivate();
}
@override
void dispose() {
_controller.dispose();
// _idController.dispose();
// _seekToController.dispose();
super.dispose();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_controller = YoutubePlayerController(
initialVideoId: YoutubePlayer.convertUrlToId(link).toString(),
flags: const YoutubePlayerFlags(
mute: false,
autoPlay: true,
disableDragSeek: false,
loop: false,
isLive: false,
forceHD: false,
enableCaption: true,
),
);
return return
YoutubePlayerBuilder( YoutubePlayerBuilder(
onExitFullScreen: () {SystemChrome.setPreferredOrientations(DeviceOrientation.values);}, onExitFullScreen: () {
player: YoutubePlayer( SystemChrome.setPreferredOrientations(DeviceOrientation.values);
controller: _controller, },
showVideoProgressIndicator: true, player: YoutubePlayer(
progressIndicatorColor: Colors.blueAccent, controller: _controller,
), showVideoProgressIndicator: true,
builder: (context, player) => Scaffold( progressIndicatorColor: Colors.blueAccent,
appBar: AppBar(title: Text(YoutubePlayer.convertUrlToId(link).toString()),), // onReady: () {
body: Container(child: player), // _isPlayerReady = true;
), // },
); // onEnded: (data) {
// _controller
// .load(_ids[(_ids.indexOf(data.videoId) + 1) % _ids.length]);
// },
),
builder: (context, player) => Scaffold(
appBar: AppBar(title: Text(YoutubePlayer.convertUrlToId(widget.link).toString()),),
body: Container(child: player),
),
);
} }
} }
...@@ -22,125 +22,116 @@ class SchoolWidget extends StatelessWidget { ...@@ -22,125 +22,116 @@ class SchoolWidget extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
BlocProvider.of<SchoolBloc>(context).add( return Container(
RequestSchool(context: context)); color: AppColors.background,
return child: Column(
BlocConsumer<SchoolBloc, SchoolState>( children: [
listener: (context, state) async {}, Padding(
builder: (context, state) { padding: const EdgeInsets.fromLTRB(20, 0, 0, 0),
return Container( child: Row(
color: AppColors.background, mainAxisAlignment: MainAxisAlignment.spaceBetween,
child: Column(
children: [ children: [
Padding( const Text('Tham Gia Khoa Hoc Thu',style: TextStyle(fontWeight: FontWeight.bold,fontSize: 15),),
padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), TextButton(
child: Text('Xem Them >>'),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => SearchWidget(),
child: Row( )).then((value) {
mainAxisAlignment: MainAxisAlignment.spaceBetween, if (value != null && value is bool && value) {}
children: [ });
const Text('Tham Gia Khoa Hoc Thu',style: TextStyle(fontWeight: FontWeight.bold,fontSize: 15),), }
TextButton( )
child: Text('Xem Them >>'), ],
onPressed: () { ),
Navigator.push( ),
context, BlocBuilder<SchoolBloc, SchoolState>(
MaterialPageRoute( builder: (context, state) {
builder: (_) => SearchWidget(), if(state is SchoolInitial){
return const Text('SchoolInitial');
}
if(state is SchoolFailed){
const CircularProgressIndicator();
return Text(state.message.toString());
}
if(state is SchoolLoading){
return const CircularProgressIndicator();
}
if(state is SchoolSuccess){
listData = state.schoolModel.data!.listData!;
onData!(listData);
return
Swiper(
itemHeight: 340,
itemWidth: double.maxFinite,
layout: SwiperLayout.TINDER,
)).then((value) { itemBuilder: (BuildContext context, int index) {
if (value != null && value is bool && value) {}
});
}
)
],
),
),
BlocBuilder<SchoolBloc, SchoolState>(
builder: (context, state) {
if(state is SchoolInitial){
return const Text('SchoolInitial');
}
if(state is SchoolFailed){
const CircularProgressIndicator();
return Text(state.message.toString());
}
if(state is SchoolLoading){
return const CircularProgressIndicator();
}
if(state is SchoolSuccess){
listData = state.schoolModel.data!.listData!;
onData!(listData);
return return
Swiper( Container(
itemHeight: 340, decoration: const BoxDecoration(
itemWidth: double.maxFinite, boxShadow: [
layout: SwiperLayout.TINDER, BoxShadow(
color: AppColors.primary,
itemBuilder: (BuildContext context, int index) { spreadRadius: 1,
return ),
Container( ],
decoration: const BoxDecoration( color: Colors.white,
boxShadow: [ borderRadius: BorderRadius.all(Radius.circular(10)),
BoxShadow( ),
color: AppColors.primary, child: Column(children: [
spreadRadius: 1,
),
],
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(10)),
),
child: Column(children: [
ClipRRect( ClipRRect(
borderRadius: BorderRadius.circular(8.0), borderRadius: BorderRadius.circular(8.0),
child: child:
Image.network(listData[index].image!, Image.network(listData[index].image!,
fit: BoxFit.fill,height: 200,width: double.maxFinite, fit: BoxFit.fill,height: 200,width: double.maxFinite,
errorBuilder: (BuildContext context, Object exception, errorBuilder: (BuildContext context, Object exception,
StackTrace? stackTrace) { StackTrace? stackTrace) {
return Image.asset(Images.load_err); return Image.asset(Images.load_err);
}, },
), ),
), ),
Padding( Padding(
padding: const EdgeInsets.all(10.0), padding: const EdgeInsets.all(10.0),
child: child:
Text(listData[index].type!), Text(listData[index].type!),
//Text('abc'), //Text('abc'),
), ),
Padding( Padding(
padding: const EdgeInsets.all(10.0), padding: const EdgeInsets.all(10.0),
child: child:
Text(listData[index].name!), Text(listData[index].name!),
//Text('123'), //Text('123'),
), ),
],), ],),
); );
}, },
itemCount: listData.length, itemCount: listData.length,
onTap: (index){ onTap: (index){
Navigator.push( Navigator.push(
context, context,
MaterialPageRoute( MaterialPageRoute(
builder: (_) => CourseDetailWidget(listData[index].courseId!,listData[index].image!), builder: (_) => CourseDetailWidget(listData[index].courseId!,listData[index].image!),
)).then((value) { )).then((value) {
if (value != null && value is bool && value) {} if (value != null && value is bool && value) {}
}); });
}, },
); );
} }
return const Text('SchoolFailed'); return const Text('SchoolFailed');
} }
) )
], ],
), ),
); );
}
);
} }
} }
......
...@@ -48,15 +48,15 @@ class MainBloc { ...@@ -48,15 +48,15 @@ class MainBloc {
BlocProvider<CounterBloc>( BlocProvider<CounterBloc>(
create: (BuildContext context) => CounterBloc()), create: (BuildContext context) => CounterBloc()),
BlocProvider<CourseBloc>( BlocProvider<CourseBloc>(
create: (BuildContext context) => CourseBloc()), create: (BuildContext context) => CourseBloc()..add(RequestCourse(context: context))),
BlocProvider<SchoolBloc>( BlocProvider<SchoolBloc>(
create: (BuildContext context) => SchoolBloc()), create: (BuildContext context) => SchoolBloc()..add(RequestSchool(context: context))),
BlocProvider<LoginBloc>( BlocProvider<LoginBloc>(
create: (BuildContext context) => LoginBloc()), create: (BuildContext context) => LoginBloc()),
BlocProvider<NewBloc>( BlocProvider<NewBloc>(
create: (BuildContext context) => NewBloc()), create: (BuildContext context) => NewBloc()..add(RequestNew(context: context))),
BlocProvider<CommentBloc>( BlocProvider<CommentBloc>(
create: (BuildContext context) => CommentBloc()), create: (BuildContext context) => CommentBloc()..add(RequestComment(context: context))),
BlocProvider<CourseDetailBloc>( BlocProvider<CourseDetailBloc>(
create: (BuildContext context) => CourseDetailBloc()), create: (BuildContext context) => CourseDetailBloc()),
BlocProvider<LessonBloc>( BlocProvider<LessonBloc>(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment