add edit siswa page

This commit is contained in:
kicap 2023-08-25 04:30:59 +08:00
parent b1dc1851a4
commit 667aae745b
10 changed files with 477 additions and 243 deletions

8
.env
View File

@ -1,6 +1,6 @@
# url = 'https://panti-asuhan.s-keytech.com/' url = 'https://panti-asuhan.s-keytech.com/'
# api_url = 'https://panti-asuhan.s-keytech.com/api/' api_url = 'https://panti-asuhan.s-keytech.com/api/'
# url = 'http://172.29.85.181/panti_asuhan2/' # url = 'http://172.29.85.181/panti_asuhan2/'
# api_url = 'http://172.29.85.181/panti_asuhan2/api/' # api_url = 'http://172.29.85.181/panti_asuhan2/api/'
url = 'http://20.20.20.25/panti_asuhan2/' # url = 'http://20.20.20.25/panti_asuhan2/'
api_url = 'http://20.20.20.25/panti_asuhan2/api/' # api_url = 'http://20.20.20.25/panti_asuhan2/api/'

View File

@ -26,10 +26,10 @@ class DanaSosialModel {
DanaSosialModel.fromJson(Map<String, dynamic> json) { DanaSosialModel.fromJson(Map<String, dynamic> json) {
idDanaSosial = json['id_dana_sosial']; idDanaSosial = json['id_dana_sosial'];
bentuk = json['bentuk']; bentuk = json['bentuk'];
nama = json['nama']; nama = json['nama'] ?? '';
jumlah = json['jumlah']; jumlah = json['jumlah'];
tanggal = json['tanggal']; tanggal = json['tanggal'];
keterangan = json['ket']; keterangan = json['ket'] ?? '';
jenisDonasi = json['jenis']; jenisDonasi = json['jenis'];
status = status =
json['status'] == '0' ? 'Belum Dikonfirmasi' : 'Sudah Dikonfirmasi'; json['status'] == '0' ? 'Belum Dikonfirmasi' : 'Sudah Dikonfirmasi';

View File

@ -270,7 +270,9 @@ class EditDialogSiswaView extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
children: [ children: [
TextButton( TextButton(
onPressed: () {}, onPressed: () {
completer(DialogResponse(confirmed: false));
},
child: const Text( child: const Text(
'Batal', 'Batal',
style: TextStyle( style: TextStyle(
@ -281,15 +283,14 @@ class EditDialogSiswaView extends StatelessWidget {
TextButton( TextButton(
onPressed: () async { onPressed: () async {
if (model.formKey.currentState!.validate()) { if (model.formKey.currentState!.validate()) {
// bool res = await model.postData(); bool res = await model.updateSiswa();
// model.log.i("res: $res");
// if (res) { if (res) {
// completer( Navigator.pop(context);
// DialogResponse( completer(DialogResponse(confirmed: true));
// confirmed: true, }
// ),
// ); // completer(DialogResponse(confirmed: true));
// }
} }
}, },
child: const Text( child: const Text(

View File

@ -1,12 +1,18 @@
import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter_holo_date_picker/flutter_holo_date_picker.dart'; import 'package:flutter_holo_date_picker/flutter_holo_date_picker.dart';
import '../../../../../app/app.locator.dart';
import '../../../../../app/app.logger.dart'; import '../../../../../app/app.logger.dart';
import '../../../../../app/core/custom_base_view_model.dart'; import '../../../../../app/core/custom_base_view_model.dart';
import '../../../../../model/siswa_model.dart'; import '../../../../../model/siswa_model.dart';
import '../../../../../services/http_services.dart';
import '../../../../../services/my_easyloading.dart';
class EditDialogSiswaViewModel extends CustomBaseViewModel { class EditDialogSiswaViewModel extends CustomBaseViewModel {
final log = getLogger('EditDialogSiswaViewModel'); final log = getLogger('EditDialogSiswaViewModel');
final easyLoading = locator<MyEasyLoading>();
final _httpService = locator<MyHttpServices>();
SiswaModel? siswaModel; SiswaModel? siswaModel;
String jenisKelamin = 'Laki-laki'; String jenisKelamin = 'Laki-laki';
List<String> jenisKelaminList = ['Laki-laki', 'Perempuan']; List<String> jenisKelaminList = ['Laki-laki', 'Perempuan'];
@ -66,4 +72,37 @@ class EditDialogSiswaViewModel extends CustomBaseViewModel {
tanggalLahirController.text = date; tanggalLahirController.text = date;
} }
} }
Future<bool> updateSiswa() async {
setBusy(true);
easyLoading.customLoading('Updating data...');
try {
var formData = FormData.fromMap({
'id': siswaModel!.idSiswa,
'nama': namaController.text,
'tanggal_lahir': tanggalLahirController.text,
'tempat_lahir': tempatLahirController.text,
'jenis_kelamin': jenisKelamin,
'alamat': alamatController.text,
'no_telpon': noTelponController.text,
'agama': agamaController.text,
'kewarganegaraan': kewarganegaraanController.text,
'pendidikan_sd': pendidikanSDController.text,
'pendidikan_smp': pendidikanSMPController.text,
'pendidikan_sma': pendidikanSMAController.text,
'kemampuan': kemampuanController.text,
'hobi': hobiController.text,
});
await _httpService.postWithFormData('siswa_edit', formData);
snackbarService.showSnackbar(message: 'Data berhasil diupdate');
return true;
} catch (e) {
log.e(e);
return false;
} finally {
easyLoading.dismissLoading();
setBusy(false);
}
}
} }

View File

@ -226,76 +226,80 @@ class EditSiswaView extends StatelessWidget {
// ), // ),
], ],
), ),
Positioned( model.role == 'admin'
top: 0, ? Positioned(
right: 45, top: 0,
// create a edit rounded button right: 45,
child: Container( // create a edit rounded button
alignment: Alignment.center, child: Container(
height: 30, alignment: Alignment.center,
width: 30, height: 30,
decoration: BoxDecoration( width: 30,
color: blueColor, decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20), color: blueColor,
), borderRadius: BorderRadius.circular(20),
child: IconButton( ),
onPressed: () { child: IconButton(
// model.changeEdit(); onPressed: () {
model.editData(); // model.changeEdit();
}, model.editData();
icon: const Icon( },
Icons.edit, icon: const Icon(
color: Colors.white, Icons.edit,
size: 13, color: Colors.white,
), size: 13,
), ),
), ),
), ),
Positioned( )
top: 0, : SizedBox(),
right: 0, model.role == 'admin'
// create a close rounded button ? Positioned(
child: Container( top: 0,
alignment: Alignment.center, right: 0,
height: 30, // create a close rounded button
width: 30, child: Container(
decoration: BoxDecoration( alignment: Alignment.center,
color: dangerColor, height: 30,
borderRadius: BorderRadius.circular(20), width: 30,
), decoration: BoxDecoration(
child: IconButton( color: dangerColor,
onPressed: () { borderRadius: BorderRadius.circular(20),
// model.changeEdit(); ),
model.dialogService child: IconButton(
.showDialog( onPressed: () {
title: 'Hapus Data', // model.changeEdit();
description: model.dialogService
'Apakah anda yakin ingin menghapus data ini?', .showDialog(
buttonTitle: 'Hapus', title: 'Hapus Data',
cancelTitle: 'Batal', description:
buttonTitleColor: dangerColor, 'Apakah anda yakin ingin menghapus data ini?',
cancelTitleColor: mainColor, buttonTitle: 'Hapus',
) cancelTitle: 'Batal',
.then((value) { buttonTitleColor: dangerColor,
if (value!.confirmed) { cancelTitleColor: mainColor,
model.deleteData(); )
// close dialog .then((value) {
Navigator.pop(context); if (value!.confirmed) {
// model.navigationService.clearTillFirstAndShow( model.deleteData();
// Routes.splashScreenView); // close dialog
} Navigator.pop(context);
}); // model.navigationService.clearTillFirstAndShow(
// Routes.splashScreenView);
}
});
// model.deleteData(); // model.deleteData();
}, },
icon: const Icon( icon: const Icon(
Icons.delete_forever, Icons.delete_forever,
color: Colors.white, color: Colors.white,
size: 15, size: 15,
), ),
), ),
), ),
), )
: SizedBox(),
], ],
), ),
), ),

