这个答案的灵感来自 Xamarin/Azure 布道者 Brandon Minnick --> 看看他的项目,他使用以下代码处理类似情况:
那么我们可以从上面得到什么?如果你看一下上下文,他已经将他的 Views 与他的 ViewModels 以 MVVM 风格连接起来。但是,各种库要求从主线程调用某些方法。这是问题的本质,也是这段代码可以解决的问题。
因此,为了采用上述代码解决问题中解决的地理位置问题,我执行了以下操作:
Task<Xamarin.Essentials.Location> GetLocationFromPhone()
{
var locationTaskCompletionSource = new TaskCompletionSource<Xamarin.Essentials.Location>();
Device.BeginInvokeOnMainThread(async () =>
{
locationTaskCompletionSource.SetResult(await Geolocation.GetLastKnownLocationAsync());
});
return locationTaskCompletionSource.Task;
}
我在任务中使用我的 ViewModel 中的上述内容。类似于以下内容。
async Task ExecuteGetGeoLocationCommand()
{
try
{
var locationFromPhone = await GetLocationFromPhone().ConfigureAwait(false);
if (locationFromPhone is null)
return;
_location = locationFromPhone;
if (_location != null)
{
Console.WriteLine($"Latitude: {_location.Latitude}, Longitude {_location.Longitude}, Altitude: {_location.Altitude}");
}
else
{
Console.WriteLine($"Exiting geolocation");
}
catch (FeatureNotSupportedException fnsEx)
{
}
catch (Exception ex)
{
}
}
}
我希望它对其他人有帮助!