support null safety 2

merge-requests/2/head
nextwo 3 years ago
parent 7fb78685ac
commit 5644ccad7c

@ -3,7 +3,7 @@ import '../../models/subtitle.dart';
class HttpStatusManger {
static String getStatusMessage({
required int? status,
required Subtitle subtitle,
required Subtitle? subtitle,
String? messageFor400,
String? messageFor200,
}) {
@ -11,28 +11,28 @@ class HttpStatusManger {
return "careful null status";
}
if (status == -1) {
return subtitle.currentlyServiceNotAvailable;
return subtitle?.currentlyServiceNotAvailable??"";
}
if (status == -2) {
// client's request in process
return subtitle.waitUntilYourRequestComplete;
return subtitle?.waitUntilYourRequestComplete??"";
} else if (status >= 200 && status < 300) {
// client's request was successfully received
return messageFor200 ?? subtitle.requestCompleteSuccessfully;
return messageFor200 ?? subtitle?.requestCompleteSuccessfully??"";
} else if (status >= 400 && status < 500) {
// client's request have error
switch (status) {
case 400:
return messageFor400 ?? subtitle.failedToCompleteRequest;
return messageFor400 ?? subtitle?.failedToCompleteRequest??"";
default:
return subtitle.failedToCompleteRequest;
return subtitle?.failedToCompleteRequest??"";
}
} else if (status >= 500) {
// server error
return subtitle.currentlyServiceNotAvailable;
return subtitle?.currentlyServiceNotAvailable??"";
} else {
// no error match so return default error
return subtitle.failedToCompleteRequest;
return subtitle?.failedToCompleteRequest??"";
}
}
}

