From fcec60e978f6c3f44fd3680bea204aedc91801cd Mon Sep 17 00:00:00 2001 From: FaizHashmiCS22 Date: Thu, 27 Mar 2025 15:39:00 +0300 Subject: [PATCH] Completed Kiosk Flow --- assets/images/kiosk_queue_icon.svg | 4 + lib/constants/app_constants.dart | 7 +- lib/main.dart | 2 +- lib/models/global_config_model.dart | 7 +- lib/models/kiosk_queue_model.dart | 56 +++++++++ lib/models/kiosk_ticket_model.dart | 22 ++++ lib/repositories/screen_details_repo.dart | 16 ++- lib/utilities/enums.dart | 1 + lib/view_models/screen_config_view_model.dart | 35 +++++- .../common_widgets/app_general_widgets.dart | 5 +- .../kiosk_screens/kiosk_main_screen.dart | 112 ++++++++++++------ lib/views/splash_screen/splash_screen.dart | 1 - pubspec.lock | 30 ++--- 13 files changed, 226 insertions(+), 72 deletions(-) create mode 100644 assets/images/kiosk_queue_icon.svg create mode 100644 lib/models/kiosk_queue_model.dart create mode 100644 lib/models/kiosk_ticket_model.dart diff --git a/assets/images/kiosk_queue_icon.svg b/assets/images/kiosk_queue_icon.svg new file mode 100644 index 0000000..14627f9 --- /dev/null +++ b/assets/images/kiosk_queue_icon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/lib/constants/app_constants.dart b/lib/constants/app_constants.dart index 9dcb22b..d01acb8 100644 --- a/lib/constants/app_constants.dart +++ b/lib/constants/app_constants.dart @@ -59,6 +59,7 @@ class AppAssets { static String noInternetImage = "assets/images/undraw_connected_world_wuay.png"; static String cloudLogo = "assets/images/cloud_logo.png"; static String languageIcon = "assets/images/language_icon.svg"; + static String kioskQueueIcon = "assets/images/kiosk_queue_icon.svg"; //IconPaths static String vitalSignIcon = "assets/images/vitalsign_icon.svg"; @@ -88,7 +89,7 @@ class AppConstants { static String onlyLetters = "[a-zA-Z &'\"]"; static String onlyDate = "[0-9/]"; static String apiKey = 'EE17D21C7943485D9780223CCE55DCE5'; - static String testIP = '10.20.10.30'; + static String testIP = '12.4.5.1'; // projectID.QlineType.ScreenType.AnyNumber (1 to 10) static int thresholdForListUI = 3; } @@ -96,7 +97,8 @@ class ApiConstants { static String baseUrl = 'https://ms.hmg.com/nscapi'; static String baseUrlHub = '$baseUrl/PatientCallingHub'; static String baseUrlApi = '$baseUrl/api'; - static String baseUrlApiGen = '$baseUrl/api/Gen/'; + static String baseUrlApiGen = '$baseUrl/api/Gen'; + static String baseUrlApiPatientCall = '$baseUrlApi/PatientCall'; static String createTicket = '$baseUrlApiPatientCall/LAB_PatientCallNo_Get'; static String commonConfigGet = '$baseUrlApiPatientCall/Common_Config_GetByIP'; @@ -108,6 +110,7 @@ class ApiConstants { //Generic static String createTicketForKiosk = '$baseUrlApiGen/GEN_PatientCallNo_Get'; + static String ticketCallRequestUpdateForKiosk = '$baseUrlApiGen/GEN_TicketQueueAck_Insert'; // Signal R Constants diff --git a/lib/main.dart b/lib/main.dart index 1214523..7dfbdad 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -25,7 +25,7 @@ class MyApp extends StatelessWidget { builder: (context, constraints) { return OrientationBuilder(builder: (context, orientation) { SizeConfig().init(constraints, orientation); - SystemChrome.setPreferredOrientations([DeviceOrientation.landscapeLeft]); + SystemChrome.setPreferredOrientations([DeviceOrientation.portraitDown]); SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []); return MultiProvider( providers: [ diff --git a/lib/models/global_config_model.dart b/lib/models/global_config_model.dart index c14a0ec..790415d 100644 --- a/lib/models/global_config_model.dart +++ b/lib/models/global_config_model.dart @@ -1,5 +1,5 @@ -import 'dart:developer'; import 'dart:ui'; +import 'package:hmg_qline/models/kiosk_queue_model.dart'; import 'package:hmg_qline/utilities/enums.dart'; import 'package:hmg_qline/utilities/extensions.dart'; @@ -59,6 +59,7 @@ class GlobalConfigurationsModel { double? projectLatitude; double? projectLongitude; int? cityKey; + List? kioskQueueList; GlobalConfigurationsModel({ this.id, @@ -116,6 +117,7 @@ class GlobalConfigurationsModel { this.projectLatitude, this.projectLongitude, this.cityKey, + this.kioskQueueList, }); GlobalConfigurationsModel.fromJson(Map json) { @@ -176,6 +178,9 @@ class GlobalConfigurationsModel { projectLatitude = json['projectLatitude'] == 0 ? 0.0 : json['projectLatitude']; projectLongitude = json['projectLongitude'] == 0 ? 0.0 : json['projectLongitude']; cityKey = json['cityKey']; + if (json['kioskQueue'] != null) { + kioskQueueList = List.from(json['kioskQueue'].map((kioskQueueJson) => KioskQueueModel.fromJson(kioskQueueJson))); + } } } diff --git a/lib/models/kiosk_queue_model.dart b/lib/models/kiosk_queue_model.dart new file mode 100644 index 0000000..21dabee --- /dev/null +++ b/lib/models/kiosk_queue_model.dart @@ -0,0 +1,56 @@ +class KioskQueueModel { + int? id; + int? projectID; + String? projectName; + String? projectNameN; + int? queueID; + String? queueName; + String? queueNameN; + int? kioskID; + String? kioskName; + String? kioskNameN; + String? ipAddress; + bool? isActive; + int? createdBy; + String? createdOn; + dynamic editedBy; + dynamic editedOn; + + KioskQueueModel({ + this.id, + this.projectID, + this.projectName, + this.projectNameN, + this.queueID, + this.queueName, + this.queueNameN, + this.kioskID, + this.kioskName, + this.kioskNameN, + this.ipAddress, + this.isActive, + this.createdBy, + this.createdOn, + this.editedBy, + this.editedOn, + }); + + KioskQueueModel.fromJson(Map json) { + id = json['id']; + projectID = json['projectID']; + projectName = json['projectName']; + projectNameN = json['projectNameN']; + queueID = json['queueID']; + queueName = json['queueName']; + queueNameN = json['queueNameN']; + kioskID = json['kioskID']; + kioskName = json['kioskName']; + kioskNameN = json['kioskNameN']; + ipAddress = json['ipAddress']; + isActive = json['isActive']; + createdBy = json['createdBy']; + createdOn = json['createdOn']; + editedBy = json['editedBy']; + editedOn = json['editedOn']; + } +} diff --git a/lib/models/kiosk_ticket_model.dart b/lib/models/kiosk_ticket_model.dart new file mode 100644 index 0000000..77df29d --- /dev/null +++ b/lib/models/kiosk_ticket_model.dart @@ -0,0 +1,22 @@ +class KioskPatientTicket { + String? patientCallNo; + int? projectID; + int? ticketQueueID; + int? result; + + KioskPatientTicket({ + this.patientCallNo, + this.projectID, + this.ticketQueueID, + this.result, + }); + + factory KioskPatientTicket.fromJson(Map json) { + return KioskPatientTicket( + patientCallNo: json['patientCallNo'], + projectID: json['projectID'], + ticketQueueID: json['ticketQueueID'], + result: json['result'], + ); + } +} diff --git a/lib/repositories/screen_details_repo.dart b/lib/repositories/screen_details_repo.dart index 383c052..0a13a8b 100644 --- a/lib/repositories/screen_details_repo.dart +++ b/lib/repositories/screen_details_repo.dart @@ -2,6 +2,7 @@ import 'package:hmg_qline/api/api_client.dart'; import 'package:hmg_qline/constants/app_constants.dart'; import 'package:hmg_qline/models/generic_response_model.dart'; import 'package:hmg_qline/models/global_config_model.dart'; +import 'package:hmg_qline/models/kiosk_ticket_model.dart'; import 'package:hmg_qline/models/prayers_widget_model.dart'; import 'package:hmg_qline/models/rss_feed_model.dart'; import 'package:hmg_qline/models/weathers_widget_model.dart'; @@ -13,7 +14,7 @@ abstract class ScreenDetailsRepo { Future createNextTickets({required int ticketNumber}); - Future createTicketFromKiosk({required int queueId}); + Future createTicketFromKiosk({required int projectId, required int queueId}); Future getScreenConfigurationsByIP({required String ipAddress}); @@ -80,20 +81,23 @@ class ScreenDetailsRepoImp implements ScreenDetailsRepo { } @override - Future createTicketFromKiosk({required int queueId}) async { + Future createTicketFromKiosk({required int projectId, required int queueId}) async { try { var params = { - "projectID": "15", + "projectID": "$projectId", + "queueID": "$queueId", + "isVidaPlus": false, "createdBy": "101", - "isVidaPlus": true, "apiKey": AppConstants.apiKey, }; - GenericRespModel adsGenericModel = await apiClientInstance.postJsonForObject( + GenericRespModel genericRespModel = await apiClientInstance.postJsonForObject( (json) => GenericRespModel.fromJson(json), ApiConstants.createTicketForKiosk, params, ); - return adsGenericModel; + + genericRespModel.data = KioskPatientTicket.fromJson(genericRespModel.data); + return genericRespModel; } catch (e) { logger.e(e.toString()); InfoComponents.showToast(e.toString()); diff --git a/lib/utilities/enums.dart b/lib/utilities/enums.dart index 86760f1..ad6eb8a 100644 --- a/lib/utilities/enums.dart +++ b/lib/utilities/enums.dart @@ -36,4 +36,5 @@ enum KioskScreenStateEnums { languageState, queueSelectionState, ticketNoState, + busyState, } diff --git a/lib/view_models/screen_config_view_model.dart b/lib/view_models/screen_config_view_model.dart index 8c314dc..5a715cc 100644 --- a/lib/view_models/screen_config_view_model.dart +++ b/lib/view_models/screen_config_view_model.dart @@ -5,6 +5,8 @@ import 'package:hmg_qline/config/dependency_injection.dart'; import 'package:hmg_qline/constants/app_constants.dart'; import 'package:hmg_qline/models/generic_response_model.dart'; import 'package:hmg_qline/models/global_config_model.dart'; +import 'package:hmg_qline/models/kiosk_queue_model.dart'; +import 'package:hmg_qline/models/kiosk_ticket_model.dart'; import 'package:hmg_qline/models/prayers_widget_model.dart'; import 'package:hmg_qline/models/rss_feed_model.dart'; import 'package:hmg_qline/models/weathers_widget_model.dart'; @@ -14,6 +16,7 @@ import 'package:hmg_qline/services/connectivity_service.dart'; import 'package:hmg_qline/utilities/enums.dart'; import 'package:hmg_qline/utilities/extensions.dart'; import 'package:hmg_qline/view_models/queuing_view_model.dart'; +import 'package:hmg_qline/views/view_helpers/info_components.dart'; class ScreenConfigViewModel extends ChangeNotifier { final ScreenDetailsRepo screenDetailsRepo; @@ -73,6 +76,13 @@ class ScreenConfigViewModel extends ChangeNotifier { notifyListeners(); } + KioskPatientTicket? kioskPatientTicket = KioskPatientTicket(); + + void updateTicketGeneratedFromKiosk(KioskPatientTicket? value) { + kioskPatientTicket = value; + notifyListeners(); + } + LanguageEnum currentSelectedKioskLanguage = LanguageEnum.english; void updateCurrentSelectedKioskLanguage(LanguageEnum value) { @@ -122,9 +132,9 @@ class ScreenConfigViewModel extends ChangeNotifier { GlobalConfigurationsModel globalConfigurationsModel = GlobalConfigurationsModel(); Future getGlobalConfigurationsByIP() async { - // TODO: TEST ONLY - updateCurrentScreenTypeEnum(ScreenTypeEnum.kioskScreen); - updateCurrentQTypeEnum(QTypeEnum.general); + // // TODO: TEST ONLY + // updateCurrentScreenTypeEnum(ScreenTypeEnum.kioskScreen); + // updateCurrentQTypeEnum(QTypeEnum.general); GlobalConfigurationsModel? response = await screenDetailsRepo.getGlobalScreenConfigurations(ipAddress: currentScreenIP); if (response == null) { @@ -132,8 +142,8 @@ class ScreenConfigViewModel extends ChangeNotifier { return; } updateGlobalConfigurationsModel(value: response); - // updateCurrentScreenTypeEnum(globalConfigurationsModel.screenTypeEnum); - // updateCurrentQTypeEnum(globalConfigurationsModel.qTypeEnum); + updateCurrentScreenTypeEnum(globalConfigurationsModel.screenTypeEnum); + updateCurrentQTypeEnum(globalConfigurationsModel.qTypeEnum); notifyListeners(); } @@ -322,4 +332,19 @@ class ScreenConfigViewModel extends ChangeNotifier { log("last ticket is: $startTicket "); } + + Future createTicketFromKiosk({required int projectId, required int queueId}) async { + try { + GenericRespModel? response = await screenDetailsRepo.createTicketFromKiosk(projectId: projectId, queueId: queueId); + if (response == null || response.messageStatus != 1) { + logger.e("response null from createTicketFromKiosk"); + return null; + } + return response.data; + } catch (e) { + InfoComponents.showToast(e.toString()); + logger.i(e.toString()); + return null; + } + } } diff --git a/lib/views/common_widgets/app_general_widgets.dart b/lib/views/common_widgets/app_general_widgets.dart index 34ac287..fcb0e90 100644 --- a/lib/views/common_widgets/app_general_widgets.dart +++ b/lib/views/common_widgets/app_general_widgets.dart @@ -153,13 +153,12 @@ Widget noPatientInQueue({required String text, required String fontName, require } Widget commonSelectionCardKiosk({required ScreenConfigViewModel screenConfigViewModel, required String title, required String icon, required VoidCallback onTap}) { - log("screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum: ${screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum}"); return InkWell( onTap: onTap, child: SizedBox( child: Container( - constraints: BoxConstraints(minWidth: SizeConfig.getWidthMultiplier() * 30), - padding: const EdgeInsets.all(10), + constraints: BoxConstraints(minWidth: SizeConfig.getWidthMultiplier() * 40), + padding: const EdgeInsets.all(30), margin: const EdgeInsets.all(10), decoration: AppColors.configWidgetDecoration, child: Directionality( diff --git a/lib/views/kiosk_screens/kiosk_main_screen.dart b/lib/views/kiosk_screens/kiosk_main_screen.dart index 441769f..1c21a59 100644 --- a/lib/views/kiosk_screens/kiosk_main_screen.dart +++ b/lib/views/kiosk_screens/kiosk_main_screen.dart @@ -2,6 +2,9 @@ import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:hmg_qline/constants/app_constants.dart'; +import 'package:hmg_qline/models/generic_response_model.dart'; +import 'package:hmg_qline/models/kiosk_queue_model.dart'; +import 'package:hmg_qline/models/kiosk_ticket_model.dart'; import 'package:hmg_qline/utilities/enums.dart'; import 'package:hmg_qline/utilities/extensions.dart'; import 'package:hmg_qline/view_models/screen_config_view_model.dart'; @@ -78,25 +81,45 @@ class KioskMainScreen extends StatelessWidget { } Widget kioskQueueSelectionStateWidget(ScreenConfigViewModel screenConfigViewModel) { - return GridView.builder( - itemCount: 5, - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: (screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitUp || - screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitDown) - ? 3 - : 2, - ), - itemBuilder: (BuildContext context, int index) { - return Column(mainAxisSize: MainAxisSize.min, children: [ - commonSelectionCardKiosk( - screenConfigViewModel: screenConfigViewModel, - title: "New Latest Certificate Generation ${index + 1}", - icon: AppAssets.languageIcon, - onTap: () { - screenConfigViewModel.updateKioskScreenState(KioskScreenStateEnums.ticketNoState); - }), - ]); - }); + bool isEnglish = screenConfigViewModel.currentSelectedKioskLanguage == LanguageEnum.english; + + return Directionality( + textDirection: isEnglish ? TextDirection.ltr : TextDirection.rtl, + child: GridView.builder( + itemCount: screenConfigViewModel.globalConfigurationsModel.kioskQueueList!.length, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: (screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitUp || + screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitDown) + ? 2 + : 3, + ), + itemBuilder: (BuildContext context, int index) { + KioskQueueModel kioskQueueModel = screenConfigViewModel.globalConfigurationsModel.kioskQueueList![index]; + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + commonSelectionCardKiosk( + screenConfigViewModel: screenConfigViewModel, + title: screenConfigViewModel.currentSelectedKioskLanguage == LanguageEnum.english ? "${kioskQueueModel.queueName}" : "${kioskQueueModel.queueNameN}", + icon: AppAssets.kioskQueueIcon, + onTap: () async { + screenConfigViewModel.updateKioskScreenState(KioskScreenStateEnums.busyState); + KioskPatientTicket? kioskPatientTicket = await screenConfigViewModel.createTicketFromKiosk( + projectId: kioskQueueModel.projectID ?? 0, + queueId: kioskQueueModel.queueID ?? 0, + ); + if (kioskPatientTicket == null) { + screenConfigViewModel.updateKioskScreenState(KioskScreenStateEnums.languageState); + return; + } + screenConfigViewModel.updateTicketGeneratedFromKiosk(kioskPatientTicket); + screenConfigViewModel.updateKioskScreenState(KioskScreenStateEnums.ticketNoState); + }, + ), + ], + ); + }), + ); } Widget kioskTicketNumberStateWidget(ScreenConfigViewModel screenConfigViewModel) { @@ -112,18 +135,13 @@ class KioskMainScreen extends StatelessWidget { fontFamily: isEnglish ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins, ), const SizedBox(height: 20), - InkWell( - onTap: () { - screenConfigViewModel.updateKioskScreenState(KioskScreenStateEnums.languageState); - }, - child: AppText( - isEnglish ? "PHR-45" : "بي اتش ار-٤٥", - fontSize: SizeConfig.getWidthMultiplier() * 10, - fontHeight: 1, - fontWeight: FontWeight.bold, - textDirection: isEnglish ? TextDirection.ltr : TextDirection.rtl, - fontFamily: isEnglish ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins, - ), + AppText( + screenConfigViewModel.kioskPatientTicket!.patientCallNo ?? "", + fontSize: SizeConfig.getWidthMultiplier() * 10, + fontHeight: 1, + fontWeight: FontWeight.bold, + textDirection: isEnglish ? TextDirection.ltr : TextDirection.rtl, + fontFamily: isEnglish ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins, ), const SizedBox(height: 20), AppText( @@ -134,6 +152,21 @@ class KioskMainScreen extends StatelessWidget { fontHeight: 1, fontFamily: isEnglish ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins, ), + const SizedBox(height: 100), + InkWell( + onTap: () { + screenConfigViewModel.updateKioskScreenState(KioskScreenStateEnums.languageState); + }, + child: AppText( + isEnglish ? "Go to Main Page" : "اذهب إلى الصفحة الرئيسية", + fontSize: SizeConfig.getWidthMultiplier() * 3, + textAlign: TextAlign.center, + textDecoration: TextDecoration.underline, + textDirection: isEnglish ? TextDirection.ltr : TextDirection.rtl, + fontHeight: 1, + fontFamily: isEnglish ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins, + ), + ), ], ); } @@ -141,13 +174,16 @@ class KioskMainScreen extends StatelessWidget { Widget dataContentKiosk({required BuildContext context}) { return Padding( padding: const EdgeInsets.all(10), - child: Consumer(builder: (BuildContext context, ScreenConfigViewModel screenConfigViewModel, Widget? child) { - return switch (screenConfigViewModel.kioskScreenStateEnum) { - KioskScreenStateEnums.languageState => kioskLanguageStateWidget(screenConfigViewModel), - KioskScreenStateEnums.queueSelectionState => kioskQueueSelectionStateWidget(screenConfigViewModel), - KioskScreenStateEnums.ticketNoState => kioskTicketNumberStateWidget(screenConfigViewModel), - }; - }), + child: Consumer( + builder: (BuildContext context, ScreenConfigViewModel screenConfigViewModel, Widget? child) { + return switch (screenConfigViewModel.kioskScreenStateEnum) { + KioskScreenStateEnums.languageState => kioskLanguageStateWidget(screenConfigViewModel), + KioskScreenStateEnums.queueSelectionState => kioskQueueSelectionStateWidget(screenConfigViewModel), + KioskScreenStateEnums.ticketNoState => kioskTicketNumberStateWidget(screenConfigViewModel), + KioskScreenStateEnums.busyState => const Center(child: CircularProgressIndicator()), + }; + }, + ), ); } diff --git a/lib/views/splash_screen/splash_screen.dart b/lib/views/splash_screen/splash_screen.dart index f32cbcb..22bf113 100644 --- a/lib/views/splash_screen/splash_screen.dart +++ b/lib/views/splash_screen/splash_screen.dart @@ -47,7 +47,6 @@ class SplashScreen extends StatelessWidget { // If the data is loaded successfully if (snapshot.connectionState == ConnectionState.done) { Future.delayed(const Duration(seconds: 1)).whenComplete(() { - log("context.read().currentScreenTypeEnum: ${context.read().currentScreenTypeEnum}"); if (context.read().currentScreenTypeEnum == ScreenTypeEnum.kioskScreen) { context.navigateReplaceTo(AppRoutes.kioskMainScreen); } else { diff --git a/pubspec.lock b/pubspec.lock index 6a5e217..4d2e170 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -77,10 +77,10 @@ packages: dependency: transitive description: name: collection - sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "1.19.0" + version: "1.18.0" connectivity_plus: dependency: "direct main" description: @@ -332,18 +332,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.7" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "3.0.8" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: @@ -628,7 +628,7 @@ packages: dependency: transitive description: flutter source: sdk - version: "0.0.0" + version: "0.0.99" source_span: dependency: transitive description: @@ -665,10 +665,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.11.1" stream_channel: dependency: transitive description: @@ -681,10 +681,10 @@ packages: dependency: transitive description: name: string_scanner - sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.2.0" term_glyph: dependency: transitive description: @@ -697,10 +697,10 @@ packages: dependency: transitive description: name: test_api - sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.3" + version: "0.7.2" tuple: dependency: transitive description: @@ -761,10 +761,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" url: "https://pub.dev" source: hosted - version: "14.3.0" + version: "14.2.5" wakelock_plus: dependency: "direct main" description: