BBM-Tracking/lib/pages/form-tambah-data-bensin/index.dart

1496 lines
45 KiB
Dart

import 'dart:async';
import 'dart:io';
import 'dart:math';
import 'package:animated_custom_dropdown/custom_dropdown.dart';
import 'package:bbm_tracking/bloc/bbm_bloc.dart';
import 'package:bbm_tracking/model/bensin_m.dart';
import 'package:bbm_tracking/model/kendaraan_m.dart';
import 'package:bbm_tracking/model/photo_m.dart';
import 'package:bbm_tracking/model/transaksi_m.dart';
import 'package:bbm_tracking/pages/component/success_dialog_box.dart';
import 'package:bbm_tracking/pages/form-tambah-data-bensin/displayImage.dart';
import 'package:bbm_tracking/pages/home.dart';
import 'package:bbm_tracking/resource/popup/popup.dart';
import 'package:bbm_tracking/resource/resource.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:image_gallery_saver/image_gallery_saver.dart';
// import 'package:geolocator/geolocator.dart';
import 'package:intl/intl.dart';
import 'package:currency_text_input_formatter/currency_text_input_formatter.dart';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'dart:developer' as developer;
import 'package:geolocator/geolocator.dart';
import 'package:location/location.dart';
import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:uri_to_file/uri_to_file.dart';
class FormTamabahDataBensin extends StatefulWidget {
KendaraanModel kendaraanModel;
// TransaksiModel transaksiModel;
final CameraDescription camera;
FormTamabahDataBensin(
{required this.kendaraanModel, required this.camera, Key? key})
: super(key: key);
// FormTamabahDataBensin(this.transaksiModel, {required this.kendaraanModel, required this.camera});
@override
State<FormTamabahDataBensin> createState() => _FormTamabahDataBensinState();
}
class _FormTamabahDataBensinState extends State<FormTamabahDataBensin>
with RestorationMixin {
ConnectivityResult _connectionStatus = ConnectivityResult.none;
final Connectivity _connectivity = Connectivity();
late StreamSubscription<ConnectivityResult> _connectivitySubscription;
late KendaraanModel dataKendaraan;
var formatDate = DateFormat("yyyy-MM-dd");
DateTime dateNow = DateTime.now();
late String selectedDate = formatDate.format(dateNow).toString();
late TimeOfDay _time = TimeOfDay(hour: dateNow.hour, minute: dateNow.minute);
late bool conditionBbm = false;
late String literTxt = '';
late String hargaPerLiterTxt = '';
late String totalBiayaTxt = '';
final String wifiOff =
"Maps tidak dapat dibuka, Anda saat ini sedang di luar jaringan. Silakan periksa jaringan internet Anda";
final String gpsOff = "Maps tidak dapat dibuka, GPS tidak aktif";
final odometerController = TextEditingController();
final bbmController = TextEditingController();
final dateController = TextEditingController();
final timeController = TextEditingController();
final literController = TextEditingController();
final totalBiayaController = TextEditingController();
final alamatController = TextEditingController();
final catatanController = TextEditingController();
final hargaPerLiterController = TextEditingController();
final lokasiController = TextEditingController();
GoogleMapController? _controllerMap;
Location currentLocation = Location();
static const CameraPosition initialCameraPosition = CameraPosition(
target: LatLng(37.42796133580664, -122.085749655962), zoom: 14);
late bool _gpsEnable = false;
late bool _internetEnable = false;
Set<Marker> _markers = {};
late CameraController _cameraController;
late Future<void> _initializeControllerFuture;
List<File?> _image = [];
File? tryImage;
bool _submittedForm = false;
BensinModel? dtBensin;
String latitude = "0";
String langitude = "0";
List<PhotoModel> dataPhoto = <PhotoModel>[];
bool _isButtonDisabled = false;
bool isLoading = false;
bool markerLoading = false;
@override
void initState() {
// TODO: implement initState
super.initState();
Future.delayed(Duration.zero, () {
timeController.text = _time.format(context).toString();
dateController.text = selectedDate;
});
initConnectivity();
// checkGPS();
_connectivitySubscription =
_connectivity.onConnectivityChanged.listen(_updateConnectionStatus);
dataKendaraan = widget.kendaraanModel;
bbmController.addListener(() {
if (bbmController.text == "") {
conditionBbm == true;
} else {
conditionBbm = false;
dtBensin = listBensin
.firstWhere((element) => element.text == bbmController.text);
hargaPerLiterController.text =
CurrencyFormat.convertToIdr(dtBensin!.harga, 0);
hargaPerLiterTxt = dtBensin!.harga.toString();
}
});
totalBiayaController.addListener(() {
var txt = _replaceFormat(totalBiayaController.text);
totalBiayaTxt = txt;
_counter();
});
hargaPerLiterController.addListener(() {
var txt = _replaceFormat(hargaPerLiterController.text);
hargaPerLiterTxt = txt;
_counter();
});
setState(() {
initialLocation();
isLoading = true;
// getLocation();
});
_cameraController = CameraController(
widget.camera,
ResolutionPreset.medium,
);
_initializeControllerFuture = _cameraController.initialize();
}
@override
void dispose() {
super.dispose();
_controllerMap!.dispose();
_connectivitySubscription.cancel();
_cameraController.dispose();
odometerController.dispose();
bbmController.dispose();
dateController.dispose();
timeController.dispose();
literController.dispose();
totalBiayaController.dispose();
alamatController.dispose();
catatanController.dispose();
hargaPerLiterController.dispose();
lokasiController.dispose();
}
void initialLocation() async {
Position position = await checkGPS();
_controllerMap?.animateCamera(
CameraUpdate.newCameraPosition(
CameraPosition(
target: LatLng(
position.latitude,
position.longitude,
),
zoom: 16,
),
),
);
_markers.clear();
latitude = position.latitude.toString();
langitude = position.longitude.toString();
setState(() {
_markers.add(
Marker(
markerId: const MarkerId('currentLocation'),
position: LatLng(position.latitude, position.longitude),
),
);
markerLoading = true;
});
}
Future<Position> checkGPS() async {
bool serviceEnabled;
LocationPermission permission;
// Test if location services are enabled.
serviceEnabled = await Geolocator.isLocationServiceEnabled();
if (!serviceEnabled) {
// Location services are not enabled don't continue
// accessing the position and request users of the
// App to enable the location services.
return Future.error('Location services are disabled.');
} else {
_gpsEnable = true;
}
permission = await Geolocator.checkPermission();
if (permission == LocationPermission.denied) {
permission = await Geolocator.requestPermission();
if (permission == LocationPermission.denied) {
// Permissions are denied, next time you could try
// requesting permissions again (this is also where
// Android's shouldShowRequestPermissionRationale
// returned true. According to Android guidelines
// your App should show an explanatory UI now.
return Future.error('Location permissions are denied');
}
}
if (permission == LocationPermission.deniedForever) {
// Permissions are denied forever, handle appropriately.
return Future.error(
'Location permissions are permanently denied, we cannot request permissions.');
}
// When we reach here, permissions are granted and we can
// continue accessing the position of the device.
return await Geolocator.getCurrentPosition();
}
Future<void> initConnectivity() async {
late ConnectivityResult result;
// Platform messages may fail, so we use a try/catch PlatformException.
try {
result = await _connectivity.checkConnectivity();
} on PlatformException catch (e) {
developer.log('Couldn\'t check connectivity status', error: e);
return;
}
// If the widget was removed from the tree while the asynchronous platform
// message was in flight, we want to discard the reply rather than calling
// setState to update our non-existent appearance.
if (!mounted) {
return Future.value(null);
}
return _updateConnectionStatus(result);
}
Future<void> _updateConnectionStatus(ConnectivityResult result) async {
setState(() {
if (result != ConnectivityResult.none) {
_internetEnable = true;
}
_connectionStatus = result;
});
}
List<String> listNamaBensin = List.from(listBensin.map((e) => e.text));
RangeLabels labels = RangeLabels('1', "10");
RangeValues _rangeValues = RangeValues(1, 10);
@override
String? get restorationId => 'main';
final RestorableDateTime _selectedDate = RestorableDateTime(DateTime.now());
late final RestorableRouteFuture<DateTime?> _restorableDatePickerRouteFuture =
RestorableRouteFuture<DateTime?>(
onComplete: _selectDate,
onPresent: (NavigatorState navigator, Object? arguments) {
return navigator.restorablePush(
_datePickerRoute,
arguments: _selectedDate.value.millisecondsSinceEpoch,
);
},
);
static Route<DateTime> _datePickerRoute(
BuildContext context,
Object? arguments,
) {
return DialogRoute<DateTime>(
context: context,
builder: (BuildContext context) {
return DatePickerDialog(
restorationId: 'date_picker_dialog',
initialEntryMode: DatePickerEntryMode.calendarOnly,
initialDate: DateTime.fromMillisecondsSinceEpoch(arguments! as int),
firstDate: DateTime(2000),
lastDate: DateTime.now(),
);
},
);
}
@override
void restoreState(RestorationBucket? oldBucket, bool initialRestore) {
registerForRestoration(_selectedDate, 'selected_date');
registerForRestoration(
_restorableDatePickerRouteFuture, 'date_picker_route_future');
}
void _selectDate(DateTime? newSelectedDate) {
if (newSelectedDate != null) {
setState(() {
_selectedDate.value = newSelectedDate;
dateController.text =
DateFormat("yyyy-MM-dd").format(newSelectedDate).toString();
selectedDate =
DateFormat("yyyy-MM-dd").format(newSelectedDate).toString();
});
}
}
void _selectTime() async {
TimeOfDay? newTime = await showTimePicker(
context: context,
initialTime: _time,
);
if (newTime != null) {
setState(() {
_time = newTime;
timeController.text = _time.format(context).toString();
});
}
}
String _replaceFormat(String data) {
var txt = data.replaceAll("Rp. ", '');
txt = txt.replaceAll(".", '');
return txt;
}
void _counter() {
if (bbmController.text == "") {
showDialog(
context: context,
builder: (BuildContext context) {
return PopUp(
text: "Maaf, Silakan pilih jenis BBM terlebih dahulu",
param: "negative",
);
},
);
} else {
double res = 0;
hargaPerLiterTxt != '' && totalBiayaTxt != ''
? res = int.parse(totalBiayaTxt) / int.parse(hargaPerLiterTxt)
: res = 0;
// BensinModel dtBensin = listBensin
// .firstWhere((element) => element.text == bbmController.text);
if (res == 0) {
literController.text = '';
literTxt = '';
} else {
literController.text = res.toStringAsFixed(2).toString();
literTxt = res.toStringAsFixed(2).toString();
}
}
}
void _checkBBMselected() {
conditionBbm == true
? showDialog(
context: context,
builder: (BuildContext context) {
return PopUp(
text: "Maaf, Silakan pilih jenis BBM terlebih dahulu",
param: "negative",
);
},
)
: null;
}
String _setFormat(data) {
return CurrencyFormat.convertToIdr(data, 0);
}
Future<void> _navigateAndDisplayImage(
BuildContext context,
File file,
) async {
final result = await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => DisplayImage(imagePath: file),
),
);
if (!mounted) return;
if (result != null) {
setState(() {
_image.remove(result);
});
print(_image);
}
}
void _submitted() async {
setState(() {
_isButtonDisabled = true;
});
var rng = Random();
String _kodeTransaksi =
"BBM-T/F0001/${bbmController.text}/XIII/${rng.nextInt(999999)}";
final dateNow = DateTime.now().toString();
print("printing");
await insertedImageToGallery(dateNow, _kodeTransaksi);
Future.delayed(Duration(seconds: 2), () {
insertedTransaksi(_kodeTransaksi);
});
}
Future<void> insertedTransaksi(String _kodeTransaksi) async {
String strsub;
if (timeController.text.toString()[4] == " ") {
strsub = timeController.text.substring(0, 4) + ":00";
} else {
strsub = timeController.text.substring(0, 5) + ":00";
}
TransaksiModel transaksiModel = TransaksiModel(
id: 0,
kendaraanId: dataKendaraan.id.toString(),
bensinId: dtBensin!.id.toString(),
kodeTransaksi: _kodeTransaksi,
tanggalTransaksi: DateFormat("yyyy-MM-dd").parse(dateController.text),
waktuTransaksi: DateFormat("HH:mm:ss").parse(strsub),
lokasiPertamina: lokasiController.text,
totalLiter: literController.text,
hargaPerLiter: int.parse(hargaPerLiterTxt),
totalBayar: int.parse(totalBiayaTxt),
odometer: odometerController.text,
catatan: catatanController.text,
lat: latitude,
lang: langitude,
status: 1,
);
context
.read<BbmBloc>()
.add(BBMInsertTransaksion(transaksi: transaksiModel, photo: dataPhoto));
setState(() {
BlocProvider.of<BbmBloc>(context).add(BBMStarted());
});
Navigator.pop(context);
showDialog(
context: context,
builder: (BuildContext context) {
return SuccessDialogBox(deskripsi: "Berhasil Menambah Data");
},
);
}
Future<void> insertedImageToGallery(
String dateNow, String _kodeTransaksi) async {
_image.forEach((element) async {
final result = await ImageGallerySaver.saveImage(
Uint8List.fromList(element!.readAsBytesSync()),
quality: 60,
name: dateNow,
);
// File file = await toFile(Uri.parse(result['filePath']).toString());
// print("files = "+file.path.toString());
PhotoModel modelPhoto = PhotoModel(
id: 0,
transaksi_id: _kodeTransaksi,
linkPhoto: result['filePath'],
namePhoto: dateNow,
);
setState(() {
dataPhoto.add(modelPhoto);
});
});
}
String? _errorText(TextEditingController controller) {
var val = controller.value.text.isEmpty ? "Tidak Boleh Kosong" : null;
return val;
}
Future<bool> _onWillPop() async {
Navigator.pop(context);
return false;
}
@override
Widget build(BuildContext context) {
return isLoading ? WillPopScope(
onWillPop: () => _onWillPop(),
child: Scaffold(
backgroundColor: Color(0xffE3EAEA),
body: SingleChildScrollView(
child: Container(
margin: EdgeInsets.only(
top: 50,
),
child: Padding(
padding: EdgeInsets.all(10),
child: Column(
children: [
BackButton(),
SizedBox(
height: 10,
),
Container(
width: double.infinity,
margin: EdgeInsets.only(top: 10),
child: Text(
"Pengisian Bahan Bakar",
style: TextStyle(
fontFamily: 'Poppins',
fontWeight: FontWeight.w500,
fontSize: 16,
color: Color(0xff3B3C48),
),
),
),
Divider(
color: Color(0xFF1A0F0F3D),
height: 2,
thickness: 2,
),
SizedBox(
height: 15,
),
Card(dataKendaraan),
Container(
width: double.infinity,
margin: EdgeInsets.only(top: 10),
child: Text(
"Masukan Data Pengisian Bahan Bakar",
style: TextStyle(
fontFamily: 'Poppins',
fontWeight: FontWeight.w500,
fontSize: 13,
color: Color(0xff1A0F0F),
),
),
),
SizedBox(
height: 5,
),
formPengisian(),
SizedBox(
height: 10,
),
formLokasiSPBU(),
SizedBox(
height: 10,
),
formGambar(),
SizedBox(
height: 10,
),
formCatatan(),
SizedBox(
height: 15,
),
SizedBox(
height: 25,
),
ButtonSave(),
],
),
),
),
),
),
) : Container();
}
Widget ButtonSave() {
return InkWell(
onTap: () {
_isButtonDisabled ? null : _submitted();
},
child: Container(
alignment: Alignment.topRight,
child: Container(
width: 80,
height: 35,
// alignment: Alignment.topRight,
padding: EdgeInsets.only(top: 9, left: 9),
decoration: BoxDecoration(
borderRadius: BorderRadius.all(
Radius.circular(8),
),
color: Color(0xFF2ECC71),
),
child: Text(
"Tambahkan",
style: TextStyle(
fontFamily: 'Poppins',
fontSize: 12,
fontWeight: FontWeight.w500,
color: Colors.white,
),
),
),
),
);
}
Widget Card(KendaraanModel dataKendaraan) {
return Container(
height: 75,
width: double.infinity,
decoration: BoxDecoration(
borderRadius: BorderRadius.all(
Radius.circular(8),
),
color: Color(0xFFFC8D05),
),
child: Row(
children: [
SizedBox(
width: 20,
),
Image.asset(
dataKendaraan.jenisKendaraan == "motor"
? "assets/images/motor.png"
: "assets/images/car.png",
width: 50,
height: 50,
),
SizedBox(
width: 20,
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
height: 15,
),
Text(
"Tipe Kendaraan : ",
style: TextStyle(
fontFamily: 'Poppins',
fontSize: 11,
color: Color(0xFF3B3C48),
),
),
SizedBox(
height: 5,
),
Text(
dataKendaraan.namaKendaraan,
style: TextStyle(
fontFamily: 'Poppins',
fontSize: 11,
fontWeight: FontWeight.w700,
color: Colors.white,
),
),
],
),
],
),
);
}
Widget BackButton() {
return InkWell(
onTap: () => Navigator.pop(context),
child: Container(
child: Container(
child: Row(
children: [
Icon(
Icons.arrow_back_ios,
size: 15,
),
Text(
"Kembali",
style: TextStyle(
fontSize: 10,
fontFamily: 'Poppins',
color: Color(0xff1A0F0F),
fontWeight: FontWeight.w400,
),
)
],
),
),
),
);
}
Widget formCatatan() {
return Container(
child: Column(
children: [
Container(
padding: EdgeInsets.only(
left: 10,
top: 3,
),
width: double.infinity,
height: 25,
decoration: BoxDecoration(
color: Color(0xFF677D81),
borderRadius: BorderRadius.all(
Radius.circular(5),
),
),
child: Text(
"Optional",
style: TextStyle(
fontFamily: 'Poppins',
fontWeight: FontWeight.w500,
fontSize: 11,
color: Color(0xffFFFFFF),
),
),
),
SizedBox(
height: 10,
),
Container(
child: Row(
children: [
Container(
child: Image.asset(
"assets/images/edit.png",
width: 34,
height: 34,
),
),
SizedBox(
width: 10,
),
Expanded(
child: Container(
child: TextField(
controller: catatanController,
maxLines: 5,
keyboardType: TextInputType.text,
decoration: InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.all(
Radius.circular(12),
),
borderSide: BorderSide(
color: Color(0xFF677D81),
),
),
// border: BoxDecoration(border:),
contentPadding: EdgeInsets.only(
top: 4,
bottom: 4,
left: 15,
right: 15,
),
hintText: "Catatan (optional)",
hintStyle: TextStyle(
fontFamily: 'Poppins',
color: Color(0xFFAEAEAE),
fontSize: 10,
fontWeight: FontWeight.w400,
),
),
),
),
),
],
),
)
],
),
);
}
Widget formGambar() {
return Container(
child: Column(
children: [
Container(
padding: EdgeInsets.only(
left: 10,
top: 3,
),
width: double.infinity,
height: 25,
decoration: BoxDecoration(
color: Color(0xFF677D81),
borderRadius: BorderRadius.all(
Radius.circular(5),
),
),
child: Text(
"Gambar",
style: TextStyle(
fontFamily: 'Poppins',
fontWeight: FontWeight.w500,
fontSize: 11,
color: Color(0xffFFFFFF),
),
),
),
SizedBox(
height: 10,
),
Row(
children: [
Container(
child: Image.asset(
"assets/images/frmImage1.png",
width: 34,
height: 34,
),
),
SizedBox(
width: 10,
),
Expanded(
child: Container(
decoration: BoxDecoration(
border: Border.all(
color: Color(0xFF677D81),
width: 1,
),
borderRadius: BorderRadius.all(
Radius.circular(4),
),
),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
children: [
InkWell(
onTap: () async {
try {
final pickedImage = await ImagePicker()
.pickImage(source: ImageSource.camera);
setState(() {
_image.add(File(pickedImage!.path));
});
} catch (e) {
// If an error occurs, log the error to the console.
print(e);
}
},
child: Container(
child: Image.asset(
"assets/images/frmAdd.png",
width: 34,
height: 34,
),
),
),
SizedBox(
width: 10,
),
Expanded(
child: Container(
height: 34,
child: ListView.builder(
itemCount: _image.length,
scrollDirection: Axis.horizontal,
itemBuilder: (BuildContext context, int index) {
return Container(
margin: EdgeInsets.symmetric(horizontal: 5),
child: InkWell(
onTap: () {
_navigateAndDisplayImage(
context, _image[index]!);
},
child: Container(
child: Image.file(
File(
_image[index]!.path,
),
width: 35,
fit: BoxFit.fill,
),
),
),
);
},
),
),
),
],
),
),
),
),
],
),
],
),
);
}
Widget formLokasiSPBU() {
return Column(
children: [
Container(
padding: EdgeInsets.only(
left: 10,
top: 3,
),
width: double.infinity,
height: 25,
decoration: BoxDecoration(
color: Color(0xFF677D81),
borderRadius: BorderRadius.all(
Radius.circular(5),
),
),
child: Text(
"Lokasi SPBU",
style: TextStyle(
fontFamily: 'Poppins',
fontWeight: FontWeight.w500,
fontSize: 11,
color: Color(0xffFFFFFF),
),
),
),
SizedBox(
height: 10,
),
SizedBox(
height: 10,
),
_internetEnable == false
? frameNegativeMaps(wifiOff)
: _gpsEnable == false
? frameNegativeMaps(gpsOff)
: framePositiveMaps(),
SizedBox(
height: 10,
),
Row(
children: [
Container(
margin: EdgeInsets.only(
top: 10,
),
child: Image.asset(
"assets/images/titikpoint.png",
width: 24,
height: 24,
),
),
SizedBox(
width: 10,
),
Expanded(
child: Container(
child: TextField(
controller: lokasiController,
keyboardType: TextInputType.text,
decoration: InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.all(
Radius.circular(12),
),
borderSide: BorderSide(
color: Color(0xFF677D81),
),
),
// border: BoxDecoration(border:),
contentPadding: EdgeInsets.only(
top: 4,
bottom: 4,
left: 15,
right: 15,
),
hintText: "Lokasi/Nama SPBU (optional)",
hintStyle: TextStyle(
fontFamily: 'Poppins',
color: Color(0xFFAEAEAE),
fontSize: 10,
fontWeight: FontWeight.w400,
),
),
),
),
),
],
),
],
);
}
Widget framePositiveMaps() {
return Container(
height: 150,
width: double.infinity,
child: GoogleMap(
initialCameraPosition: CameraPosition(
target: LatLng(48.8561, 2.2930),
zoom: 15,
),
markers: markerLoading ? _markers : {},
zoomControlsEnabled: false,
mapType: MapType.normal,
onMapCreated: (GoogleMapController controller) {
_controllerMap = controller;
},
),
);
}
Widget frameNegativeMaps(text) {
return Container(
height: 150,
width: double.infinity,
decoration: BoxDecoration(
border: Border.all(color: Color(0xFFAEAEAE)),
borderRadius: BorderRadius.all(
Radius.circular(8),
),
),
child: Column(
children: [
SizedBox(
height: 40,
),
Image.asset(
"assets/images/wifi-off.png",
width: 40,
),
Container(
width: 250,
child: Text(
text,
textAlign: TextAlign.center,
style: TextStyle(
fontFamily: 'Poppins',
color: Color(0xFF828282),
fontSize: 9,
fontWeight: FontWeight.w400,
),
),
),
],
),
);
}
Widget formPengisian() {
return Container(
width: double.infinity,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
padding: EdgeInsets.only(
left: 10,
top: 3,
),
width: double.infinity,
height: 25,
decoration: BoxDecoration(
color: Color(0xFF677D81),
borderRadius: BorderRadius.all(
Radius.circular(5),
),
),
child: Text(
"Pengisian",
style: TextStyle(
fontFamily: 'Poppins',
fontWeight: FontWeight.w500,
fontSize: 11,
color: Color(0xffFFFFFF),
),
),
),
SizedBox(
height: 10,
),
formPengisianKendaraan(),
formTanggalPengisian(),
SizedBox(
height: 10,
),
formJumlahBensin()
],
),
);
}
Widget formPengisianKendaraan() {
return Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
margin: EdgeInsets.only(
top: 10,
),
child: Image.asset(
"assets/images/radar.png",
width: 24,
height: 24,
),
),
SizedBox(
width: 10,
),
Expanded(
child: Container(
// decoration: BoxDecoration(color: Colors.greenAccent),
child: Column(
children: [
TextField(
controller: odometerController,
keyboardType: TextInputType.number,
decoration: InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.all(
Radius.circular(12),
),
borderSide: BorderSide(
color: Color(0xFF677D81),
),
),
// border: BoxDecoration(border:),
contentPadding: EdgeInsets.only(
top: 4,
bottom: 4,
left: 15,
right: 15,
),
hintText: "Odometer (km)",
errorText:
_submittedForm ? _errorText(odometerController) : null,
hintStyle: TextStyle(
fontFamily: 'Poppins',
color: Color(0xFFAEAEAE),
fontSize: 10,
fontWeight: FontWeight.w400,
),
),
),
SizedBox(
height: 10,
),
CustomDropdown.search(
fillColor: Color(0xffE3EAEA),
borderSide: BorderSide(
color: Color(0xFF677D81),
),
hintStyle: TextStyle(
fontFamily: 'Poppins',
fontSize: 11,
fontWeight: FontWeight.w400,
),
// errorText: _submitted
// ? _errorText(controller)
// : null,
items: listNamaBensin,
controller: bbmController,
hintText: "Tipe Bahan Bakar",
errorText: _submittedForm ? _errorText(bbmController) : null,
),
SizedBox(
height: 10,
),
Container(
alignment: Alignment.topLeft,
child: Text(
"Perkiraan Bensin Saat ini",
style: TextStyle(
fontSize: 10,
fontFamily: 'Poppins',
color: Color(0xff1A0F0F),
fontWeight: FontWeight.w400,
),
),
),
SizedBox(
height: 5,
),
Container(
child: RangeSlider(
divisions: 10,
activeColor: Color(0xFFFC8D05),
inactiveColor: Color(0xFFDDB05E),
min: 1,
max: 10,
labels: RangeLabels(
_rangeValues.start.round().toString(),
_rangeValues.end.round().toString(),
),
values: _rangeValues,
onChanged: (RangeValues val) {
if (val.start == 1) {
setState(() {
_rangeValues = val;
});
}
},
),
),
],
),
),
),
],
);
}
Widget formTanggalPengisian() {
return Row(
children: [
Container(
child: Image.asset(
"assets/images/calendaradd.png",
width: 24,
height: 24,
),
),
SizedBox(
width: 10,
),
Expanded(
child: Container(
child: Row(
children: [
Flexible(
flex: 5,
child: Container(
child: TextField(
controller: dateController,
readOnly: true,
onTap: () {
_restorableDatePickerRouteFuture.present();
},
decoration: InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.all(
Radius.circular(12),
),
borderSide: BorderSide(
color: Color(0xFF677D81),
),
),
// border: BoxDecoration(border:),
contentPadding: EdgeInsets.only(
top: 4,
bottom: 4,
left: 15,
right: 15,
),
hintText: selectedDate,
hintStyle: TextStyle(
fontFamily: 'Poppins',
color: Colors.black,
fontSize: 15,
fontWeight: FontWeight.w500,
),
),
),
),
),
Flexible(
flex: 1,
child: Container(
margin: EdgeInsets.only(
left: 5,
right: 5,
),
child: Image.asset(
"assets/images/timer.png",
width: 24,
height: 24,
),
),
),
Flexible(
flex: 5,
child: Container(
child: TextField(
controller: timeController,
readOnly: true,
onTap: () {
_selectTime();
},
decoration: InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.all(
Radius.circular(12),
),
borderSide: BorderSide(
color: Color(0xFF677D81),
),
),
// border: BoxDecoration(border:),
contentPadding: EdgeInsets.only(
top: 4,
bottom: 4,
left: 15,
right: 15,
),
hintText: _time.format(context),
hintStyle: TextStyle(
fontFamily: 'Poppins',
color: Colors.black,
fontSize: 15,
fontWeight: FontWeight.w500,
),
),
),
),
),
],
),
),
),
],
);
}
Widget formJumlahBensin() {
return Row(
children: [
Container(
child: Image.asset(
"assets/images/dollarsquare.png",
width: 24,
height: 24,
),
),
SizedBox(
width: 10,
),
Container(
child: Expanded(
child: Row(
children: [
Flexible(
flex: 2,
child: TextField(
controller: literController,
keyboardType: TextInputType.number,
onTap: () => _checkBBMselected(),
readOnly: true,
decoration: InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.all(
Radius.circular(12),
),
borderSide: BorderSide(
color: Color(0xFF677D81),
),
),
// border: BoxDecoration(border:),
contentPadding: EdgeInsets.only(
top: 4,
bottom: 4,
left: 15,
right: 15,
),
hintText: "Liter",
errorText:
_submittedForm ? _errorText(literController) : null,
hintStyle: TextStyle(
fontFamily: 'Poppins',
color: Color(0xFFAEAEAE),
fontSize: 10,
fontWeight: FontWeight.w400,
),
),
),
),
SizedBox(
width: 10,
),
Flexible(
flex: 3,
child: TextField(
inputFormatters: <TextInputFormatter>[
CurrencyTextInputFormatter(
locale: 'id',
symbol: 'Rp. ',
decimalDigits: 0,
),
],
controller: hargaPerLiterController,
keyboardType: TextInputType.number,
decoration: InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.all(
Radius.circular(12),
),
borderSide: BorderSide(
color: Color(0xFF677D81),
),
),
// border: BoxDecoration(border:),
contentPadding: EdgeInsets.only(
top: 4,
bottom: 4,
left: 15,
right: 15,
),
errorText: _submittedForm
? _errorText(hargaPerLiterController)
: null,
hintText: "Harga/Liter",
hintStyle: TextStyle(
fontFamily: 'Poppins',
color: Color(0xFFAEAEAE),
fontSize: 10,
fontWeight: FontWeight.w400,
),
),
),
),
SizedBox(
width: 10,
),
Flexible(
flex: 3,
child: TextField(
inputFormatters: <TextInputFormatter>[
CurrencyTextInputFormatter(
locale: 'id',
symbol: 'Rp. ',
decimalDigits: 0,
),
],
controller: totalBiayaController,
keyboardType: TextInputType.number,
onTap: () => _checkBBMselected(),
// readOnly: !conditionBbm,
decoration: InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.all(
Radius.circular(12),
),
borderSide: BorderSide(
color: Color(0xFF677D81),
),
),
// border: BoxDecoration(border:),
contentPadding: EdgeInsets.only(
top: 4,
bottom: 4,
left: 15,
right: 15,
),
hintText: "Total Biaya",
errorText: _submittedForm
? _errorText(totalBiayaController)
: null,
hintStyle: TextStyle(
fontFamily: 'Poppins',
color: Color(0xFFAEAEAE),
fontSize: 10,
fontWeight: FontWeight.w400,
),
),
),
),
],
),
),
),
],
);
}
}