mobdr/lib/ui/reusable/global_widget.dart

371 lines
11 KiB
Dart

import 'dart:math';
import 'package:mobdr/config/constant.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class GlobalWidget {
Random _random = Random();
// create random color for polylines
Color _getColor() {
return Color.fromARGB(
255, _random.nextInt(255), _random.nextInt(255), _random.nextInt(255));
}
List<IconData> _iconList = [
Icons.star_rate,
Icons.code,
Icons.adb,
Icons.android,
Icons.select_all,
Icons.eco,
Icons.label_important,
Icons.album,
Icons.scatter_plot,
Icons.memory,
Icons.audiotrack,
Icons.miscellaneous_services,
Icons.whatshot
];
PreferredSizeWidget globalAppBar() {
return AppBar(
iconTheme: IconThemeData(
color: Colors.black, //change your color here
),
elevation: 0,
backgroundColor: Colors.white,
systemOverlayStyle: SystemUiOverlayStyle.dark,
centerTitle: true,
title: Image.asset('assets/images/logo_horizontal.png', height: 24),
bottom: PreferredSize(
child: Container(
color: Colors.grey[100],
height: 1.0,
),
preferredSize: Size.fromHeight(1.0)),
);
}
Widget screenTabList(
{required BuildContext context,
required int id,
required String title,
required IconData icon,
String? desc,
required StatefulWidget page}) {
return GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
Navigator.push(context, MaterialPageRoute(builder: (context) => page));
},
child: Container(
margin: EdgeInsets.only(top: 16, bottom: 16),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(width: 20, child: Text(id.toString())),
SizedBox(width: 24),
Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(6),
),
elevation: 2,
color: Colors.white,
child: Container(
width: 48,
height: 48,
child: Icon(icon, color: _getColor()),
)),
SizedBox(width: 24),
Expanded(
child: Container(
margin: EdgeInsets.only(top: 2),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(title,
style: TextStyle(
fontSize: 14, fontWeight: FontWeight.w400)),
SizedBox(height: 4),
(desc == null)
? Wrap()
: Text(desc,
style: TextStyle(
fontSize: 12, color: Colors.grey[700])),
(desc == null) ? Wrap() : SizedBox(height: 4),
],
),
),
)
],
),
),
);
}
Widget screenDetailList(
{required BuildContext context,
required String title,
required StatefulWidget page}) {
Color _color = _getColor();
return GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
Navigator.push(context, MaterialPageRoute(builder: (context) => page));
},
child: Container(
margin: EdgeInsets.symmetric(vertical: 8),
child: Card(
elevation: 0.5,
child: Container(
margin: EdgeInsets.all(18),
child: Row(
children: [
Icon(_iconList[_random.nextInt(_iconList.length)],
color: _color, size: 26),
SizedBox(width: 24),
Expanded(
child: Text(title,
style: TextStyle(
fontSize: 16,
color: BLACK55,
fontWeight: FontWeight.w500)),
),
Icon(Icons.chevron_right, size: 30, color: _color),
],
),
),
),
),
);
}
Widget createDetailWidget({required String title, required String desc}) {
return Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
child: Text(title,
style: TextStyle(
fontSize: 18, color: BLACK21, fontWeight: FontWeight.w500)),
),
Container(
margin: EdgeInsets.only(top: 8),
child: Container(
child: Text(desc,
style: TextStyle(
fontSize: 15, color: BLACK77, letterSpacing: 0.5)),
),
),
Container(
margin: EdgeInsets.only(top: 24, bottom: 8),
child: Text('Example',
style: TextStyle(
fontSize: 18, color: BLACK21, fontWeight: FontWeight.w500)),
),
],
);
}
Widget createDetailWidget2(
{required String title, required String desc, required IconData icon}) {
return Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
child: Text(title,
style: TextStyle(
fontSize: 18, color: BLACK21, fontWeight: FontWeight.w500)),
),
Container(
margin: EdgeInsets.only(top: 24),
child: Row(
children: [
Flexible(
flex: 5,
child: Container(
child: Text(desc,
style: TextStyle(
fontSize: 15, color: BLACK77, letterSpacing: 0.5)),
)),
Flexible(
flex: 2,
child: Container(
alignment: Alignment.center,
child: Icon(icon, size: 50, color: SOFT_BLUE)))
],
),
),
Container(
margin: EdgeInsets.only(top: 24, bottom: 16),
child: Text('Example',
style: TextStyle(
fontSize: 18, color: BLACK21, fontWeight: FontWeight.w500)),
),
],
);
}
Widget createButton({
Color backgroundColor = Colors.blue,
Color textColor = Colors.white,
required String buttonName,
required Function onPressed,
}) {
return TextButton(
style: ButtonStyle(
backgroundColor: MaterialStateProperty.resolveWith<Color>(
(Set<MaterialState> states) => backgroundColor,
),
overlayColor: MaterialStateProperty.all(Colors.transparent),
shape: MaterialStateProperty.all(RoundedRectangleBorder(
borderRadius: BorderRadius.circular(3.0),
)),
),
onPressed: onPressed as void Function(),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8),
child: Text(
buttonName,
style: TextStyle(fontSize: 14, color: textColor),
textAlign: TextAlign.center,
),
));
}
Widget createDefaultLabel(context) {
return Container(
padding: EdgeInsets.fromLTRB(8, 2, 8, 2),
decoration: BoxDecoration(
color: SOFT_BLUE, borderRadius: BorderRadius.circular(2)),
child: Row(
children: [
Text('Default', style: TextStyle(color: Colors.white, fontSize: 13)),
SizedBox(
width: 4,
),
Icon(Icons.done, color: Colors.white, size: 11)
],
),
);
}
Widget createRatingBar({double rating = 5, double size = 24}) {
if (rating < 0) {
rating = 0;
} else if (rating > 5) {
rating = 5;
}
bool _absolute = false;
int _fullStar = 0;
int _emptyStar = 0;
if (rating == 0 ||
rating == 1 ||
rating == 2 ||
rating == 3 ||
rating == 4 ||
rating == 5) {
_absolute = true;
} else {
double _dec = (rating - int.parse(rating.toString().substring(0, 1)));
if (_dec > 0 && _dec < 1) {
if (_dec >= 0.25 && _dec <= 0.75) {
_absolute = false;
} else {
_absolute = true;
if (_dec < 0.25) {
_emptyStar = 1;
} else if (_dec > 0.75) {
_fullStar = 1;
}
}
}
}
return Row(
children: [
for (int i = 1; i <= rating + _fullStar; i++)
Icon(Icons.star, color: Colors.yellow[700], size: size),
!_absolute
? Icon(Icons.star_half, color: Colors.yellow[700], size: size)
: SizedBox.shrink(),
for (int i = 1; i <= (5 - rating + _emptyStar); i++)
Icon(Icons.star_border, color: Colors.yellow[700], size: size),
],
);
}
Widget customNotifIcon(
{int count = 0,
Color notifColor = Colors.grey,
Color labelColor = Colors.pinkAccent,
double notifSize = 24,
double labelSize = 14,
String position = 'right'}) {
double? posLeft;
double? posRight = 0;
if (position == 'left') {
posLeft = 0;
posRight = null;
}
return Stack(
children: <Widget>[
Icon(Icons.notifications, color: notifColor, size: notifSize),
Positioned(
left: posLeft,
right: posRight,
child: Container(
padding: EdgeInsets.all(1),
decoration: BoxDecoration(
color: labelColor,
borderRadius: BorderRadius.circular(labelSize),
),
constraints: BoxConstraints(
minWidth: labelSize,
minHeight: labelSize,
),
child: Center(
child: Text(
count.toString(),
style: TextStyle(
color: Colors.white,
fontSize: 8,
),
textAlign: TextAlign.center,
),
),
),
)
],
);
}
Widget buildProgressIndicator(lastData) {
if (lastData == false) {
return new Padding(
padding: const EdgeInsets.all(8.0),
child: new Center(
child: new Opacity(
opacity: 1,
child: new Container(
height: 20,
width: 20,
margin: EdgeInsets.all(5),
child: CircularProgressIndicator(
valueColor: new AlwaysStoppedAnimation<Color>(PRIMARY_COLOR),
strokeWidth: 2.0,
),
),
),
),
);
} else {
return SizedBox.shrink();
}
}
}