View File

@ -1,5 +1,6 @@
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../../../app/app.dialogs.dart'; import '../../../../app/app.dialogs.dart';
import '../../../../app/app.locator.dart'; import '../../../../app/app.locator.dart';
@ -13,6 +14,7 @@ class EditSiswaViewModel extends CustomBaseViewModel {
final log = getLogger('EditSiswaViewModel'); final log = getLogger('EditSiswaViewModel');
final _httpService = locator<MyHttpServices>(); final _httpService = locator<MyHttpServices>();
final easyLoading = locator<MyEasyLoading>(); final easyLoading = locator<MyEasyLoading>();
String? role;
SiswaModel? siswaModel; SiswaModel? siswaModel;
List<String> jenisKelaminList = ['Laki-laki', 'Perempuan']; List<String> jenisKelaminList = ['Laki-laki', 'Perempuan'];
String jenisKelamin = 'Laki-laki'; String jenisKelamin = 'Laki-laki';
@ -34,6 +36,9 @@ class EditSiswaViewModel extends CustomBaseViewModel {
Future<void> init(int idSiswa) async { Future<void> init(int idSiswa) async {
log.i('idSiswa: $idSiswa'); log.i('idSiswa: $idSiswa');
getData(idSiswa); getData(idSiswa);
prefs.then((SharedPreferences prefs) {
role = prefs.getString('role');
});
} }
getData(int idSiswa) async { getData(int idSiswa) async {
@ -101,11 +106,13 @@ class EditSiswaViewModel extends CustomBaseViewModel {
} }
editData() async { editData() async {
var res = dialogService.showCustomDialog( var res = await dialogService.showCustomDialog(
variant: DialogType.editDialogSiswaView, variant: DialogType.editDialogSiswaView,
data: siswaModel, data: siswaModel,
); );
res; if (res?.confirmed != true) {
init(int.parse(siswaModel!.idSiswa!));
}
} }
} }

View File

@ -203,12 +203,14 @@ class SecondWidget extends ViewModelWidget<StrukturOrganisasiViewModel> {
const SizedBox( const SizedBox(
width: 10, width: 10,
), ),
IconButton( viewModel.role == 'admin'
onPressed: () { ? IconButton(
viewModel.editData(title, true); onPressed: () {
}, viewModel.editData(title, true);
icon: const Icon(Icons.edit), },
) icon: const Icon(Icons.edit),
)
: const SizedBox(),
], ],
), ),
for (var i = 0; i < length; i++) for (var i = 0; i < length; i++)
@ -287,12 +289,14 @@ class FirstWidget extends ViewModelWidget<StrukturOrganisasiViewModel> {
const SizedBox( const SizedBox(
width: 10, width: 10,
), ),
IconButton( viewModel.role == 'admin'
onPressed: () { ? IconButton(
viewModel.editData(title, false); onPressed: () {
}, viewModel.editData(title, false);
icon: const Icon(Icons.edit), },
) icon: const Icon(Icons.edit),
)
: const SizedBox(),
], ],
), ),
Center( Center(

View File

@ -1,3 +1,5 @@
import 'package:shared_preferences/shared_preferences.dart';
import '../../../../app/app.dialogs.dart'; import '../../../../app/app.dialogs.dart';
import '../../../../app/app.locator.dart'; import '../../../../app/app.locator.dart';
import '../../../../app/app.logger.dart'; import '../../../../app/app.logger.dart';
@ -9,6 +11,7 @@ class StrukturOrganisasiViewModel extends CustomBaseViewModel {
final log = getLogger('StrukturOrganisasiViewModel'); final log = getLogger('StrukturOrganisasiViewModel');
final _httpService = locator<MyHttpServices>(); final _httpService = locator<MyHttpServices>();
final easyLoading = locator<MyEasyLoading>(); final easyLoading = locator<MyEasyLoading>();
String? role;
Map<String, dynamic> dataKetua = {}; Map<String, dynamic> dataKetua = {};
Map<String, dynamic> dataSekretaris = {}; Map<String, dynamic> dataSekretaris = {};
@ -54,6 +57,9 @@ class StrukturOrganisasiViewModel extends CustomBaseViewModel {
int dataKelompokPutriLength = 0; int dataKelompokPutriLength = 0;
Future<void> init() async { Future<void> init() async {
prefs.then((SharedPreferences prefs) {
role = prefs.getString('role');
});
getData('Ketua', false, null); getData('Ketua', false, null);
getData('Sekretaris', false, null); getData('Sekretaris', false, null);
getData('Bendahara', false, null); getData('Bendahara', false, null);

View File

@ -32,148 +32,13 @@ class DetailDanaSosialView extends StatelessWidget {
), ),
body: Padding( body: Padding(
padding: const EdgeInsets.all(15), padding: const EdgeInsets.all(15),
child: Column( child: model.danaSosialModel == null
mainAxisSize: MainAxisSize.min, ? Center(
mainAxisAlignment: MainAxisAlignment.start, child: CircularProgressIndicator(),
crossAxisAlignment: CrossAxisAlignment.start, )
children: [ : (model.danaSosialModel!.bentuk == 'Pemasukan'
Align( ? PemasukanWidget()
alignment: Alignment.centerLeft, : PengeluaranWidget()),
child: Text(
"Nama Donator",
style: regularTextStyle.copyWith(color: mainColor),
),
),
MyTextFormField(
controller: model.namaController,
maxLines: 1,
readOnly: true,
),
const SizedBox(
height: 15,
),
Align(
alignment: Alignment.centerLeft,
child: Text(
"Tanggal",
style: regularTextStyle.copyWith(color: mainColor),
),
),
MyTextFormField(
controller: model.tanggalController,
maxLines: 1,
readOnly: true,
),
const SizedBox(
height: 15,
),
Align(
alignment: Alignment.centerLeft,
child: Text(
"Jenis",
style: regularTextStyle.copyWith(color: mainColor),
),
),
MyTextFormField(
controller: model.jenisController,
maxLines: 1,
readOnly: true,
),
Visibility(
visible: model.jenisBool,
child: const SizedBox(
height: 15,
),
),
Visibility(
visible: model.jenisBool,
child: Align(
alignment: Alignment.centerLeft,
child: Text(
"Jumlah",
style: regularTextStyle.copyWith(color: mainColor),
),
),
),
Visibility(
visible: model.jenisBool,
child: MyTextFormField(
controller: model.jumlahController,
maxLines: 1,
readOnly: true,
),
),
Visibility(
visible: !model.jenisBool,
child: const SizedBox(
height: 15,
),
),
Visibility(
visible: !model.jenisBool,
child: Align(
alignment: Alignment.centerLeft,
child: Text(
"Keterangan",
style: regularTextStyle.copyWith(color: mainColor),
),
),
),
Visibility(
visible: !model.jenisBool,
child: MyTextFormField(
controller: model.keteranganController,
maxLines: 2,
readOnly: true,
),
),
const SizedBox(
height: 15,
),
Expanded(
child: Align(
alignment: Alignment.centerRight,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(
"Tanda Tangan",
style: regularTextStyle.copyWith(color: mainColor),
),
SizedBox(
height: 150,
width: 150,
child: model.danaSosialModel == null
? Container(
decoration: BoxDecoration(
border: Border.all(color: mainColor),
),
)
: (model.danaSosialModel!.status! ==
'Belum Dikonfirmasi'
? const TtdWidget()
: Image.asset(
'assets/qrcode.png',
fit: BoxFit.cover,
)),
),
const SizedBox(
height: 10,
),
Text(
"Dr. Andi Fitriani D, S.Ag, M.Pd",
style: regularTextStyle.copyWith(
color: mainColor,
fontWeight: FontWeight.bold,
),
),
// create a horizontal line
],
),
),
),
],
),
), ),
); );
}, },
@ -181,6 +46,310 @@ class DetailDanaSosialView extends StatelessWidget {
} }
} }
class PengeluaranWidget extends ViewModelWidget<DetailDanaSosialViewModel> {
const PengeluaranWidget({
super.key,
});
@override
Widget build(BuildContext context, DetailDanaSosialViewModel viewModel) {
return Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Align(
alignment: Alignment.centerLeft,
child: Text(
"Bentuk",
style: regularTextStyle.copyWith(color: mainColor),
),
),
MyTextFormField(
controller: viewModel.bentukController,
maxLines: 1,
readOnly: true,
),
const SizedBox(
height: 15,
),
Align(
alignment: Alignment.centerLeft,
child: Text(
"Tanggal",
style: regularTextStyle.copyWith(color: mainColor),
),
),
MyTextFormField(
controller: viewModel.tanggalController,
maxLines: 1,
readOnly: true,
),
const SizedBox(
height: 15,
),
Align(
alignment: Alignment.centerLeft,
child: Text(
"Jenis",
style: regularTextStyle.copyWith(color: mainColor),
),
),
MyTextFormField(
controller: viewModel.jenisController,
maxLines: 1,
readOnly: true,
),
Visibility(
visible: viewModel.jenisBool,
child: const SizedBox(
height: 15,
),
),
Visibility(
visible: viewModel.jenisBool,
child: Align(
alignment: Alignment.centerLeft,
child: Text(
"Jumlah",
style: regularTextStyle.copyWith(color: mainColor),
),
),
),
Visibility(
visible: viewModel.jenisBool,
child: MyTextFormField(
controller: viewModel.jumlahController,
maxLines: 1,
readOnly: true,
),
),
Visibility(
visible: !viewModel.jenisBool,
child: const SizedBox(
height: 15,
),
),
Visibility(
visible: !viewModel.jenisBool,
child: Align(
alignment: Alignment.centerLeft,
child: Text(
"Keterangan",
style: regularTextStyle.copyWith(color: mainColor),
),
),
),
Visibility(
visible: !viewModel.jenisBool,
child: MyTextFormField(
controller: viewModel.keteranganController,
maxLines: 2,
readOnly: true,
),
),
const SizedBox(
height: 15,
),
Expanded(
child: Align(
alignment: Alignment.centerRight,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(
"Tanda Tangan",
style: regularTextStyle.copyWith(color: mainColor),
),
SizedBox(
height: 150,
width: 150,
child: viewModel.danaSosialModel == null
? Container(
decoration: BoxDecoration(
border: Border.all(color: mainColor),
),
)
: (viewModel.danaSosialModel!.status! ==
'Belum Dikonfirmasi'
? const TtdWidget()
: Image.asset(
'assets/qrcode.png',
fit: BoxFit.cover,
)),
),
const SizedBox(
height: 10,
),
Text(
"Dr. Andi Fitriani D, S.Ag, M.Pd",
style: regularTextStyle.copyWith(
color: mainColor,
fontWeight: FontWeight.bold,
),
),
// create a horizontal line
],
),
),
),
],
);
}
}
class PemasukanWidget extends ViewModelWidget<DetailDanaSosialViewModel> {
const PemasukanWidget({
super.key,
});
@override
Widget build(BuildContext context, DetailDanaSosialViewModel viewModel) {
return Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Align(
alignment: Alignment.centerLeft,
child: Text(
"Nama Donator",
style: regularTextStyle.copyWith(color: mainColor),
),
),
MyTextFormField(
controller: viewModel.namaController,
maxLines: 1,
readOnly: true,
),
const SizedBox(
height: 15,
),
Align(
alignment: Alignment.centerLeft,
child: Text(
"Tanggal",
style: regularTextStyle.copyWith(color: mainColor),
),
),
MyTextFormField(
controller: viewModel.tanggalController,
maxLines: 1,
readOnly: true,
),
const SizedBox(
height: 15,
),
Align(
alignment: Alignment.centerLeft,
child: Text(
"Jenis",
style: regularTextStyle.copyWith(color: mainColor),
),
),
MyTextFormField(
controller: viewModel.jenisController,
maxLines: 1,
readOnly: true,
),
Visibility(
visible: viewModel.jenisBool,
child: const SizedBox(
height: 15,
),
),
Visibility(
visible: viewModel.jenisBool,
child: Align(
alignment: Alignment.centerLeft,
child: Text(
"Jumlah",
style: regularTextStyle.copyWith(color: mainColor),
),
),
),
Visibility(
visible: viewModel.jenisBool,
child: MyTextFormField(
controller: viewModel.jumlahController,
maxLines: 1,
readOnly: true,
),
),
Visibility(
visible: !viewModel.jenisBool,
child: const SizedBox(
height: 15,
),
),
Visibility(
visible: !viewModel.jenisBool,
child: Align(
alignment: Alignment.centerLeft,
child: Text(
"Keterangan",
style: regularTextStyle.copyWith(color: mainColor),
),
),
),
Visibility(
visible: !viewModel.jenisBool,
child: MyTextFormField(
controller: viewModel.keteranganController,
maxLines: 2,
readOnly: true,
),
),
const SizedBox(
height: 15,
),
Expanded(
child: Align(
alignment: Alignment.centerRight,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(
"Tanda Tangan",
style: regularTextStyle.copyWith(color: mainColor),
),
SizedBox(
height: 150,
width: 150,
child: viewModel.danaSosialModel == null
? Container(
decoration: BoxDecoration(
border: Border.all(color: mainColor),
),
)
: (viewModel.danaSosialModel!.status! ==
'Belum Dikonfirmasi'
? const TtdWidget()
: Image.asset(
'assets/qrcode.png',
fit: BoxFit.cover,
)),
),
const SizedBox(
height: 10,
),
Text(
"Dr. Andi Fitriani D, S.Ag, M.Pd",
style: regularTextStyle.copyWith(
color: mainColor,
fontWeight: FontWeight.bold,
),
),
// create a horizontal line
],
),
),
),
],
);
}
}
class TtdWidget extends ViewModelWidget<DetailDanaSosialViewModel> { class TtdWidget extends ViewModelWidget<DetailDanaSosialViewModel> {
const TtdWidget({ const TtdWidget({
super.key, super.key,

View File

@ -27,6 +27,8 @@ class DetailDanaSosialViewModel extends CustomBaseViewModel {
TextEditingController jenisController = TextEditingController(); TextEditingController jenisController = TextEditingController();
TextEditingController keteranganController = TextEditingController(); TextEditingController keteranganController = TextEditingController();
TextEditingController bentukController = TextEditingController();
Future<void> init(int id) async { Future<void> init(int id) async {
log.i('init and id: $id'); log.i('init and id: $id');
getData(id); getData(id);
@ -41,7 +43,7 @@ class DetailDanaSosialViewModel extends CustomBaseViewModel {
easyLoading.showLoading(); easyLoading.showLoading();
try { try {
var response = await _httpService.get('dana_sosial_detail?id=$id'); var response = await _httpService.get('dana_sosial_detail?id=$id');
log.i(response.data); log.i(response.data['data']);
danaSosialModel = DanaSosialModel.fromJson(response.data['data']); danaSosialModel = DanaSosialModel.fromJson(response.data['data']);
namaController.text = danaSosialModel!.nama!; namaController.text = danaSosialModel!.nama!;
tanggalController.text = danaSosialModel!.tanggal!; tanggalController.text = danaSosialModel!.tanggal!;
@ -50,12 +52,14 @@ class DetailDanaSosialViewModel extends CustomBaseViewModel {
jenisController.text = danaSosialModel!.jenisDonasi!; jenisController.text = danaSosialModel!.jenisDonasi!;
keteranganController.text = danaSosialModel!.keterangan!; keteranganController.text = danaSosialModel!.keterangan!;
bentukController.text = danaSosialModel!.bentuk!;
if (danaSosialModel!.jenisDonasi == 'Uang') { if (danaSosialModel!.jenisDonasi == 'Uang') {
jenisBool = true; jenisBool = true;
} else { } else {
jenisBool = false; jenisBool = false;
} }
log.i('status: ${danaSosialModel!.status}'); // log.i('status: ${danaSosialModel!.status}');
setBusy(false); setBusy(false);
notifyListeners(); notifyListeners();
} catch (e) { } catch (e) {