Initial commit: Penyerahan final Source code Tugas Akhir
This commit is contained in:
229
lib/screens/detail_course/components/instruktur.dart
Normal file
229
lib/screens/detail_course/components/instruktur.dart
Normal file
@ -0,0 +1,229 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_html/flutter_html.dart';
|
||||
import 'package:flutter_rating_bar/flutter_rating_bar.dart';
|
||||
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
||||
import 'package:initial_folder/size_config.dart';
|
||||
import 'package:initial_folder/theme.dart';
|
||||
|
||||
class Instruktur extends StatefulWidget {
|
||||
const Instruktur({
|
||||
Key? key,
|
||||
required this.id,
|
||||
this.instructor,
|
||||
this.bio,
|
||||
this.rating,
|
||||
this.review,
|
||||
this.totalStudent,
|
||||
this.totalLesson,
|
||||
this.video = false,
|
||||
this.fotoProfile,
|
||||
this.headline,
|
||||
}) : super(key: key);
|
||||
final String id;
|
||||
final String? instructor;
|
||||
final String? bio;
|
||||
final String? rating;
|
||||
final String? review;
|
||||
final String? fotoProfile;
|
||||
final String? totalLesson;
|
||||
final String? totalStudent;
|
||||
final String? headline;
|
||||
final bool video;
|
||||
|
||||
@override
|
||||
State<Instruktur> createState() => _InstrukturState();
|
||||
}
|
||||
|
||||
class _InstrukturState extends State<Instruktur> {
|
||||
bool isExpanded = false;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
margin: EdgeInsets.symmetric(horizontal: 10, vertical: 10),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
'Instruktur Kursus',
|
||||
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16),
|
||||
),
|
||||
const SizedBox(height: 10),
|
||||
Container(
|
||||
decoration: BoxDecoration(
|
||||
color: const Color(0xFF212121),
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
const SizedBox(height: 16),
|
||||
Container(
|
||||
margin: EdgeInsets.only(left: 10),
|
||||
child: CircleAvatar(
|
||||
radius: 40,
|
||||
backgroundColor: Colors.amber,
|
||||
backgroundImage: widget.fotoProfile == null
|
||||
? AssetImage("assets/images/Profile Image.png")
|
||||
: NetworkImage(widget.fotoProfile!)
|
||||
as ImageProvider,
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
Container(
|
||||
margin: EdgeInsets.only(left: 10),
|
||||
child: Text(
|
||||
widget.instructor ?? '',
|
||||
style: TextStyle(fontSize: 15),
|
||||
),
|
||||
),
|
||||
SizedBox(height: 2),
|
||||
widget.headline != null
|
||||
? Container(
|
||||
margin: EdgeInsets.only(left: 10),
|
||||
child: Text(
|
||||
widget.headline!,
|
||||
style: TextStyle(fontSize: 13),
|
||||
),
|
||||
)
|
||||
: const SizedBox(),
|
||||
SizedBox(height: 10),
|
||||
Container(
|
||||
margin: EdgeInsets.only(left: 10),
|
||||
child: Row(
|
||||
children: [
|
||||
RatingBarIndicator(
|
||||
itemSize: 11,
|
||||
rating: double.parse(widget.rating ?? '0'),
|
||||
direction: Axis.horizontal,
|
||||
itemCount: 5,
|
||||
itemBuilder: (context, _) => const FaIcon(
|
||||
FontAwesomeIcons.solidStar,
|
||||
color: Colors.amber,
|
||||
),
|
||||
),
|
||||
SizedBox(width: 4),
|
||||
Text(
|
||||
double.parse(widget.rating ?? '0').toString(),
|
||||
style: TextStyle(fontSize: 10),
|
||||
),
|
||||
SizedBox(width: 4),
|
||||
Text(
|
||||
'(${widget.review ?? '0'})',
|
||||
style: TextStyle(fontSize: 10),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Container(
|
||||
height: 40,
|
||||
margin: EdgeInsets.only(left: 10, top: 1),
|
||||
child: Row(
|
||||
children: [
|
||||
Text(
|
||||
'${widget.totalStudent ?? '0'} Murid',
|
||||
style: primaryTextStyle.copyWith(
|
||||
color: secondaryColor,
|
||||
fontSize: getProportionateScreenWidth(10),
|
||||
letterSpacing: 0.5),
|
||||
),
|
||||
SizedBox(width: 10),
|
||||
Text(
|
||||
'${widget.totalLesson ?? ''} Pelajaran',
|
||||
style: primaryTextStyle.copyWith(
|
||||
color: secondaryColor,
|
||||
fontSize: getProportionateScreenWidth(10),
|
||||
letterSpacing: 0.5),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
if (widget.bio == null || widget.bio!.isEmpty)
|
||||
Padding(
|
||||
padding: EdgeInsets.only(
|
||||
left: getProportionateScreenHeight(10),
|
||||
right: getProportionateScreenHeight(10),
|
||||
bottom: getProportionateScreenHeight(10)),
|
||||
child: Text(
|
||||
'*Instruktur belum mencantumkan profil*',
|
||||
style: TextStyle(
|
||||
fontSize: getProportionateScreenWidth(10),
|
||||
fontWeight: reguler,
|
||||
fontFamily: 'Noto Sans',
|
||||
color: secondaryColor,
|
||||
),
|
||||
),
|
||||
)
|
||||
else
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Padding(
|
||||
padding: EdgeInsets.only(
|
||||
left: getProportionateScreenHeight(5),
|
||||
right: getProportionateScreenHeight(10)),
|
||||
child: isExpanded
|
||||
? Html(
|
||||
data: widget.bio,
|
||||
style: {
|
||||
"body": Style(
|
||||
fontSize: FontSize(12),
|
||||
fontWeight: reguler,
|
||||
fontFamily: 'Noto Sans',
|
||||
color: secondaryColor),
|
||||
},
|
||||
)
|
||||
: Html(
|
||||
data: widget.bio != null &&
|
||||
widget.bio!.length > 200
|
||||
? widget.bio!.substring(0, 200)
|
||||
: widget.bio!,
|
||||
style: {
|
||||
"body": Style(
|
||||
fontSize: FontSize(12),
|
||||
fontWeight: reguler,
|
||||
fontFamily: 'Noto Sans',
|
||||
color: secondaryColor),
|
||||
},
|
||||
),
|
||||
),
|
||||
if (widget.bio!.isNotEmpty &&
|
||||
(widget.bio!.length > 70 ||
|
||||
widget.bio!.length > 200))
|
||||
Padding(
|
||||
padding: EdgeInsets.only(
|
||||
left: getProportionateScreenHeight(7)),
|
||||
child: TextButton(
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
isExpanded = !isExpanded;
|
||||
});
|
||||
},
|
||||
child: Text(
|
||||
isExpanded
|
||||
? 'Tampilkan Lebih Sedikit'
|
||||
: 'Tampilkan Lebih Banyak',
|
||||
style: primaryTextStyle.copyWith(
|
||||
fontWeight: semiBold,
|
||||
color: primaryColor,
|
||||
fontSize: getProportionateScreenWidth(12),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 30)
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user