@ -5,6 +5,8 @@ import 'package:flutter/services.dart';
import '../../models/subtitle.dart';
class AppLocalization {
AppLocalization(this.locale);

@ -57,7 +57,7 @@ class FirebaseNotificationManger {
AppNotification notification = AppNotification.fromJson(message.data);
Navigator.pushNamed(
context,
notification.path,
notification.path??"",
arguments: notification.requestId,
);
});
@ -67,7 +67,7 @@ class FirebaseNotificationManger {
NotificationManger.showNotification(
title: message.notification?.title,
subtext: message.notification?.body,
hashcode: int.tryParse(notification.requestId) ?? 1,
hashcode: int.tryParse(notification.requestId??"0") ?? 1,
payload: json.encode(message.data),
);
return;

@ -98,12 +98,12 @@ class DeviceTransferProvider extends ChangeNotifier {
Future<int> createRequest({
required String host,
required User user,
required User? user,
required DeviceTransfer model,
}) async {
Map<String, dynamic> body = {
"uid": user.id.toString(),
"token": user.token ?? "",
"uid": user?.id.toString(),
"token": user?.token ?? "",
"serial_id": model.device?.id ?? "",
"destination_client": model.receiver?.client?.id ?? "",
"destination_department": model.receiver?.department?.id ?? "",

@ -95,8 +95,8 @@ class PreventiveMaintenanceVisitsProvider extends ChangeNotifier {
}) async {
Response response;
Map<String, String> body = group.toJson();
body["token"] = user.token;
body["uid"] = user.id;
body["token"] = user.token??"";
body["uid"] = user.id??"";
//userId = 397.toString(); // testing id to view data
try {
response = await post(
@ -107,11 +107,11 @@ class PreventiveMaintenanceVisitsProvider extends ChangeNotifier {
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
for (var visit in group.visits) {
for (var visit in (group.visits??[])) {
visit.status = group.status;
visit.actualDate = group.date.toString().split(" ").first;
}
group.visits.clear();
group.visits?.clear();
notifyListeners();
}

@ -107,7 +107,7 @@ class RegularVisitsProvider extends ChangeNotifier {
Response response;
Map<String, String> body = group.toJson();
body["token"] = user.token ?? "";
body["uid"] = user.id;
body["uid"] = user.id??"";
//userId = 397.toString(); // testing id to view data
try {
response = await post(
@ -157,8 +157,8 @@ class RegularVisitsProvider extends ChangeNotifier {
try {
Response response;
Map<String, String> body = pentry.toMap();
body["uid"] = user.id;
body["token"] = user.token;
body["uid"] = user.id??"";
body["token"] = user.token??"";
response = await post(
Uri.parse("$host${URLs.updatePentry}/${visit.id}"),
body: body,

@ -135,7 +135,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
"token": user.token ?? "",
"sn_id": serviceRequest.deviceId ?? "",
"date": (DateTime.now().millisecondsSinceEpoch).toString(),
"client": user.hospital.id ?? '',
"client": user.hospital?.id ?? '',
"complaint": serviceRequest.maintenanceIssue,
"image": json.encode(serviceRequest.devicePhotos),
"priority": (serviceRequest.priority?.id).toString(),
@ -174,8 +174,8 @@ class ServiceRequestsProvider extends ChangeNotifier {
}) async {
Response response;
Map<String, String> body = issue.toMap();
body["uid"] = user.id;
body["token"] = user.token;
body["uid"] = user.id??"";
body["token"] = user.token??"";
try {
response = await post(
Uri.parse(host + URLs.createReport),
@ -199,8 +199,8 @@ class ServiceRequestsProvider extends ChangeNotifier {
}) async {
Response response;
Map<String, String> body = {};
body["uid"] = user.id;
body["token"] = user.token;
body["uid"] = user.id??"";
body["token"] = user.token??"";
body["nid"] = request.id ?? '';
body["date"] = newDate;
body["ass_emp"] = employee.id.toString();
@ -228,8 +228,8 @@ class ServiceRequestsProvider extends ChangeNotifier {
}) async {
Response response;
Map<String, String> body = report.toMap();
body["uid"] = user.id;
body["token"] = user.token;
body["uid"] = user.id??"";
body["token"] = user.token??"";
body["job_id"] = request.id ?? '';
try {
response = await post(
@ -285,8 +285,8 @@ class ServiceRequestsProvider extends ChangeNotifier {
}) async {
Response response;
Map<String, String> body = report.toMap();
body["uid"] = user.id;
body["token"] = user.token;
body["uid"] = user.id??"";
body["token"] = user.token??"";
body["job_id"] = request.id ?? '';
body["report_id"] = request.reportID ?? '';
try {
@ -314,15 +314,15 @@ class ServiceRequestsProvider extends ChangeNotifier {
}) async {
Response response;
Map<String, String> body = {};
body["uid"] = user.id;
body["token"] = user.token;
body["uid"] = user.id??"";
body["token"] = user.token??"";
body["job_id"] = request.id ?? '';
body["start_time"] =
(timer.startAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0);
((timer.startAt?.millisecondsSinceEpoch??0) / 1000).toStringAsFixed(0);
body["end_time"] =
(timer.endAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0);
((timer.endAt?.millisecondsSinceEpoch??0) / 1000).toStringAsFixed(0);
body["working_hours"] =
(timer.durationInSecond / 60 / 60).toStringAsFixed(5);
((timer.durationInSecond??0) / 60 / 60).toStringAsFixed(5);
body["report_id"] = request.reportID ?? '';
try {
response = await post(

@ -128,8 +128,8 @@ class UserProvider extends ChangeNotifier {
Map<String, dynamic> jsonObject = {};
jsonObject["uid"] = user.id;
jsonObject["token"] = user.token;
if (user.department.id != _user?.department.id) {
jsonObject["department"] = user.department.id;
if (user.department?.id != _user?.department?.id) {
jsonObject["department"] = user.department?.id;
}
if (user.whatsApp != _user?.whatsApp) {
jsonObject["whatsapp"] = user.whatsApp;

@ -1,11 +1,12 @@
import 'package:test_sa/views/pages/user/requests/future_request_service_details.dart';
import '../views/pages/user/requests/future_request_service_details.dart';
class AppNotification{
String requestId;
String title;
String description;
String date;
String path;
String? requestId;
String? title;
String? description;
String? date;
String? path;
AppNotification({
this.requestId,

@ -1,6 +1,6 @@
class Department{
String id;
String name;
String? id;
String? name;
Department({
this.id,

@ -1,6 +1,6 @@
class Hospital{
String id;
String name;
String? id;
String? name;
Hospital({
this.id,

@ -1,10 +1,10 @@
class Issue{
String title;
String userId;
List<int> reports;
String serviceRequestId;
String description;
bool isSelected;
String? title;
String? userId;
List<int>? reports;
String? serviceRequestId;
String? description;
bool? isSelected;
Issue({
this.description,
@ -17,11 +17,11 @@ class Issue{
Map<String,String> toMap(){
Map<String,String> map ={};
if(title != null) map["title"] = title;
if(title != null) map["title"] = title??"";
if(reports != null) map["issue_report"] = reports.toString();
if(userId != null) map["uid"] = userId;
if(description != null) map["desc"] = description;
if(serviceRequestId != null) map["call_id"] = serviceRequestId;
if(userId != null) map["uid"] = userId??"";
if(description != null) map["desc"] = description??"";
if(serviceRequestId != null) map["call_id"] = serviceRequestId??"";
return map;
}
}

@ -1,8 +1,8 @@
class Lookup{
final String label;
final String key;
final int id;
final String? label;
final String? key;
final int? id;
const Lookup({
this.label,
@ -29,7 +29,6 @@ class Lookup{
}
factory Lookup.fromJson(Map<String,dynamic> parsedJson){
if(parsedJson["id"] == null && parsedJson["uid"] == null) return null;
return Lookup(
label: parsedJson["value"],
id: parsedJson["id"] is int

@ -54,11 +54,11 @@ class Pentry {
.toStringAsFixed(0);
if (timer != null) {
map["start_date"] =
(timer!.startAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0);
((timer!.startAt?.millisecondsSinceEpoch??0) / 1000).toStringAsFixed(0);
map["end_date"] =
((timer!.endAt).millisecondsSinceEpoch / 1000).toStringAsFixed(0);
(((timer!.endAt)?.millisecondsSinceEpoch??0) / 1000).toStringAsFixed(0);
map["working_hours"] =
(timer!.durationInSecond / 60 / 60).toStringAsFixed(5);
((timer!.durationInSecond??0) / 60 / 60).toStringAsFixed(5);
}
// if(contacts?.isNotEmpty == true) {
// for(int i = 0;i<contacts.length;i++){

@ -1,7 +1,7 @@
class Part{
String id;
String code;
String name;
String? id;
String? code;
String? name;
int quantity;
Part({

@ -1,32 +1,31 @@
import 'dart:convert';
import 'package:test_sa/models/device/device.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/part.dart';
import 'package:test_sa/models/timer_model.dart';
import 'device/device.dart';
import 'lookup.dart';
import 'part.dart';
import 'timer_model.dart';
class ServiceReport {
String id;
String operatingHours;
DateTime visitDate;
DateTime endDate;
Lookup serviceType;
Lookup callLastSituation;
Lookup status;
Lookup type;
Lookup reason;
String faultDescription;
String workPreformed;
//String workHours;
String travelingHours;
String invoiceNumber;
String invoiceCode;
List<Part> parts;
String image;
Device device;
String quantity;
String jobSheetNumber;
TimerModel timer;
String? id;
String? operatingHours;
DateTime? visitDate;
DateTime? endDate;
Lookup? serviceType;
Lookup? callLastSituation;
Lookup? status;
Lookup? type;
Lookup? reason;
String? faultDescription;
String? workPreformed;
String? travelingHours;
String? invoiceNumber;
String? invoiceCode;
List<Part>? parts;
String? image;
Device? device;
String? quantity;
String? jobSheetNumber;
TimerModel? timer;
ServiceReport({
this.id,
@ -36,7 +35,6 @@ class ServiceReport {
this.status,
this.type,
this.faultDescription,
//this.workHours,
this.travelingHours,
this.parts,
this.workPreformed,
@ -54,38 +52,39 @@ class ServiceReport {
Map<String,String> toMap(){
Map<String,String> _map = {};
if(id != null) _map["id"] = id;
if(visitDate != null) _map["visit_date"] = (visitDate.millisecondsSinceEpoch ~/ 1000).toString();
if(serviceType != null) _map["service_type"] = serviceType.id.toString();
if(status != null) _map["status"] = status.id.toString();
if(type != null) _map["service_report_type"] = type.id.toString();
if(faultDescription != null && faultDescription.isNotEmpty) _map["fault_description"] = faultDescription;
if(id != null) _map["id"] = id??"";
if(visitDate != null) _map["visit_date"] = ((visitDate?.millisecondsSinceEpoch??0) ~/ 1000).toString();
if(serviceType != null) _map["service_type"] = serviceType?.id.toString()??"";
if(status != null) _map["status"] = status?.id.toString()??"";
if(type != null) _map["service_report_type"] = type?.id.toString()??"";
if(faultDescription != null && (faultDescription?.isNotEmpty??false)) _map["fault_description"] = faultDescription??"";
//if(workHours != null && workHours.isNotEmpty) _map["working_hours"] = workHours;
if(timer != null){
_map["start_time"] = (timer.startAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0);
_map["end_time"] = ((timer.endAt ?? DateTime.now()).millisecondsSinceEpoch / 1000).toStringAsFixed(0);
_map["working_hours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5);
_map["start_time"] = ((timer?.startAt?.millisecondsSinceEpoch??0) / 1000).toStringAsFixed(0);
_map["end_time"] = ((timer?.endAt ?? DateTime.now()).millisecondsSinceEpoch / 1000).toStringAsFixed(0);
_map["working_hours"] = ((timer?.durationInSecond??0) / 60 / 60).toStringAsFixed(5);
}
if(travelingHours != null && travelingHours.isNotEmpty) _map["traveling_hours"] = travelingHours;
if(workPreformed != null && workPreformed.isNotEmpty) _map["work_performed"] = workPreformed;
if(jobSheetNumber != null && jobSheetNumber.isNotEmpty) _map["job_sheet_no"] = jobSheetNumber;
if(parts != null && parts.isNotEmpty){
if(travelingHours != null && (travelingHours?.isNotEmpty??false)) _map["traveling_hours"] = travelingHours??"";
if(workPreformed != null && (workPreformed?.isNotEmpty??false)) _map["work_performed"] = workPreformed??"";
if(jobSheetNumber != null && (jobSheetNumber?.isNotEmpty??false)) _map["job_sheet_no"] = jobSheetNumber??"";
if(parts != null && (parts?.isNotEmpty??false)){
Map<String,int> _partsMap = {};
parts.forEach((part) {
if(part.id.isNotEmpty)
_partsMap[part.id] = part.quantity;
parts?.forEach((part) {
if((part.id?.isNotEmpty??false)) {
_partsMap[part?.id??""] = part.quantity;
}
});
_map["parts"] = json.encode(_partsMap);
}
if(device?.id != null && device.id != null) _map["eq_id"] = device.id;
if(quantity != null && quantity.isNotEmpty) _map["qty"] = quantity;
if(endDate != null) _map["end_date"] = (endDate.millisecondsSinceEpoch ~/ 1000).toString();
if(reason != null) _map["reasons"] = reason.id.toString();
if(operatingHours != null && operatingHours.isNotEmpty) _map["operation_hours"] = operatingHours;
if(callLastSituation != null) _map["call_last_situtation"] = callLastSituation.id.toString();
if(image != null) _map["image"] = image;
if(invoiceCode != null) _map["invoice_no"] = invoiceCode;
if(invoiceNumber != null) _map["invoice_code"] = invoiceNumber;
if(device?.id != null && device?.id != null) _map["eq_id"] = device?.id??"";
if(quantity != null && (quantity?.isNotEmpty??false)) _map["qty"] = quantity??"";
if(endDate != null) _map["end_date"] = ((endDate?.millisecondsSinceEpoch??0) ~/ 1000).toString();
if(reason != null) _map["reasons"] = reason?.id.toString()??"";
if(operatingHours != null && (operatingHours?.isNotEmpty??false)) _map["operation_hours"] = operatingHours??"";
if(callLastSituation != null) _map["call_last_situtation"] = callLastSituation?.id.toString()??"";
if(image != null) _map["image"] = image??"";
if(invoiceCode != null) _map["invoice_no"] = invoiceCode??"";
if(invoiceNumber != null) _map["invoice_code"] = invoiceNumber??"";
return _map;
}
@ -102,7 +101,7 @@ class ServiceReport {
if(parts == null) return false;
//if(endDate == null) return false;
//if(reason == null) return false;
if((device?.id == null || device.id.isEmpty) && type?.id != 1) return false;
if((device?.id == null ||(device?.id?.isEmpty??false)) && type?.id != 1) return false;
//if(quantity == null || quantity.isEmpty) return false;
//if(image == null) return false;
return true;
@ -144,6 +143,6 @@ class ServiceReport {
static getDate(String date){
return date == null || date.isEmpty
? null : DateTime.fromMillisecondsSinceEpoch(int.tryParse(date) * 1000);
? null : DateTime.fromMillisecondsSinceEpoch((int.tryParse(date)??0) * 1000);
}
}

@ -226,187 +226,187 @@ class Subtitle{
}
Subtitle({
@required this.currentlyServiceNotAvailable,
@required this.waitUntilYourRequestComplete,
@required this.requestCompleteSuccessfully,
@required this.failedToCompleteRequest,
@required this.update,
@required this.cancel,
@required this.confirm,
@required this.exit,
@required this.exitAlert,
@required this.signOutAlert,
@required this.language,
@required this.name,
@required this.email,
@required this.phoneNumber,
@required this.password,
@required this.forgetPassword,
@required this.confirmPassword,
@required this.signIn,
@required this.signUp,
@required this.nameValidateMessage,
@required this.emailValidateMessage,
@required this.phoneNumberValidateMessage,
@required this.passwordValidateMessage,
@required this.confirmPasswordValidateMessage,
@required this.emailExist,
@required this.forgetPasswordWithMark,
@required this.phoneNumberExist,
@required this.showPassword,
@required this.signOut,
@required this.wrongEmailOrPassword,
@required this.next,
@required this.back,
@required this.search,
@required this.searchByName,
@required this.address,
@required this.description,
@required this.title,
@required this.addressNotFound,
@required this.addressValidateMessage,
@required this.dataNotFound,
@required this.descriptionNotFound,
@required this.descriptionValidateMessage,
@required this.edit,
@required this.emailNotFound,
@required this.from,
@required this.linkNotFound,
@required this.nameNotFound,
@required this.phoneNumberNotFound,
@required this.titleNotFound,
@required this.titleValidateMessage,
@required this.to,
@required this.urlNotFound,
required this.currentlyServiceNotAvailable,
required this.waitUntilYourRequestComplete,
required this.requestCompleteSuccessfully,
required this.failedToCompleteRequest,
required this.update,
required this.cancel,
required this.confirm,
required this.exit,
required this.exitAlert,
required this.signOutAlert,
required this.language,
required this.name,
required this.email,
required this.phoneNumber,
required this.password,
required this.forgetPassword,
required this.confirmPassword,
required this.signIn,
required this.signUp,
required this.nameValidateMessage,
required this.emailValidateMessage,
required this.phoneNumberValidateMessage,
required this.passwordValidateMessage,
required this.confirmPasswordValidateMessage,
required this.emailExist,
required this.forgetPasswordWithMark,
required this.phoneNumberExist,
required this.showPassword,
required this.signOut,
required this.wrongEmailOrPassword,
required this.next,
required this.back,
required this.search,
required this.searchByName,
required this.address,
required this.description,
required this.title,
required this.addressNotFound,
required this.addressValidateMessage,
required this.dataNotFound,
required this.descriptionNotFound,
required this.descriptionValidateMessage,
required this.edit,
required this.emailNotFound,
required this.from,
required this.linkNotFound,
required this.nameNotFound,
required this.phoneNumberNotFound,
required this.titleNotFound,
required this.titleValidateMessage,
required this.to,
required this.urlNotFound,
@required this.nameExist,
@required this.unitRequired,
@required this.unite,
@required this.hospitalRequired,
@required this.whatsApp,
@required this.submit,
@required this.shareAntherIssue,
@required this.reportIssue,
@required this.noUniteFound,
@required this.pickUnite,
@required this.noHospitalFound,
@required this.pickHospital,
@required this.shareApp,
@required this.ourWebsite,
@required this.linkedIn,
@required this.facebook,
@required this.hotLine,
@required this.trackServiceRequest,
@required this.newServiceRequest,
@required this.deviceModel,
@required this.noServiceRequestFound,
@required this.engineerName,
@required this.serviceRequests,
@required this.jobSheetNumber,
@required this.visitDate,
@required this.workPerformed,
@required this.faultDescription,
@required this.serviceRequestInformation,
@required this.maintenanceIssue,
@required this.deviceArName,
@required this.hospital,
@required this.status,
@required this.date,
@required this.engineerPhone,
@required this.device,
@required this.deviceSN,
@required this.details,
@required this.requestInformation,
@required this.model,
@required this.brand,
@required this.noDeviceFound,
@required this.noDateFound,
@required this.searchBySn,
@required this.pickDevice,
@required this.notifications,
@required this.notificationsNotFound,
@required this.twitter,
@required this.add,
@required this.code,
@required this.deviceEnName,
@required this.deviceName,
@required this.serialNumber,
@required this.policy,
@required this.clearSearch,
@required this.closed,
@required this.create,
@required this.createServiceRequest,
@required this.delete,
@required this.deviceImages,
@required this.deviceRequired,
@required this.general,
@required this.maintenanceIssueRequired,
@required this.maxImagesNumberIs5,
@required this.newWord,
@required this.noModelFound,
@required this.noSnFound,
@required this.reason1,
@required this.reason2,
@required this.reason3,
@required this.reason4,
@required this.reason5,
@required this.repaired,
@required this.repeated,
@required this.sn,
@required this.underRepair,
@required this.actualDate,
@required this.expectDate,
@required this.visitInformation,
@required this.regularVisitsUpdatedSuccessfully,
@required this.regularVisits,
@required this.updateRegularVisits,
@required this.updatingDots,
@required this.preventiveMaintenanceUpdatedSuccessfully,
@required this.updatePreventiveMaintenance,
@required this.preventiveMaintenance,
@required this.requiredStatus,
@required this.noSerialNumberFound,
@required this.updateVisitsGroup,
@required this.pickFromGallery,
@required this.pickFromCamera,
@required this.images,
@required this.done,
@required this.imagesRequired,
@required this.notYet,
@required this.noVisitsFound,
@required this.onHold,
@required this.nextVisitDate,
@required this.contactStatus,
@required this.travelingHours,
@required this.workingHours,
@required this.taskStatus,
@required this.image,
@required this.pickImage,
@required this.requiredImage,
@required this.activationAlert,
required this.nameExist,
required this.unitRequired,
required this.unite,
required this.hospitalRequired,
required this.whatsApp,
required this.submit,
required this.shareAntherIssue,
required this.reportIssue,
required this.noUniteFound,
required this.pickUnite,
required this.noHospitalFound,
required this.pickHospital,
required this.shareApp,
required this.ourWebsite,
required this.linkedIn,
required this.facebook,
required this.hotLine,
required this.trackServiceRequest,
required this.newServiceRequest,
required this.deviceModel,
required this.noServiceRequestFound,
required this.engineerName,
required this.serviceRequests,
required this.jobSheetNumber,
required this.visitDate,
required this.workPerformed,
required this.faultDescription,
required this.serviceRequestInformation,
required this.maintenanceIssue,
required this.deviceArName,
required this.hospital,
required this.status,
required this.date,
required this.engineerPhone,
required this.device,
required this.deviceSN,
required this.details,
required this.requestInformation,
required this.model,
required this.brand,
required this.noDeviceFound,
required this.noDateFound,
required this.searchBySn,
required this.pickDevice,
required this.notifications,
required this.notificationsNotFound,
required this.twitter,
required this.add,
required this.code,
required this.deviceEnName,
required this.deviceName,
required this.serialNumber,
required this.policy,
required this.clearSearch,
required this.closed,
required this.create,
required this.createServiceRequest,
required this.delete,
required this.deviceImages,
required this.deviceRequired,
required this.general,
required this.maintenanceIssueRequired,
required this.maxImagesNumberIs5,
required this.newWord,
required this.noModelFound,
required this.noSnFound,
required this.reason1,
required this.reason2,
required this.reason3,
required this.reason4,
required this.reason5,
required this.repaired,
required this.repeated,
required this.sn,
required this.underRepair,
required this.actualDate,
required this.expectDate,
required this.visitInformation,
required this.regularVisitsUpdatedSuccessfully,
required this.regularVisits,
required this.updateRegularVisits,
required this.updatingDots,
required this.preventiveMaintenanceUpdatedSuccessfully,
required this.updatePreventiveMaintenance,
required this.preventiveMaintenance,
required this.requiredStatus,
required this.noSerialNumberFound,
required this.updateVisitsGroup,
required this.pickFromGallery,
required this.pickFromCamera,
required this.images,
required this.done,
required this.imagesRequired,
required this.notYet,
required this.noVisitsFound,
required this.onHold,
required this.nextVisitDate,
required this.contactStatus,
required this.travelingHours,
required this.workingHours,
required this.taskStatus,
required this.image,
required this.pickImage,
required this.requiredImage,
required this.activationAlert,
@required this.callId,
@required this.requiredWord,
@required this.quantity,
@required this.callLastSituation,
@required this.invoiceNumber,
@required this.invoiceCode,
@required this.attachImage,
@required this.customer,
@required this.editServiceReport,
@required this.newServiceReport,
@required this.number,
@required this.operatingHours,
@required this.partNumber,
@required this.reasons,
@required this.reportStatus,
@required this.reportType,
@required this.serviceType,
@required this.workPreformed,
@required this.alert,
@required this.duplicateAlert,
@required this.duplicateAlertMessage,
@required this.duplicateRequest,
required this.callId,
required this.requiredWord,
required this.quantity,
required this.callLastSituation,
required this.invoiceNumber,
required this.invoiceCode,
required this.attachImage,
required this.customer,
required this.editServiceReport,
required this.newServiceReport,
required this.number,
required this.operatingHours,
required this.partNumber,
required this.reasons,
required this.reportStatus,
required this.reportType,
required this.serviceType,
required this.workPreformed,
required this.alert,
required this.duplicateAlert,
required this.duplicateAlertMessage,
required this.duplicateRequest,
});
factory Subtitle.fromJson(Map<String,dynamic> parsedJson){

@ -1,7 +1,7 @@
class TimerModel {
DateTime startAt;
DateTime endAt;
int durationInSecond;
DateTime? startAt;
DateTime? endAt;
int? durationInSecond;
TimerModel({this.startAt,this.endAt,this.durationInSecond});
}

@ -1,20 +1,22 @@
import 'package:test_sa/controllers/notification/firebase_notification_manger.dart';
import 'package:test_sa/models/department.dart';
import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/hospital.dart';
import '../controllers/notification/firebase_notification_manger.dart';
import 'department.dart';
import 'enums/user_types.dart';
import 'hospital.dart';
class User {
String id;
String? id;
String userName;
String password;
String email;
String image;
Hospital hospital;
Department department;
UsersTypes type;
String phoneNumber;
String whatsApp;
String token;
String? image;
Hospital? hospital;
Department? department;
UsersTypes? type;
String? phoneNumber;
String? whatsApp;
String? token;
bool isActive;
User(
@ -22,7 +24,7 @@ class User {
this.userName = "",
this.email = "",
this.password = "",
this.phoneNumber = "",
this.phoneNumber,
this.hospital,
this.image,
this.department,
@ -42,9 +44,9 @@ class User {
Map<String, dynamic> toUpdateProfileJson() {
Map<String, dynamic> jsonObject = {};
if (department?.id != null && department.id.isNotEmpty) jsonObject["department"] = department.id;
if (whatsApp != null && whatsApp.isNotEmpty) jsonObject["whatsapp"] = whatsApp;
if (phoneNumber != null && phoneNumber.isNotEmpty) jsonObject["phone"] = phoneNumber;
if (department?.id != null && (department?.id?.isNotEmpty??false)) jsonObject["department"] = department?.id??"";
if (whatsApp != null && (whatsApp?.isNotEmpty??false)) jsonObject["whatsapp"] = whatsApp;
if (phoneNumber != null && (phoneNumber?.isNotEmpty??false)) jsonObject["phone"] = phoneNumber;
return jsonObject;
}
@ -54,7 +56,7 @@ class User {
"username": userName,
"email": email,
"whatsapp": whatsApp,
"client": hospital.id,
"client": hospital?.id,
"department": department?.id,
"phone": phoneNumber,
"pass": password,

@ -1,24 +1,25 @@
import 'package:test_sa/models/lookup.dart';
import '../lookup.dart';
class Visit{
String id;
String serialNumber;
String expectDate;
String actualDate;
String hospitalId;
String hospitalName;
String deviceId;
String deviceSerialNumber;
String deviceArabicName;
String deviceEnglishName;
String employId;
String employName;
String modelAndBrand;
String contactStatus;
Lookup status;
String assignTo;
String deviceNumber;
List<String> images;
String? id;
String? serialNumber;
String? expectDate;
String? actualDate;
String? hospitalId;
String? hospitalName;
String? deviceId;
String? deviceSerialNumber;
String? deviceArabicName;
String? deviceEnglishName;
String? employId;
String? employName;
String? modelAndBrand;
String? contactStatus;
Lookup? status;
String? assignTo;
String? deviceNumber;
List<String>? images;
Visit({
this.id,
@ -60,7 +61,7 @@ class Visit{
contactStatus: parsedJson["contactStatus"],
images: List<String>.from(parsedJson["images"] ?? []),
status: Lookup(
id: int.tryParse(parsedJson["status"] ?? "-1"), // actual value (0,1,2)
id: int.tryParse(parsedJson["status"] ?? "-1")??-1, // actual value (0,1,2)
label: parsedJson["status_value"] // text value
),
assignTo: parsedJson["assigned_to"],

@ -1,17 +1,19 @@
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/visits/visit.dart';
import '../lookup.dart';
import 'visit.dart';
class VisitsGroup{
String userId;
String workingHours;
String travelingHours;
String jobSheetNumber;
String image;
Lookup status;
Lookup taskStatus;
DateTime date;
List<Visit> visits;
String? userId;
String? workingHours;
String? travelingHours;
String? jobSheetNumber;
String? image;
Lookup? status;
Lookup? taskStatus;
DateTime? date;
List<Visit>? visits;
VisitsGroup({
this.userId,
@ -27,17 +29,20 @@ class VisitsGroup{
Map<String,String> toJson(){
Map<String,String> jsonObject = {};
jsonObject["nids"] = visits.map((e) => e.id).toList().join(',');
if(status != null) jsonObject["status"] = status.id.toString();
jsonObject["nids"] = visits!.map((e) => e.id).toList().join(',');
if(status != null) jsonObject["status"] = status?.id.toString()??"";
if(date != null) jsonObject["date"] = date.toString().split(" ").first;
if(jobSheetNumber != null && jobSheetNumber.isNotEmpty)
jsonObject["job_sheet_no"] = jobSheetNumber;
if(travelingHours != null && travelingHours.isNotEmpty)
jsonObject["traveling_hours"] = travelingHours;
if(workingHours != null && workingHours.isNotEmpty)
jsonObject["working_hours"] = workingHours;
if(image != null) jsonObject["image"] = image;
if(taskStatus != null) jsonObject["task_status"] = taskStatus.id.toString();
if(jobSheetNumber != null && (jobSheetNumber?.isNotEmpty??false)) {
jsonObject["job_sheet_no"] = jobSheetNumber!;
}
if(travelingHours != null &&(travelingHours?.isNotEmpty??false)) {
jsonObject["traveling_hours"] = travelingHours??"";
}
if(workingHours != null && (workingHours?.isNotEmpty??false)) {
jsonObject["working_hours"] = workingHours??"";
}
if(image != null) jsonObject["image"] = image??"";
if(taskStatus != null) jsonObject["task_status"] = taskStatus?.id.toString()??"";
return jsonObject;
}

@ -1,14 +1,14 @@
class VisitsSearch{
String deviceSerialNumber;
String hospitalName;
String brand;
String model;
String contactStatus;
DateTime expectedDateFrom;
DateTime expectedDateTo;
DateTime actualDateFrom;
DateTime actualDateTo;
int statusValue;
String? deviceSerialNumber;
String? hospitalName;
String? brand;
String? model;
String? contactStatus;
DateTime? expectedDateFrom;
DateTime? expectedDateTo;
DateTime? actualDateFrom;
DateTime? actualDateTo;
int? statusValue;
VisitsSearch({
this.deviceSerialNumber,
@ -38,36 +38,36 @@ class VisitsSearch{
String toSearchString(){
String _search = "";
if(deviceSerialNumber != null && deviceSerialNumber.isNotEmpty){
if(deviceSerialNumber != null && (deviceSerialNumber?.isNotEmpty??false)){
_search += "&sn_id=$deviceSerialNumber";
}
if(hospitalName != null && hospitalName.isNotEmpty){
if(hospitalName != null && (hospitalName?.isNotEmpty??false)){
_search += "&client=$hospitalName";
}
if(brand != null && brand.isNotEmpty){
if(brand != null && (brand?.isNotEmpty??false)){
_search += "&brand=$brand";
}
if(model != null && model.isNotEmpty){
if(model != null && (model?.isNotEmpty??false)){
_search += "&model=$model";
}
if(expectedDateFrom != null){
_search += "&expected_date_from=${expectedDateFrom.millisecondsSinceEpoch ~/ 1000}";
_search += "&expected_date_from=${(expectedDateFrom?.millisecondsSinceEpoch??0) ~/ 1000}";
}
if(expectedDateTo != null){
_search += "&expected_date_to=${expectedDateTo.millisecondsSinceEpoch~/1000}";
_search += "&expected_date_to=${(expectedDateTo?.millisecondsSinceEpoch??0) ~/1000}";
}
if(actualDateFrom != null){
_search += "&actual_date_from=${actualDateFrom.millisecondsSinceEpoch ~/ 1000}";
_search += "&actual_date_from=${(actualDateFrom?.millisecondsSinceEpoch??0) ~/ 1000}";
}
if(actualDateTo != null){
_search += "&actual_date_to=${actualDateTo.millisecondsSinceEpoch~/1000}";
_search += "&actual_date_to=${(actualDateTo?.millisecondsSinceEpoch??0) ~/1000}";
}
if(statusValue != null){

@ -45,12 +45,12 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
@override
Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
_subtitle = AppLocalization.of(context)?.subtitle;
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
_deviceTransferProvider = Provider.of<DeviceTransferProvider>(context);
_isSender = _userProvider?.user.id == widget.model.sender?.userId;
_isReceiver = _userProvider?.user.id == widget.model.receiver?.userId;
_isSender = _userProvider?.user?.id == widget.model.sender?.userId;
_isReceiver = _userProvider?.user?.id == widget.model.receiver?.userId;
return Scaffold(
key: _scaffoldKey,
body: SafeArea(
@ -92,11 +92,11 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
children: [
RequestInfoRow(
title: _subtitle?.title??"",
info: widget.model.title,
info: widget.model.title??"",
),
RequestInfoRow(
title: _subtitle?.device??"",
info: widget.model.device.serialNumber,
info: widget.model.device?.serialNumber??"",
),
const SizedBox(height:8),
Row(

@ -2,12 +2,22 @@ import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart';
import '../../../controllers/http_status_manger/http_status_manger.dart';
import '../../../controllers/localization/localization.dart';
import '../../../controllers/providers/api/device_transfer_provider.dart';
import '../../../controllers/providers/api/user_provider.dart';
import '../../../controllers/providers/settings/setting_provider.dart';
import '../../../extensions/int_extensions.dart';
import '../../../models/device/device_transfer.dart';
import '../../../models/device/device_transfer_info.dart';
import '../../../models/subtitle.dart';
import '../../app_style/sizing.dart';
import '../../widgets/buttons/app_button.dart';
import '../../widgets/departments/department_button.dart';
import '../../widgets/equipment/device_button.dart';
import '../../widgets/hospitals/hospital_button.dart';
import '../../widgets/loaders/loading_manager.dart';
import '../../widgets/titles/app_sub_title.dart';
class RequestDeviceTransfer extends StatefulWidget {
static const String id = "/request-device-transfer";
@ -36,11 +46,11 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
_onSubmit() async {
_validate = true;
if (!_formKey.currentState.validate()) {
if ((_formKey.currentState?.validate()??false)) {
setState(() {});
return false;
}
_formKey.currentState.save();
_formKey.currentState?.save();
if (!_formModel.validate()) {
setState(() {});
@ -50,16 +60,16 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
_isLoading = true;
setState(() {});
int status = await _deviceTransferProvider.createRequest(
user: _userProvider.user,
host: _settingProvider.host,
int? status = await _deviceTransferProvider?.createRequest(
user: _userProvider?.user,
host: _settingProvider?.host??"",
model: _formModel,
);
_isLoading = false;
setState(() {});
if (status >= 200 && status < 300) {
if (status!=null && status >= 200 && status < 300) {
Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully,
msg: _subtitle?.requestCompleteSuccessfully??"",
);
Navigator.of(context).pop();
} else {
@ -78,7 +88,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
@override
Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
_subtitle = AppLocalization.of(context)?.subtitle;
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
_deviceTransferProvider = Provider.of<DeviceTransferProvider>(context, listen: false);
@ -102,7 +112,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
padding: const EdgeInsets.all(8.0),
child: Text(
"Transfer Device",
style: Theme.of(context).textTheme.headline5.copyWith(color: Theme.of(context).primaryColor, fontSize: 28, fontWeight: FontWeight.bold),
style: Theme.of(context).textTheme.headline5?.copyWith(color: Theme.of(context).primaryColor, fontSize: 28, fontWeight: FontWeight.bold),
),
),
),
@ -124,7 +134,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
const ASubTitle("Device"),
if (_validate && _formModel.device == null)
ASubTitle(
_subtitle.requiredWord,
_subtitle?.requiredWord??"",
color: Colors.red,
),
6.height,
@ -149,37 +159,37 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
// ),
12.height,
const ASubTitle("Destination Client"),
if (_validate && _formModel.receiver.client == null)
if (_validate && _formModel.receiver?.client == null)
ASubTitle(
_subtitle.requiredWord,
_subtitle?.requiredWord??"",
color: Colors.red,
),
6.height,
HospitalButton(
hospital: _formModel.receiver.client,
hospital: _formModel.receiver?.client,
onHospitalPick: (hospital) {
_formModel.receiver.client = hospital;
_formModel.receiver?.client = hospital;
setState(() {});
},
),
12.height,
const ASubTitle("Destination Department"),
if (_validate && _formModel.receiver.department == null)
if (_validate && _formModel.receiver?.department == null)
ASubTitle(
_subtitle.requiredWord,
_subtitle?.requiredWord??"",
color: Colors.red,
),
6.height,
DepartmentButton(
department: _formModel.receiver.department,
department: _formModel.receiver?.department,
onDepartmentPick: (department) {
_formModel.receiver.department = department;
_formModel.receiver?.department = department;
setState(() {});
},
),
12.height,
AButton(
text: _subtitle.submit,
text: _subtitle?.submit??"",
onPressed: _onSubmit,
),
const SizedBox(

@ -1,18 +1,21 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/widgets/buttons/app_back_button.dart';
import 'package:test_sa/views/widgets/device_trancfer/device_transfer_list.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import '../../../controllers/localization/localization.dart';
import '../../../controllers/providers/api/device_transfer_provider.dart';
import '../../../controllers/providers/api/user_provider.dart';
import '../../../controllers/providers/settings/setting_provider.dart';
import '../../../models/subtitle.dart';
import '../../../models/user.dart';
import '../../app_style/colors.dart';
import '../../widgets/buttons/app_back_button.dart';
import '../../widgets/device_trancfer/device_transfer_list.dart';
import '../../widgets/loaders/loading_manager.dart';
class TrackDeviceTransferPage extends StatefulWidget {
static const String id = "/track-device-transfer";
const TrackDeviceTransferPage({Key key}) : super(key: key);
const TrackDeviceTransferPage({Key? key}) : super(key: key);
@override
State<TrackDeviceTransferPage> createState() => _TrackDeviceTransferPageState();
@ -20,27 +23,27 @@ class TrackDeviceTransferPage extends StatefulWidget {
class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage>
with TickerProviderStateMixin{
DeviceTransferProvider _deviceTransferProvider;
UserProvider _userProvider;
SettingProvider _settingProvider;
late DeviceTransferProvider _deviceTransferProvider;
UserProvider? _userProvider;
late SettingProvider _settingProvider;
@override
Widget build(BuildContext context) {
_deviceTransferProvider = Provider.of<DeviceTransferProvider>(context);
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
Subtitle _subtitle = AppLocalization.of(context).subtitle;
Subtitle? _subtitle = AppLocalization.of(context)?.subtitle;
return Scaffold(
body: SafeArea(
child: LoadingManager(
isLoading: _deviceTransferProvider.isLoading,
isLoading: _deviceTransferProvider.isLoading??false,
isFailedLoading: _deviceTransferProvider.items == null,
stateCode: _deviceTransferProvider.stateCode,
stateCode: _deviceTransferProvider.stateCode??0,
onRefresh: () async {
_deviceTransferProvider.reset();
await _deviceTransferProvider.getRequests(
user: _userProvider.user,
host: _settingProvider.host,
user: _userProvider?.user??User(),
host: _settingProvider.host??"",
);
},
child: Stack(
@ -59,7 +62,7 @@ class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage>
child: Center(
child: Text(
"Device Transfer",
style: Theme.of(context).textTheme.headline6.copyWith(
style: Theme.of(context).textTheme.headline6?.copyWith(
color: AColors.white,
fontStyle: FontStyle.italic
),
@ -78,8 +81,8 @@ class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage>
nextPage: _deviceTransferProvider.nextPage,
onLazyLoad: () async {
await _deviceTransferProvider.getRequests(
user: _userProvider.user,
host: _settingProvider.host,
user: _userProvider?.user??User(),
host: _settingProvider.host??"",
);
},
items: _deviceTransferProvider.items,

@ -1,29 +1,21 @@
import 'dart:convert';
.import 'dart:convert';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart';
import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/models/device/device_transfer.dart';
import 'package:test_sa/models/device/device_transfer_info.dart';
import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/app_text_form_field.dart';
import 'package:test_sa/views/widgets/buttons/app_button.dart';
import 'package:test_sa/views/widgets/e_signature/e_signature.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/status/gas_refill/gas_status.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
import '../../../../controllers/localization/localization.dart';
import '../../../controllers/providers/api/device_transfer_provider.dart';
import '../../../controllers/providers/api/user_provider.dart';
import '../../../controllers/providers/settings/setting_provider.dart';
import '../../../models/device/device_transfer.dart';
import '../../../models/device/device_transfer_info.dart';
import '../../../models/subtitle.dart';
class UpdateDeviceTransfer extends StatefulWidget {
final DeviceTransfer model;
final bool isSender;
const UpdateDeviceTransfer({Key key, this.model, this.isSender}) : super(key: key);
final DeviceTransfer? model;
final bool? isSender;
const UpdateDeviceTransfer({Key? key, this.model, this.isSender}) : super(key: key);
@override
State<UpdateDeviceTransfer> createState() => _UpdateDeviceTransferState();
@ -32,11 +24,11 @@ class UpdateDeviceTransfer extends StatefulWidget {
class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
bool _isLoading = false;
bool _validate = false;
Subtitle _subtitle;
UserProvider _userProvider;
SettingProvider _settingProvider;
Uint8List _signature;
DeviceTransferProvider _deviceTransferProvider;
Subtitle? _subtitle;
UserProvider? _userProvider;
SettingProvider? _settingProvider;
Uint8List? _signature;
DeviceTransferProvider? _deviceTransferProvider;
final TextEditingController _requestedQuantityController = TextEditingController();
final DeviceTransferInfo _formModel = DeviceTransferInfo();
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
@ -44,27 +36,27 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
_update() async {
_validate = true;
if(!_formKey.currentState.validate()){
if((_formKey.currentState?.validate()??false)){
setState(() {});
return false;
}
_formKey.currentState.save();
_formKey.currentState?.save();
_isLoading =true;
setState(() {});
int status = await _deviceTransferProvider.updateRequest(
int? status = await _deviceTransferProvider?.updateRequest(
user: _userProvider.user,
host: _settingProvider.host,
requestId: widget.model.id,
isSender: widget.isSender,
requestId: widget.model.,
isSender: widget.isSender??false,
newModel: _formModel,
oldModel: widget.model
);
_isLoading =false;
setState(() {});
if(status >= 200 && status < 300){
if(status!=null && status >= 200 && status < 300){
Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully,
msg: _subtitle?.requestCompleteSuccessfully??"",
);
_validate = false;
Navigator.of(context).pop();

@ -1,31 +1,33 @@
import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/models/device/device_transfer.dart';
import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/pages/device_transfer/device_transfer_details.dart';
import 'package:test_sa/views/widgets/device_trancfer/device_transfer_item.dart';
import 'package:test_sa/views/widgets/loaders/lazy_loading.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import '../../../controllers/localization/localization.dart';
import '../../../models/device/device_transfer.dart';
import '../../../models/subtitle.dart';
import '../../pages/device_transfer/device_transfer_details.dart';
import '../loaders/lazy_loading.dart';
import '../loaders/no_item_found.dart';
import 'device_transfer_item.dart';
class DeviceTransferList extends StatelessWidget {
final List<DeviceTransfer> items;
final bool nextPage;
final Future<void> Function() onLazyLoad;
final List<DeviceTransfer>? items;
final bool? nextPage;
final Future<void> Function()? onLazyLoad;
const DeviceTransferList({Key key, this.items, this.nextPage, this.onLazyLoad}) : super(key: key);
const DeviceTransferList({Key? key, this.items, this.nextPage, this.onLazyLoad}) : super(key: key);
@override
Widget build(BuildContext context) {
if(items.length == 0){
Subtitle subtitle = AppLocalization.of(context).subtitle;
return NoItemFound(message: subtitle.noServiceRequestFound,);
if((items?.isEmpty??0) == 0){
Subtitle? subtitle = AppLocalization.of(context)?.subtitle;
return NoItemFound(message: subtitle?.noServiceRequestFound??"",);
}
return LazyLoading(
nextPage: nextPage,
onLazyLoad: onLazyLoad,
child: ListView.builder(
//physics: const BouncingScrollPhysics(),
itemCount: items.length,
itemCount: items?.length,
padding: const EdgeInsets.symmetric(horizontal: 16,vertical: 8),
itemBuilder: (context,itemIndex){
return DeviceTransferItem(

@ -7,7 +7,7 @@ class ImageLoader extends StatelessWidget {
final Alignment alignment;
const ImageLoader({
Key key,
@required this.url,
this.url,
this.boxFit,
this.color,
this.alignment

@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:test_sa/views/app_style/sizing.dart';
import '../../app_style/sizing.dart';
import 'app_loading.dart';
class LazyLoading extends StatefulWidget {
final Widget child;
final bool nextPage;
@ -9,11 +9,11 @@ class LazyLoading extends StatefulWidget {
final VoidCallback onLoadingEnd;
const LazyLoading({
Key key,
Key? key,
this.nextPage = false,
this.child,
this.onLazyLoad,
this.onLoadingEnd,
required this.child,
required this.onLazyLoad,
required this.onLoadingEnd,
}) : super(key: key);
@override
@ -22,17 +22,17 @@ class LazyLoading extends StatefulWidget {
class _LazyLoadingState extends State<LazyLoading> with TickerProviderStateMixin {
AnimationController _animationController;
Animation<Offset> _offsetAnimation;
late AnimationController _animationController;
late Animation<Offset> _offsetAnimation;
_scrollListener() async {
if (!_animationController.isAnimating && !_animationController.isCompleted && widget.nextPage) {
_animationController.forward();
_animationController?.forward();
setState(() {});
await widget.onLazyLoad();
await Future.delayed(Duration(milliseconds: 600));
setState(() {});
_animationController.reverse();
_animationController?.reverse();
}
}
@ -57,7 +57,7 @@ class _LazyLoadingState extends State<LazyLoading> with TickerProviderStateMixin
@override
void dispose() {
super.dispose();
_animationController.dispose();
_animationController?.dispose();
}
@override
@ -77,7 +77,7 @@ class _LazyLoadingState extends State<LazyLoading> with TickerProviderStateMixin
position: _offsetAnimation,
child: Center(
child: Visibility(
visible: _animationController.isAnimating || _animationController.isCompleted,
visible: (_animationController?.isAnimating??false) || (_animationController?.isCompleted??false),
child: Container(
height: 36 * AppStyle.getScaleFactor(context),
width: 36 * AppStyle.getScaleFactor(context),

@ -17,11 +17,11 @@ class LoadingManager extends StatefulWidget {
LoadingManager({
Key key,
@required this.isLoading,
@required this.isFailedLoading,
@required this.stateCode,
@required this.onRefresh,
@required this.child,
this.isLoading,
this.isFailedLoading,
this.stateCode,
this.onRefresh,
this.child,
this.progress,
this.isNotPage = false,
this.askOnBack = false,

@ -12,7 +12,7 @@ import '../../app_style/sizing.dart';
class RecordSound extends StatefulWidget {
final Function(String) onRecord;
const RecordSound({Key key, @required this.onRecord}) : super(key: key);
const RecordSound({Key key, this.onRecord}) : super(key: key);
@override
State<RecordSound> createState() => _RecordSoundState();

@ -10,7 +10,7 @@ class ServiceReportLastCallsMenu extends StatelessWidget {
final ServiceReport report;
const ServiceReportLastCallsMenu({
Key key,@required this.onSelect,@required this.report}) : super(key: key);
Key key, this.onSelect, this.report}) : super(key: key);
@override
Widget build(BuildContext context) {
ServiceReportLastCallsProvider _menuProvider = Provider.of<ServiceReportLastCallsProvider>(context);

@ -1,18 +1,20 @@
import 'package:flutter/material.dart';
import 'package:test_sa/views/app_style/sizing.dart';
import '../../app_style/sizing.dart';
class ASubTitle extends StatelessWidget {
final String text;
final EdgeInsets padding;
final Color color;
final double font;
const ASubTitle(this.text, {Key key,this.padding, this.color, this.font}) : super(key: key);
final EdgeInsets? padding;
final Color? color;
final double? font;
const ASubTitle(this.text, {Key? key,this.padding, this.color, this.font}) : super(key: key);
@override
Widget build(BuildContext context) {
return Padding(
padding: padding ?? EdgeInsets.zero,
child: Text(
text,
style: Theme.of(context).textTheme.bodyText1.copyWith(
style: Theme.of(context).textTheme.bodyText1?.copyWith(
// fontWeight: FontWeight.bold,
fontSize: font,
color: color

Loading…
Cancel
Save