Engineer : Track Service Screen & Preventive Maintenance Screen & Notifications Screen

merge-requests/4/head
zaid_daoud 3 years ago
parent e88c88ef4e
commit d8252529ce

@ -13,7 +13,7 @@ class NotificationsProvider extends ChangeNotifier {
//reset provider data
void reset() {
notifications = null;
notifications.clear();
nextPage = true;
stateCode = null;
}
@ -27,7 +27,7 @@ class NotificationsProvider extends ChangeNotifier {
bool? nextPage = true;
// list of user requests
List<AppNotification>? notifications;
List<AppNotification> notifications = [];
// when requests in-process _loading = true
// done _loading = true
@ -64,8 +64,7 @@ class NotificationsProvider extends ChangeNotifier {
List<AppNotification> serviceRequestsPage = requestsListJson
.map((request) => AppNotification.fromJson(request))
.toList();
notifications ??= [];
notifications?.addAll(serviceRequestsPage);
notifications.addAll(serviceRequestsPage);
if (serviceRequestsPage.length == pageItemNumber) {
nextPage = true;
} else {

@ -16,7 +16,7 @@ class RegularVisitsProvider extends ChangeNotifier {
//reset provider data
void reset() {
visits = null;
visits.clear();
nextPage = true;
stateCode = null;
}
@ -30,7 +30,7 @@ class RegularVisitsProvider extends ChangeNotifier {
bool nextPage = true;
// list of user requests
List<Visit>? visits;
List<Visit> visits = [];
// when requests in-process _loading = true
// done _loading = true
@ -45,8 +45,8 @@ class RegularVisitsProvider extends ChangeNotifier {
/// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getVisits({
required String host,
required User user,
required String? host,
required User? user,
// VisitsSearch visitsSearch,
}) async {
if (isLoading == true) {
@ -58,7 +58,7 @@ class RegularVisitsProvider extends ChangeNotifier {
try {
response = await get(
Uri.parse(
"$host${URLs.getRegularVisits}?uid=${user.id}&token=${user.token}&page=${(visits?.length ?? 0) ~/ pageItemNumber}${visitsSearch?.toSearchString()}",
"$host${URLs.getRegularVisits}?uid=${user?.id}&token=${user?.token}&page=${(visits.length) ~/ pageItemNumber}${visitsSearch?.toSearchString()}",
),
headers: {"Content-Type": "application/json; charset=utf-8"},
);
@ -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,

@ -50,7 +50,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getRequests({
required String host,
required User user,
required User? user,
required String? hospitalId,
}) async {
if (isLoading == true) {
@ -61,7 +61,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
try {
response = await get(
Uri.parse(
"$host${URLs.getServiceRequests}?uid=${user.id}${hospitalId == null ? "" : "&client_nid=$hospitalId"}&token=${user.token}&page=${(serviceRequests?.length ?? 0) ~/ pageItemNumber}${search?.toSearchString()}",
"$host${URLs.getServiceRequests}?uid=${user?.id}${hospitalId == null ? "" : "&client_nid=$hospitalId"}&token=${user?.token}&page=${(serviceRequests?.length ?? 0) ~/ pageItemNumber}${search?.toSearchString()}",
),
headers: {"Content-Type": "application/json; charset=utf-8"},
);
@ -108,7 +108,9 @@ class ServiceRequestsProvider extends ChangeNotifier {
'$host${URLs.getSingleServiceRequest}?call_nid=$requestId$userData',
));
} catch (error) {
throw (HttpStatusManger.getStatusMessage(status: -1, subtitle: subtitle) ?? '');
throw (HttpStatusManger.getStatusMessage(
status: -1, subtitle: subtitle) ??
'');
}
// If the call to the server was successful, parse the JSON.
@ -121,7 +123,8 @@ class ServiceRequestsProvider extends ChangeNotifier {
return requests[0];
} else {
throw (HttpStatusManger.getStatusMessage(
status: response.statusCode, subtitle: subtitle) ?? "");
status: response.statusCode, subtitle: subtitle) ??
"");
}
}
@ -174,8 +177,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),
@ -228,8 +231,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 +288,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,8 +317,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["job_id"] = request.id ?? '';
body["start_time"] = ((timer.startAt?.millisecondsSinceEpoch ?? 0) / 1000)
.toStringAsFixed(0);

@ -158,10 +158,10 @@ class MyApp extends StatelessWidget {
ServiceRequestsPage.id: (_) => ServiceRequestsPage(),
NotificationsPage.id: (_) => NotificationsPage(),
FutureRequestServiceDetails.id: (_) =>
FutureRequestServiceDetails(),
const FutureRequestServiceDetails(),
PreventiveMaintenanceVisitsPage.id: (_) =>
PreventiveMaintenanceVisitsPage(),
RegularVisitsPage.id: (_) => RegularVisitsPage(),
RegularVisitsPage.id: (_) => const RegularVisitsPage(),
TrackGasRefillPage.id: (_) => const TrackGasRefillPage(),
RequestDeviceTransfer.id: (_) => const RequestDeviceTransfer(),
TrackDeviceTransferPage.id: (_) => const TrackDeviceTransferPage(),

@ -34,8 +34,10 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
UserProvider? _userProvider;
SettingProvider? _settingProvider;
DeviceTransferProvider? _deviceTransferProvider;
final TextEditingController _requestedQuantityController = TextEditingController();
final DeviceTransfer _formModel = DeviceTransfer(receiver: DeviceTransferInfo());
final TextEditingController _requestedQuantityController =
TextEditingController();
final DeviceTransfer _formModel =
DeviceTransfer(receiver: DeviceTransferInfo());
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@ -46,7 +48,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
_onSubmit() async {
_validate = true;
if ((_formKey.currentState?.validate()??false)) {
if ((_formKey.currentState?.validate() ?? false)) {
setState(() {});
return false;
}
@ -62,18 +64,19 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
int? status = await _deviceTransferProvider?.createRequest(
user: _userProvider?.user,
host: _settingProvider?.host??"",
host: _settingProvider?.host ?? "",
model: _formModel,
);
_isLoading = false;
setState(() {});
if (status!=null && status >= 200 && status < 300) {
if (status != null && status >= 200 && status < 300) {
Fluttertoast.showToast(
msg: _subtitle?.requestCompleteSuccessfully??"",
msg: _subtitle?.requestCompleteSuccessfully ?? "",
);
Navigator.of(context).pop();
} else {
String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle);
String errorMessage = HttpStatusManger.getStatusMessage(
status: status, subtitle: _subtitle);
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(errorMessage),
));
@ -91,7 +94,8 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
_subtitle = AppLocalization.of(context)?.subtitle;
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
_deviceTransferProvider = Provider.of<DeviceTransferProvider>(context, listen: false);
_deviceTransferProvider =
Provider.of<DeviceTransferProvider>(context, listen: false);
return Scaffold(
key: _scaffoldKey,
body: Form(
@ -112,7 +116,10 @@ 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),
),
),
),
@ -134,12 +141,12 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
const ASubTitle("Device"),
if (_validate && _formModel.device == null)
ASubTitle(
_subtitle?.requiredWord??"",
_subtitle?.requiredWord ?? "",
color: Colors.red,
),
6.height,
DeviceButton(
device: _formModel.device!,
device: _formModel.device,
onDevicePick: (device) {
_formModel.device = device;
setState(() {});
@ -161,7 +168,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
const ASubTitle("Destination Client"),
if (_validate && _formModel.receiver?.client == null)
ASubTitle(
_subtitle?.requiredWord??"",
_subtitle?.requiredWord ?? "",
color: Colors.red,
),
6.height,
@ -176,7 +183,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
const ASubTitle("Destination Department"),
if (_validate && _formModel.receiver?.department == null)
ASubTitle(
_subtitle?.requiredWord??"",
_subtitle?.requiredWord ?? "",
color: Colors.red,
),
6.height,
@ -189,7 +196,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
),
12.height,
AButton(
text: _subtitle?.submit??"",
text: _subtitle?.submit ?? "",
onPressed: _onSubmit,
),
const SizedBox(

@ -16,24 +16,26 @@ import '../../../widgets/search/service_request_search_bar.dart';
class ServiceRequestsPage extends StatefulWidget {
static final String id = "/service-requests";
@override
_ServiceRequestsPageState createState() => _ServiceRequestsPageState();
}
class _ServiceRequestsPageState extends State<ServiceRequestsPage>
with TickerProviderStateMixin{
with TickerProviderStateMixin {
late ServiceRequestsProvider _serviceRequestsProvider;
late UserProvider _userProvider;
late SettingProvider _settingProvider;
bool _expandedSearch = false;
bool _firstTime = true;
@override
Widget build(BuildContext context) {
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
Subtitle _subtitle = AppLocalization.of(context)!.subtitle!;
if(_firstTime){
Subtitle? subtitle = AppLocalization.of(context)?.subtitle;
if (_firstTime) {
_serviceRequestsProvider.reset();
_firstTime = false;
}
@ -47,9 +49,9 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage>
onRefresh: () async {
_serviceRequestsProvider.reset();
await _serviceRequestsProvider.getRequests(
user: _userProvider.user!,
host: _settingProvider.host??"",
hospitalId: _userProvider.user!.hospital!.id,
user: _userProvider.user!,
host: _settingProvider.host ?? "",
hospitalId: _userProvider.user!.hospital!.id,
);
},
child: Stack(
@ -57,20 +59,25 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage>
Column(
children: [
Container(
color:AColors.primaryColor,
padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4),
color: AColors.primaryColor,
padding:
const EdgeInsets.symmetric(horizontal: 0, vertical: 4),
child: Column(
children: [
Row(
children: [
ABackButton(),
const ABackButton(),
Expanded(
child: Center(
child: Text(
_subtitle.serviceRequests,
style: Theme.of(context).textTheme.headline6?.copyWith(
color: AColors.white,
fontStyle: FontStyle.italic ),
subtitle?.serviceRequests ?? '',
style: Theme.of(context)
.textTheme
.titleLarge
?.copyWith(
color: AColors.white,
fontStyle: FontStyle.italic,
),
),
),
),
@ -81,25 +88,27 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage>
buttonSize: 42,
backgroundColor: AColors.white,
onPressed: () async {
ServiceRequestSearch? _temp = await showModalBottomSheet(
context: context,
isScrollControlled: true,
builder: (context){
return ServiceRequestsSearchDialog(
initialSearchValue: _serviceRequestsProvider.search!,
);
});
if(_temp != null){
_serviceRequestsProvider.search = _temp;
ServiceRequestSearch? temp =
await showModalBottomSheet(
context: context,
isScrollControlled: true,
builder: (context) {
return ServiceRequestsSearchDialog(
initialSearchValue:
_serviceRequestsProvider.search!,
);
},
);
if (temp != null) {
_serviceRequestsProvider.search = temp;
_serviceRequestsProvider.reset();
setState(() {});
}
},
),
SizedBox(width: 16,)
const SizedBox(width: 16)
],
),
],
),
),
@ -108,17 +117,16 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage>
nextPage: _serviceRequestsProvider.nextPage!,
onLazyLoad: () async {
await _serviceRequestsProvider.getRequests(
user: _userProvider.user!,
host: _settingProvider.host??"",
hospitalId: _userProvider.user!.hospital!.id,
user: _userProvider.user,
host: _settingProvider.host ?? "",
hospitalId: _userProvider.user?.hospital?.id,
);
},
requests: _serviceRequestsProvider.serviceRequests!,
requests: _serviceRequestsProvider.serviceRequests ?? [],
),
),
],
),
],
),
),

@ -21,13 +21,15 @@ import '../../../widgets/visits/visits_list.dart';
import 'update_visits_group_sheet.dart';
class RegularVisitsPage extends StatefulWidget {
static final String id = "/Regular-visits";
static const String id = "/Regular-visits";
const RegularVisitsPage({super.key});
@override
_RegularVisitsPageState createState() => _RegularVisitsPageState();
}
class _RegularVisitsPageState extends State<RegularVisitsPage>
with TickerProviderStateMixin{
with TickerProviderStateMixin {
late RegularVisitsProvider _visitsProvider;
late UserProvider _userProvider;
late SettingProvider _settingProvider;
@ -43,14 +45,13 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
body: SafeArea(
child: LoadingManager(
isLoading: _visitsProvider.isLoading,
isFailedLoading: _visitsProvider.visits == null,
stateCode: _visitsProvider.stateCode,
onRefresh: () async {
_visitsProvider.reset();
//_visitsProvider.visitsSearch = VisitsSearch();
await _visitsProvider.getVisits(
user: _userProvider.user!,
host: _settingProvider.host!,
user: _userProvider.user,
host: _settingProvider.host,
);
},
child: Stack(
@ -58,8 +59,9 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
Column(
children: [
Container(
color:AColors.primaryColor,
padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4),
color: AColors.primaryColor,
padding:
const EdgeInsets.symmetric(horizontal: 0, vertical: 4),
child: Column(
children: [
Row(
@ -69,10 +71,12 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
child: Center(
child: Text(
_subtitle.preventiveMaintenance,
style: Theme.of(context).textTheme.headline6?.copyWith(
color: AColors.white,
fontStyle: FontStyle.italic
),
style: Theme.of(context)
.textTheme
.headline6
?.copyWith(
color: AColors.white,
fontStyle: FontStyle.italic),
),
),
),
@ -80,41 +84,49 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
duration: Duration(milliseconds: 400),
child: AIconButton(
key: ValueKey(_expandedSearch),
iconData: _expandedSearch ? Icons.keyboard_arrow_up :Icons.search,
iconData: _expandedSearch
? Icons.keyboard_arrow_up
: Icons.search,
color: AColors.secondaryColor,
buttonSize: 42,
backgroundColor: AColors.white,
onPressed: () async {
VisitsSearch _temp = await showModalBottomSheet(
context: context,
isScrollControlled: true,
builder: (context){
return VisitsSearchDialog(
initialSearchValue: _visitsProvider.visitsSearch!, onSearch: (VisitsSearch ) { },
);
});
if(_temp != null){
_visitsProvider.visitsSearch?.fromSearch(_temp) ;
_visitsProvider.reset();
setState(() {});
}
VisitsSearch _temp =
await showModalBottomSheet(
context: context,
isScrollControlled: true,
builder: (context) {
return VisitsSearchDialog(
initialSearchValue:
_visitsProvider.visitsSearch!,
onSearch: (VisitsSearch) {},
);
});
_visitsProvider.visitsSearch
?.fromSearch(_temp);
_visitsProvider.reset();
setState(() {});
},
),
),
SizedBox(width: 16,)
SizedBox(
width: 16,
)
],
),
],
),
),
Visibility(
visible: _visitsProvider.visitsSearch?.toSearchString().isNotEmpty??false,
visible: _visitsProvider.visitsSearch
?.toSearchString()
.isNotEmpty ??
false,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: AButton(
text: _subtitle.clearSearch,
onPressed: (){
onPressed: () {
_visitsProvider.visitsSearch = VisitsSearch();
_visitsProvider.reset();
setState(() {});
@ -127,59 +139,60 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
nextPage: _visitsProvider.nextPage,
onLazyLoad: () async {
await _visitsProvider.getVisits(
user: _userProvider.user!,
host: _settingProvider.host??"",
user: _userProvider.user!,
host: _settingProvider.host ?? "",
);
},
onEditGroup: (visits) async {
VisitsGroup _group = await showModalBottomSheet(
VisitsGroup? group = await showModalBottomSheet(
isScrollControlled: true,
context: context,
builder: (context) {
return UpdateVisitsGroupSheet(visits: visits,title: _subtitle.updateRegularVisits,);
return UpdateVisitsGroupSheet(
visits: visits,
title: _subtitle.updateRegularVisits,
);
},
)as VisitsGroup;
if(_group != null){
) as VisitsGroup?;
if (group != null) {
showDialog<void>(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return CupertinoAlertDialog(
title: Text(_subtitle.updatingDots),
content: Center(child: CircularProgressIndicator()),
content:
Center(child: CircularProgressIndicator()),
);
},
);
int status = await _visitsProvider.updateGroupOfVisits(
user: _userProvider.user!,
host: _settingProvider.host??"",
group: _group
);
int status =
await _visitsProvider.updateGroupOfVisits(
user: _userProvider.user!,
host: _settingProvider.host ?? "",
group: group);
Navigator.of(context).pop();
if(status >= 200 && status < 300){
if (status >= 200 && status < 300) {
Fluttertoast.showToast(
msg: _subtitle.regularVisitsUpdatedSuccessfully,
toastLength: Toast.LENGTH_LONG,
gravity: ToastGravity.BOTTOM,
msg: _subtitle.regularVisitsUpdatedSuccessfully,
toastLength: Toast.LENGTH_LONG,
gravity: ToastGravity.BOTTOM,
);
}else{
} else {
Fluttertoast.showToast(
msg: HttpStatusManger.getStatusMessage(
status: status,
subtitle: _subtitle
),
status: status, subtitle: _subtitle),
toastLength: Toast.LENGTH_LONG,
gravity: ToastGravity.BOTTOM,
);
}
}
},
visits: _visitsProvider.visits!,
visits: _visitsProvider.visits,
),
),
],
),
],
),
),

@ -9,9 +9,10 @@ import 'single_device_picker.dart';
class DeviceButton extends StatelessWidget {
final Function(Device)? onDevicePick;
final Device device;
final Device? device;
const DeviceButton({Key? key, required this.device, this.onDevicePick}) : super(key: key);
const DeviceButton({Key? key, required this.device, this.onDevicePick})
: super(key: key);
@override
Widget build(BuildContext context) {
@ -19,9 +20,11 @@ class DeviceButton extends StatelessWidget {
return ElevatedButton(
style: ElevatedButton.styleFrom(
elevation: 0,
padding: EdgeInsets.symmetric(horizontal: 16, vertical: device == null ? 12 : 8),
padding: EdgeInsets.symmetric(
horizontal: 16, vertical: device == null ? 12 : 8),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)),
borderRadius: BorderRadius.circular(
AppStyle.borderRadius * AppStyle.getScaleFactor(context)),
),
foregroundColor: AColors.primaryColor,
backgroundColor: AColors.inputFieldBackgroundColor,
@ -33,7 +36,7 @@ class DeviceButton extends StatelessWidget {
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 6),
child: Text(
_subtitle?.pickDevice??"",
_subtitle?.pickDevice ?? "",
style: Theme.of(context).textTheme.subtitle1,
textScaleFactor: AppStyle.getScaleFactor(context),
textDirection: TextDirection.rtl,
@ -45,7 +48,7 @@ class DeviceButton extends StatelessWidget {
child: ListTile(
contentPadding: EdgeInsets.all(0),
title: Text(
"${_subtitle?.sn??""} : ${device.serialNumber??""}",
"${_subtitle?.sn ?? ""} : ${device?.serialNumber ?? ""}",
style: Theme.of(context).textTheme.subtitle1,
),
subtitle: Column(
@ -55,24 +58,26 @@ class DeviceButton extends StatelessWidget {
color: Theme.of(context).textTheme.subtitle1?.color,
),
Text(
"${_subtitle?.brand} : ${device.brand}",
"${_subtitle?.brand} : ${device?.brand}",
style: Theme.of(context).textTheme.subtitle2,
),
Divider(
color: Theme.of(context).textTheme.subtitle1?.color,
),
Text(
"${_subtitle?.model} : ${device.model}",
"${_subtitle?.model} : ${device?.model}",
style: Theme.of(context).textTheme.subtitle2,
),
],
),
)),
const Icon(Icons.keyboard_arrow_down, size: 28, color: AColors.grey3A),
const Icon(Icons.keyboard_arrow_down,
size: 28, color: AColors.grey3A),
],
),
onPressed: () async {
Device _device = await Navigator.of(context).pushNamed(SingleDevicePicker.id) as Device;
Device _device = await Navigator.of(context)
.pushNamed(SingleDevicePicker.id) as Device;
onDevicePick!(_device);
});
}

Loading…
Cancel
Save