Вызов асинхронной функции при переходе на новую вкладку - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь отобразить Media Picker Джеймса Монтеманьо немедленно, когда пользователь переходит на одну из моих страниц с вкладками. Я нашел функцию под названием OnAppearing (), которую я попытался переопределить, чтобы получить такой результат. Хотя технически он показывает камеру сразу же, когда я переключаю вкладки, после того, как я закрываю окно выбора мультимедиа, я получаю сообщение об ошибке: «Одновременно может быть активна только одна операция».

Вот как я пытаюсь для реализации этой функции:

protected override async void OnAppearing()
    {
        TakePhotoButton_Clicked();
    }


    async void TakePhotoButton_Clicked()
    {
        //Allows users to take pictures in the app
        if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
        {
            DisplayAlert("No Camera", "Camera is not available.", "OK");
            return;
        }

        var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
        {
            //Sets the properties of the photo file 
            SaveToAlbum = true,
            PhotoSize = PhotoSize.MaxWidthHeight,
            DefaultCamera = CameraDevice.Rear
        });

        if (file == null)
            return;
    }

Я новичок во всем этом, и мне кажется, что я делаю техническую ошибку. Я прочитал этот пост https://damian.fyi/2016/07/06/only-one-operation-can-be-active-at-at-time/ о том, что у кого-то такая же ошибка. Они утверждали: «Я наконец понял, что после того, как я сделал снимок, форма повторно отображалась, что привело к повторному запуску появляющегося события и, таким образом, к созданию новой фотографии во время съемки старой. Отсюда трещина sh. "

Однако я не понимаю, как мой код вызывает это. Приветствуются любые рекомендации.

1 Ответ

1 голос
/ 03 августа 2020

используйте переменную bool, чтобы проверить, сделали ли вы уже снимок

bool first = true;

protected override async void OnAppearing()
{
   if (first) TakePhotoButton_Clicked();
}

async void TakePhotoButton_Clicked()
{
    first = false;

    ...
}
...