Когда изображение снимается с помощью функции CapturePhotoAsync (), при возврате на страницу Xamarin Forms вызывается функция OnAppearing

#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 вызывается при появлении страницы. Это нормальное поведение. Вы можете легко добавить флаг bool RefreshLogAndButtons , чтобы предотвратить многократный вызов

4. @Джейсон, я сделал это, это прекрасно работало на Android, но потом я узнал, что OnAppearing не работает на iOS. Очень разочаровывает. Так что теперь я изменил свою логику.

5. «Итак, теперь я изменил свою логику». Означает ли это, что у тебя все получилось? Если да, подумайте о том, чтобы добавить «Свой ответ» ниже, чтобы показать, какие изменения вы внесли, чтобы заставить его работать. Это помогло бы другим в будущем.