Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
N
ntManhBut
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
NguyenTienManh
ntManhBut
Commits
7b73b6a0
Commit
7b73b6a0
authored
Feb 12, 2023
by
NguyenTienManh
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update
parent
62966e8d
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
76 additions
and
157 deletions
+76
-157
lib/app/module/comment/widgets/comment_widget.dart
lib/app/module/comment/widgets/comment_widget.dart
+3
-3
lib/app/module/coursedetail/widgets/course_detail.dart
lib/app/module/coursedetail/widgets/course_detail.dart
+42
-31
lib/app/module/lession/bloc/lesson_bloc.dart
lib/app/module/lession/bloc/lesson_bloc.dart
+9
-1
lib/app/module/lession/bloc/lesson_event.dart
lib/app/module/lession/bloc/lesson_event.dart
+2
-0
lib/app/module/lession/request/lesson_request.dart
lib/app/module/lession/request/lesson_request.dart
+4
-3
lib/app/module/lession/widgets/lession_widget.dart
lib/app/module/lession/widgets/lession_widget.dart
+2
-1
lib/app/module/lession/widgets/play_video.dart
lib/app/module/lession/widgets/play_video.dart
+0
-92
lib/app/module/login/widget/login_widget.dart
lib/app/module/login/widget/login_widget.dart
+13
-2
lib/app/module/playvideo/page/play_video.dart
lib/app/module/playvideo/page/play_video.dart
+0
-3
lib/app/ui/navigationbottom/home_page.dart
lib/app/ui/navigationbottom/home_page.dart
+0
-16
lib/app/ui/search_page.dart
lib/app/ui/search_page.dart
+1
-5
No files found.
lib/app/module/comment/widgets/comment_widget.dart
View file @
7b73b6a0
...
@@ -68,13 +68,13 @@ class CommentWidget extends StatelessWidget {
...
@@ -68,13 +68,13 @@ class CommentWidget extends StatelessWidget {
width:
double
.
maxFinite
,
width:
double
.
maxFinite
,
child:
child:
PageView
.
builder
(
PageView
.
builder
(
itemCount:
state
.
commentModel
!
.
data
!.
length
,
itemCount:
state
.
commentModel
.
data
!.
length
,
itemBuilder:
(
BuildContext
context
,
int
index
)
{
itemBuilder:
(
BuildContext
context
,
int
index
)
{
return
return
Column
(
Column
(
children:
[
children:
[
Text
(
state
.
commentModel
!.
data
![
index
].
courseId
!),
Text
(
state
.
commentModel
.
data
![
index
].
courseName
!),
Text
(
state
.
commentModel
!.
data
![
index
].
courseName
!),
//Text(state.commentModel.data![index].content
!),
],
],
);
);
},
},
...
...
lib/app/module/coursedetail/widgets/course_detail.dart
View file @
7b73b6a0
...
@@ -4,6 +4,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
...
@@ -4,6 +4,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import
'package:ongbut_ntmanh/app/module/coursedetail/model/chapters.dart'
;
import
'package:ongbut_ntmanh/app/module/coursedetail/model/chapters.dart'
;
import
'package:ongbut_ntmanh/app/module/coursedetail/model/course_detail_model.dart'
;
import
'package:ongbut_ntmanh/app/module/coursedetail/model/course_detail_model.dart'
;
import
'package:ongbut_ntmanh/app/module/lession/widgets/lession_widget.dart'
;
import
'package:ongbut_ntmanh/app/module/lession/widgets/lession_widget.dart'
;
import
'package:ongbut_ntmanh/const/colors.dart'
;
import
'../bloc/course_detail_bloc.dart'
;
import
'../bloc/course_detail_bloc.dart'
;
...
@@ -24,43 +25,53 @@ class CourseDetailWidget extends StatelessWidget {
...
@@ -24,43 +25,53 @@ class CourseDetailWidget extends StatelessWidget {
Scaffold
(
Scaffold
(
appBar:
AppBar
(
title:
const
Text
(
'Chi Tiet Khoa Hoc'
),),
appBar:
AppBar
(
title:
const
Text
(
'Chi Tiet Khoa Hoc'
),),
body:
body:
BlocConsumer
<
CourseDetailBloc
,
CourseDetailState
>(
Column
(
children:
[
listener:
(
context
,
state
)
async
{},
Image
.
network
(
image
!=
null
?
image:
'https://oss.myitsol.com/imes-public/2022/12/11/neymar_145527553.PNG'
,
builder:
(
context
,
state
)
{
fit:
BoxFit
.
fill
,
height:
200
,
width:
double
.
maxFinite
,),
return
Row
(
BlocBuilder
<
CourseDetailBloc
,
CourseDetailState
>(
children:
[
builder:
(
context
,
state
)
{
Text
(
'ID Course = '
,
style:
TextStyle
(
fontSize:
15
,
color:
AppColors
.
red_light
)),
if
(
state
is
CourseDetailInitial
){
Text
(
courseId
),
return
const
Text
(
'SchoolInitial'
);
],
}
),
if
(
state
is
CourseDetailFailed
){
BlocConsumer
<
CourseDetailBloc
,
CourseDetailState
>(
return
Text
(
state
.
message
.
toString
());
listener:
(
context
,
state
)
async
{},
}
builder:
(
context
,
state
)
{
if
(
state
is
CourseDetailLoading
){
return
return
const
CircularProgressIndicator
();
BlocBuilder
<
CourseDetailBloc
,
CourseDetailState
>(
}
builder:
(
context
,
state
)
{
if
(
state
is
CourseDetailSuccess
){
if
(
state
is
CourseDetailInitial
){
return
const
Text
(
'SchoolInitial'
);
// Image.network('https://oss.myitsol.com/imes-public/2022/12/11/neymar_145527553.PNG',
// fit: BoxFit.fill,height: 200,width: double.maxFinite,);
chapters
=
state
.
courseDetailModel
.
data
!.
chapters
!;
if
(
chapters
.
isEmpty
==
true
){
return
const
Text
(
'Chua Co Noi Dung Khoa Hoc'
);
}
}
if
(
chapters
.
isEmpty
==
false
){
if
(
state
is
CourseDetailFailed
){
return
return
Text
(
state
.
message
.
toString
());
}
if
(
state
is
CourseDetailLoading
){
return
const
CircularProgressIndicator
();
}
if
(
state
is
CourseDetailSuccess
){
// Image.network('https://oss.myitsol.com/imes-public/2022/12/11/neymar_145527553.PNG',
// fit: BoxFit.fill,height: 200,width: double.maxFinite,);
chapters
=
state
.
courseDetailModel
.
data
!.
chapters
!;
if
(
chapters
.
isEmpty
==
true
){
return
const
Text
(
'Chua Co Noi Dung Khoa Hoc'
,
style:
TextStyle
(
fontSize:
15
,
color:
AppColors
.
red_light
),);
}
if
(
chapters
.
isEmpty
==
false
){
return
Column
(
children:
[
Column
(
children:
[
Image
.
network
(
image
!=
null
?
image:
'https://oss.myitsol.com/imes-public/2022/12/11/neymar_145527553.PNG'
,
//
Image.network(image!=null?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,),
LessionWidget
(
chapters
[
0
].
listLesson
![
0
].
lessonId
!=
null
?
chapters
[
0
].
listLesson
![
0
].
lessonId
!:
'fb228efa-7b32-419e-98b4-a6d5135f4361'
),
LessionWidget
(
chapters
[
0
].
listLesson
![
0
].
lessonId
!=
null
?
chapters
[
0
].
listLesson
![
0
].
lessonId
!:
'fb228efa-7b32-419e-98b4-a6d5135f4361'
),
],);
],);
}
}
}
return
const
Text
(
'Default CourseDetail!!!!!'
);
}
}
return
const
Text
(
'Default CourseDetail!!!!!'
);
);
}
}
);
),
}
],)
),
);
);
}
}
}
}
...
...
lib/app/module/lession/bloc/lesson_bloc.dart
View file @
7b73b6a0
...
@@ -15,9 +15,17 @@ class LessonBloc extends Bloc<LessonEvent, LessonState> {
...
@@ -15,9 +15,17 @@ class LessonBloc extends Bloc<LessonEvent, LessonState> {
}
}
Future
<
void
>
_requestLesson
(
RequestLesson
event
,
Emitter
<
LessonState
>
emit
)
async
{
Future
<
void
>
_requestLesson
(
RequestLesson
event
,
Emitter
<
LessonState
>
emit
)
async
{
if
(
event
.
lessonID
.
isEmpty
)
{
emit
(
const
LessonFailed
(
'lessonID is Empty!'
));
emit
(
const
LessonResetState
());
return
;
}
RemoteLesson
remoteLesson
=
RemoteLesson
();
RemoteLesson
remoteLesson
=
RemoteLesson
();
try
{
try
{
LessonModel
?
lessonModel
=
await
remoteLesson
.
getLessonModel
();
LessonModel
?
lessonModel
=
await
remoteLesson
.
getLessonModel
(
context:
event
.
context
,
lessonID:
event
.
lessonID
,
);
emit
(
LessonSuccess
(
lessonModel
!));
emit
(
LessonSuccess
(
lessonModel
!));
}
catch
(
e
)
{
}
catch
(
e
)
{
emit
(
const
LessonFailed
(
'request false2!'
));
emit
(
const
LessonFailed
(
'request false2!'
));
...
...
lib/app/module/lession/bloc/lesson_event.dart
View file @
7b73b6a0
...
@@ -9,8 +9,10 @@ abstract class LessonEvent extends Equatable {
...
@@ -9,8 +9,10 @@ abstract class LessonEvent extends Equatable {
class
RequestLesson
extends
LessonEvent
{
class
RequestLesson
extends
LessonEvent
{
final
BuildContext
context
;
final
BuildContext
context
;
final
String
lessonID
;
const
RequestLesson
({
const
RequestLesson
({
required
this
.
context
,
required
this
.
context
,
required
this
.
lessonID
,
});
});
@override
@override
...
...
lib/app/module/lession/request/lesson_request.dart
View file @
7b73b6a0
import
'package:dio/dio.dart'
;
import
'package:dio/dio.dart'
;
import
'package:flutter/material.dart'
;
import
'../model/lesson_model.dart'
;
import
'../model/lesson_model.dart'
;
// https://imes-api.myitsol.com/api/v1/student/course/part?lessonId=fb228efa-7b32-419e-98b4-a6d5135f4361
// https://imes-api.myitsol.com/api/v1/student/course/part?lessonId=fb228efa-7b32-419e-98b4-a6d5135f4361
class
RemoteLesson
{
class
RemoteLesson
{
Future
<
LessonModel
?>
getLessonModel
()
async
{
Future
<
LessonModel
?>
getLessonModel
(
{
required
BuildContext
context
,
required
String
lessonID
}
)
async
{
var
dio
=
Dio
();
var
dio
=
Dio
();
String
url
=
(
"https://imes-api.myitsol.com/api/v1/student/course/part?lessonId=
fb228efa-7b32-419e-98b4-a6d5135f4361
"
);
String
url
=
(
"https://imes-api.myitsol.com/api/v1/student/course/part?lessonId="
);
var
response
=
await
dio
.
get
(
url
);
var
response
=
await
dio
.
get
(
url
+
lessonID
);
if
(
response
.
statusCode
==
200
){
if
(
response
.
statusCode
==
200
){
var
json
=
response
.
data
;
var
json
=
response
.
data
;
return
LessonModel
.
fromJson
(
json
);
return
LessonModel
.
fromJson
(
json
);
...
...
lib/app/module/lession/widgets/lession_widget.dart
View file @
7b73b6a0
...
@@ -21,7 +21,7 @@ class _LessionWidgetState extends State<LessionWidget> {
...
@@ -21,7 +21,7 @@ class _LessionWidgetState extends State<LessionWidget> {
@override
@override
Widget
build
(
BuildContext
context
)
{
Widget
build
(
BuildContext
context
)
{
BlocProvider
.
of
<
LessonBloc
>(
context
).
add
(
BlocProvider
.
of
<
LessonBloc
>(
context
).
add
(
RequestLesson
(
context:
context
));
RequestLesson
(
context:
context
,
lessonID:
widget
.
lessonID
));
return
return
// Container(child: Text(lessonID.toString()),);
// Container(child: Text(lessonID.toString()),);
SingleChildScrollView
(
SingleChildScrollView
(
...
@@ -30,6 +30,7 @@ class _LessionWidgetState extends State<LessionWidget> {
...
@@ -30,6 +30,7 @@ class _LessionWidgetState extends State<LessionWidget> {
mainAxisAlignment:
MainAxisAlignment
.
center
,
mainAxisAlignment:
MainAxisAlignment
.
center
,
crossAxisAlignment:
CrossAxisAlignment
.
center
,
crossAxisAlignment:
CrossAxisAlignment
.
center
,
children:
[
children:
[
Text
(
widget
.
lessonID
),
Padding
(
Padding
(
padding:
const
EdgeInsets
.
fromLTRB
(
10
,
10
,
0
,
0
),
padding:
const
EdgeInsets
.
fromLTRB
(
10
,
10
,
0
,
0
),
child:
Row
(
child:
Row
(
...
...
lib/app/module/lession/widgets/play_video.dart
deleted
100644 → 0
View file @
62966e8d
// import 'package:flutter/cupertino.dart';
// import 'package:flutter/material.dart';
// import 'package:flutter/services.dart';
// import 'package:youtube_player_flutter/youtube_player_flutter.dart';
//
// class PlayVideoPage extends StatefulWidget {
// String link;
// PlayVideoPage({required this.link,Key? key}) : super(key: key);
//
// @override
// State<PlayVideoPage> createState() => _PlayVideoPageState();
// }
//
// class _PlayVideoPageState extends State<PlayVideoPage> {
//
// 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
// Widget build(BuildContext context) {
// return
//
// YoutubePlayerBuilder(
// onExitFullScreen: () {
// SystemChrome.setPreferredOrientations(DeviceOrientation.values);
// },
// player: YoutubePlayer(
// controller: _controller,
// showVideoProgressIndicator: true,
// progressIndicatorColor: Colors.blueAccent,
// // onReady: () {
// // _isPlayerReady = true;
// // },
// // onEnded: (data) {
// // _controller
// // .load(_ids[(_ids.indexOf(data.videoId) + 1) % _ids.length]);
// // },
// ),
// builder: (context, player) => Scaffold(
// appBar: AppBar(),
// body: Container(child: player),
// ),
// );
// }
// }
lib/app/module/login/widget/login_widget.dart
View file @
7b73b6a0
import
'package:flutter/material.dart'
;
import
'package:flutter/material.dart'
;
import
'package:flutter_bloc/flutter_bloc.dart'
;
import
'package:flutter_bloc/flutter_bloc.dart'
;
import
'package:ongbut_ntmanh/const/colors.dart'
;
import
'../bloc/login_bloc.dart'
;
import
'../bloc/login_bloc.dart'
;
import
'../model/login_model.dart'
;
import
'../model/login_model.dart'
;
...
@@ -13,7 +14,12 @@ class LoginPage extends StatelessWidget {
...
@@ -13,7 +14,12 @@ class LoginPage extends StatelessWidget {
Widget
build
(
BuildContext
context
)
{
Widget
build
(
BuildContext
context
)
{
return
return
BlocConsumer
<
LoginBloc
,
LoginState
>(
BlocConsumer
<
LoginBloc
,
LoginState
>(
listener:
(
context
,
state
)
async
{},
listener:
(
context
,
state
)
async
{
// hàm sẽ đc gọi mỗi khi có sự thay đổi state của Bloc.ví dụ:
// if(state is MyStateSuccess){
// // Thực hiện hành động
// }
},
builder:
(
context
,
state
)
{
builder:
(
context
,
state
)
{
return
return
Column
(
Column
(
...
@@ -41,7 +47,11 @@ class LoginPage extends StatelessWidget {
...
@@ -41,7 +47,11 @@ class LoginPage extends StatelessWidget {
),
),
OutlinedButton
(
OutlinedButton
(
style:
OutlinedButton
.
styleFrom
(
minimumSize:
Size
(
200
,
50
)),
style:
OutlinedButton
.
styleFrom
(
minimumSize:
Size
(
400
,
50
),
backgroundColor:
AppColors
.
primary
,
shape:
RoundedRectangleBorder
(
borderRadius:
BorderRadius
.
circular
(
20.0
),
),
),
onPressed:
()
async
{
onPressed:
()
async
{
BlocProvider
.
of
<
LoginBloc
>(
context
).
add
(
BlocProvider
.
of
<
LoginBloc
>(
context
).
add
(
RequestLogin
(
RequestLogin
(
...
@@ -51,6 +61,7 @@ class LoginPage extends StatelessWidget {
...
@@ -51,6 +61,7 @@ class LoginPage extends StatelessWidget {
},
},
child:
Text
(
"Submit Form"
.
toUpperCase
(),
child:
Text
(
"Submit Form"
.
toUpperCase
(),
style:
const
TextStyle
(
style:
const
TextStyle
(
color:
AppColors
.
white
,
fontWeight:
FontWeight
.
bold
),)
fontWeight:
FontWeight
.
bold
),)
),
),
BlocBuilder
<
LoginBloc
,
LoginState
>(
BlocBuilder
<
LoginBloc
,
LoginState
>(
...
...
lib/app/module/playvideo/page/play_video.dart
View file @
7b73b6a0
...
@@ -14,9 +14,6 @@ class PlayVideoPage extends StatefulWidget {
...
@@ -14,9 +14,6 @@ class PlayVideoPage extends StatefulWidget {
class
_PlayVideoPageState
extends
State
<
PlayVideoPage
>
{
class
_PlayVideoPageState
extends
State
<
PlayVideoPage
>
{
late
YoutubePlayerController
_controller
;
late
YoutubePlayerController
_controller
;
// late TextEditingController _idController;
// late TextEditingController _idController;
// late TextEditingController _seekToController;
// late TextEditingController _seekToController;
...
...
lib/app/ui/navigationbottom/home_page.dart
View file @
7b73b6a0
import
'package:flutter/material.dart'
;
import
'package:flutter/material.dart'
;
import
'package:ongbut_ntmanh/app/module/comment/model/comment_model.dart'
;
import
'package:ongbut_ntmanh/app/module/comment/model/comment_model.dart'
;
import
'package:ongbut_ntmanh/app/module/coursedetail/widgets/course_detail.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'
;
...
@@ -8,7 +7,6 @@ import '../../module/comment/widgets/comment_widget.dart';
...
@@ -8,7 +7,6 @@ import '../../module/comment/widgets/comment_widget.dart';
import
'../../module/course/widgets/course_widget.dart'
;
import
'../../module/course/widgets/course_widget.dart'
;
import
'../../module/login/widget/login_widget.dart'
;
import
'../../module/login/widget/login_widget.dart'
;
import
'../../module/new/widgets/new_widget.dart'
;
import
'../../module/new/widgets/new_widget.dart'
;
import
'../../module/register/model/school_model.dart'
;
import
'../../module/school/widgets/school_widget.dart'
;
import
'../../module/school/widgets/school_widget.dart'
;
import
'../search_page.dart'
;
import
'../search_page.dart'
;
...
@@ -37,19 +35,6 @@ class HomePage extends StatefulWidget {
...
@@ -37,19 +35,6 @@ class HomePage extends StatefulWidget {
class
_HomePageState
extends
State
<
HomePage
>
{
class
_HomePageState
extends
State
<
HomePage
>
{
CommentModel
?
commentModel
;
CommentModel
?
commentModel
;
// final List<String> items = [
// '2001',
// '2002',
// '2003',
// '2004',
// '2005',
// '2006',
// '2007',
// '2008',
// ];
@override
@override
Widget
build
(
BuildContext
context
)
{
Widget
build
(
BuildContext
context
)
{
...
@@ -63,7 +48,6 @@ class _HomePageState extends State<HomePage> {
...
@@ -63,7 +48,6 @@ class _HomePageState extends State<HomePage> {
Container
(
Container
(
alignment:
Alignment
.
center
,
alignment:
Alignment
.
center
,
transformAlignment:
Alignment
.
center
,
transformAlignment:
Alignment
.
center
,
// margin: EdgeInsets.fromLTRB(20, 0, 20, 0),
height:
checkLandscape
(
context
)?
getHeight
(
context
)*
0.6
:
getHeight
(
context
)*
0.22
,
height:
checkLandscape
(
context
)?
getHeight
(
context
)*
0.6
:
getHeight
(
context
)*
0.22
,
width:
checkLandscape
(
context
)?
getWidth
(
context
)*
1
:
getWidth
(
context
)*
1
,
width:
checkLandscape
(
context
)?
getWidth
(
context
)*
1
:
getWidth
(
context
)*
1
,
decoration:
BoxDecoration
(
decoration:
BoxDecoration
(
...
...
lib/app/ui/search_page.dart
View file @
7b73b6a0
import
'dart:async'
;
import
'dart:async'
;
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'
;
import
'package:ongbut_ntmanh/app/module/course/model/list_data.dart'
;
import
'package:ongbut_ntmanh/app/module/course/model/list_data.dart'
;
import
'../../const/colors.dart'
;
import
'../../const/colors.dart'
;
import
'../../res/images/images.dart'
;
import
'../module/comment/model/comment_model.dart'
;
import
'../module/course/bloc/course_bloc.dart'
;
import
'../module/course/bloc/course_bloc.dart'
;
import
'../module/course/model/course_model.dart'
;
import
'../module/course/model/course_model.dart'
;
import
'../module/coursedetail/widgets/course_detail.dart'
;
import
'../module/coursedetail/widgets/course_detail.dart'
;
...
@@ -23,7 +19,7 @@ class SearchWidget extends StatelessWidget {
...
@@ -23,7 +19,7 @@ class SearchWidget extends StatelessWidget {
RequestCourse
(
context:
context
));
RequestCourse
(
context:
context
));
return
return
Scaffold
(
Scaffold
(
appBar:
AppBar
(
title:
Text
(
'
asdsad
'
),),
appBar:
AppBar
(
title:
Text
(
'
Tat ca cac khoa hoc
'
),),
body:
body:
BlocBuilder
<
CourseBloc
,
CourseState
>(
BlocBuilder
<
CourseBloc
,
CourseState
>(
builder:
(
context
,
state
)
{
builder:
(
context
,
state
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment