У меня вопрос по выпускному проекту для школы. Поэтому у меня проблема при запросе разрешения на запрос местоположения. Когда эти разрешения в порядке, местоположение и внешний интерфейс могут быть показаны. Если нет, отображается ошибка. Проблема в том, что эта функция асинхронная, поэтому она не ждет ответа о том, что местоположение разрешено. Поэтому он сразу показывает сообщение об ошибке. Кто-нибудь знает, как это решить? Искренне.
namespace Eindproject.Views
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class Stations : ContentPage
{
public Stations()
{
InitializeComponent();
// Check for location permission before getting location
if (CheckLocationPermission())
{
// Load frontend
frontend();
}
else
{
// Ask for permission
RequestLocationPermission();
// check again
if (CheckLocationPermission())
{
// Load frontend
frontend();
}
else
{
// Show error
DisplayAlert("Error", "Location permission is required", "OK");
}
}
}
private async void RequestLocationPermission()
{
// Ask for permission
await Permissions.RequestAsync<Permissions.LocationWhenInUse>();
}
private bool CheckLocationPermission()
{
// Check if permission is granted
if (PermissionStatus.Granted == Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>().Result)
{
return true;
}
else
{
return false;
}
}
private async void frontend()
{
// Get location
Location location = await DataRepository.GetLocationAsync();
// Get stations
List<IcaoStation> stations = await DataRepository.GetNearbyStationsAsync(location.Latitude, location.Longitude);
// Set source
lvwCollectibleItems.ItemsSource = stations;
}
}
}
Для всего, что связано с Task<T>
передовой практикой, вы должны await
результат. Делать .Result
плохо.
Переместите фактический код из конструктора в соответствующий обработчик событий, таких как Loaded
, NavigatedTo
или Appearing
. Объявите эти обработчики событий как асинхронные, затем вы можете использовать await
в своем async
методе RequestLocationPermission
, чтобы отложить следующий код, пока не будет доступен результат.
Вы также должны объявить CheckLocationPermission
как async
и использовать await
на CheckStatusAsync
вместо доступа к свойству Result
задачи.
Вы вызываете асинхронные методы без использования ожидания и вызываете их из конструктора. Оба эти плохие