#xamarin #xamarin.forms #xamarin.android #xamarin.ios
#xamarin #xamarin.формы #xamarin.android #xamarin.ios
Вопрос:
Я хочу обновлять свои данные всякий раз, когда приложение возобновляется в фоновом режиме. На самом деле, я хочу, чтобы эта функциональность была только на одной странице, а не во всем приложении. Я использую метод Prism OnAppearning в своем представлении модели. После съемки фотографии с помощью камеры, когда элемент управления возвращается в приложение и снова вызывается метод OnApearning. Как избежать этой ситуации? Я попробовал OnSleep и onResume в представлении модели, но они также ведут себя одинаково.
Я прикрепил свой код модели представления ниже. ClockInTriggered вызывается, когда пользователь хочет отметить посещаемость лицом. Метод распознавания пользователя получает вызов для получения снимка с камеры. После фотографирования метод OnAppearning получает вызов, который раздражает.
private async void ClockInTriggered() { string action = await App.Current.MainPage.DisplayActionSheet(AppResources.Select_Activity, AppResources.Cancel, null, Activities.Select(x =gt; x.Name).ToArray()); if (action == AppResources.Cancel || action == null) return; Activity SelectedRole = Activities.SingleOrDefault(x =gt; x.Name == action); ClockInVisibility = false; LoadingIndicator = true; LoadingText = ""; var recResult = await RecognizeUser(); if (recResult == false) { ClockInVisibility = true; LoadingIndicator = false; return; } var locResult = await GetCurrentLocation(); var revGeoResult = await GetReverseGeoLocation(); LoadingText = AppResources.Done_; await Task.Delay(1000); if (recResult amp;amp; locResult amp;amp; revGeoResult) { Attendance attendance = new Attendance() { DateNTime = DateTime.Now, CheckType = "CheckIn", ActivityId = SelectedRole.Id, LocationInfo = ReverseGeoCoding, Lati = Lati, Longi = Longi }; var result = await AddAttendanceEntry(attendance, "CheckIn"); switch (result) { case "true": Listlt;Attendancegt; unsortedAttendance = await GetEmployeeStoredAttendance(); Attendance = unsortedAttendance.OrderByDescending(x =gt; x.DateNTime).ToObservableCollection(); break; case "false": await App.Current.MainPage.DisplayAlert(AppResources.Error, AppResources.We_could_not_clock_you_in__Please_try_again_, AppResources.OK); ClockInVisibility = true; LoadingIndicator = false; return; default: await App.Current.MainPage.DisplayAlert(AppResources.Error, result, AppResources.OK); await navigationService.NavigateAsync("/MasterLayout/NavigationPage/MainPage/TimeAttendance"); break; } } else { ClockInVisibility = true; LoadingIndicator = false; await App.Current.MainPage.DisplayAlert(AppResources.Error, AppResources.We_could_not_clock_you_in__It_can_be_due_to_location_or_face_detection_problem__Please_try_again_, AppResources.OK); return; } LoadingIndicator = false; TimeGradient1 = "#FFB75E"; TimeGradient2 = "#DA2020"; ClockOutVisibility = true; } private async Tasklt;boolgt; RecognizeUser() { if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported) { await App.Current.MainPage.DisplayAlert(AppResources.No_Camera, AppResources.No_camera_is_available_, AppResources.OK); return false; } var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions { PhotoSize = Plugin.Media.Abstractions.PhotoSize.Small, CompressionQuality = 60, Directory = "Recognition", Name = DateTime.Now "-Identify.jpg" }); if (file == null) { return false; } RecognitionResult = await Identify(file.GetStream()); if (RecognitionResult.ReturnType == null) { await App.Current.MainPage.DisplayAlert(AppResources.Alert, RecognitionResult.Status, AppResources.OK); return false; } bool result = await GetCurrentLocation(); return true; } private async void RefreshLogAndButtons() { LoadingIndicator = true; LoadingText = AppResources.Loading___Please_Wait_; ClockInVisibility = false; ClockOutVisibility = false; await Task.Delay(2000); await GetCurrentLocation(); await GetReverseGeoLocation(); Listlt;Attendancegt; unsortedAttendance = await GetEmployeeStoredAttendance(); Attendance = unsortedAttendance.OrderByDescending(x =gt; x.DateNTime).ToObservableCollection(); if (Attendance.Count != 0 amp;amp; Attendance != null) { ActivateButton(); try { TotalTime = await TimeDifferenceCalculator(Attendance); } catch (Exception e) { } } else { ClockInVisibility = true; LoadingIndicator = false; } } public void OnAppearing() { RefreshLogAndButtons(); } public void OnDisappearing() { }
Комментарии:
1. Как мы можем вам помочь, если вы не публикуете какой-либо соответствующий код?
2. @Джейсон, пожалуйста, просмотрите еще раз, я обновил вопрос.
3.
OnAppearing
вызывается при появлении страницы. Это нормальное поведение. Вы можете легко добавить флаг boolRefreshLogAndButtons
, чтобы предотвратить многократный вызов4. @Джейсон, я сделал это, это прекрасно работало на Android, но потом я узнал, что OnAppearing не работает на iOS. Очень разочаровывает. Так что теперь я изменил свою логику.
5. «Итак, теперь я изменил свою логику». Означает ли это, что у тебя все получилось? Если да, подумайте о том, чтобы добавить «Свой ответ» ниже, чтобы показать, какие изменения вы внесли, чтобы заставить его работать. Это помогло бы другим в будущем.