You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin C#位置权限请求异步逻辑问题求助

解决Xamarin位置权限异步请求导致逻辑提前执行的问题

问题核心

你代码里的问题主要有两个:

  • 构造函数里直接调用异步权限请求方法,但未等待操作完成就立刻检查权限,此时权限弹窗还未处理完毕,第二次检查自然会失败。
  • CheckLocationPermission用.Result同步获取异步操作结果,既容易造成死锁,也不符合异步编程规范。

解决方案

把权限检查和请求逻辑移到页面的OnAppearing生命周期方法(该方法支持异步),同时修正所有异步方法的调用方式,确保等待操作完成后再执行后续逻辑:

修改后的完整代码

namespace Eindproject.Views
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class Stations : ContentPage
    {
        public Stations()
        {
            InitializeComponent();
        }

        protected override async void OnAppearing()
        {
            base.OnAppearing();
            
            // 先检查权限状态
            var permissionStatus = await CheckLocationPermission();
            
            if (permissionStatus != PermissionStatus.Granted)
            {
                // 请求权限并更新状态
                permissionStatus = await RequestLocationPermission();
            }

            if (permissionStatus == PermissionStatus.Granted)
            {
                // 加载前端内容
                await FrontendAsync();
            }
            else
            {
                // 弹出权限缺失提示
                await DisplayAlert("Error", "Location permission is required", "OK");
            }
        }

        private async Task<PermissionStatus> RequestLocationPermission()
        {
            // 请求位置权限并返回结果
            return await Permissions.RequestAsync<Permissions.LocationWhenInUse>();
        }

        private async Task<PermissionStatus> CheckLocationPermission()
        {
            // 异步检查权限状态
            return await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>();
        }

        private async Task FrontendAsync()
        {
            // 获取当前位置
            Location location = await DataRepository.GetLocationAsync();
            // 获取附近站点列表
            List<IcaoStation> stations = await DataRepository.GetNearbyStationsAsync(location.Latitude, location.Longitude);
            // 绑定列表数据源
            lvwCollectibleItems.ItemsSource = stations;
        }
    }
}

关键改动说明

  • 权限逻辑从构造函数移至OnAppearing:构造函数是同步执行的,不适合处理异步操作;OnAppearing是页面显示时触发的生命周期方法,改为async void后可安全等待异步操作完成。
  • 异步方法统一返回Task/Task<T>:除事件或生命周期方法外,避免使用async void,确保能正确等待操作完成。
  • 用await替代.Result:避免线程阻塞,保证权限请求的用户响应处理完毕后,再执行后续逻辑。
  • 重命名frontend为FrontendAsync并返回Task:保持异步方法命名规范,方便调用时等待操作完成。

这样修改后,代码会等待用户处理权限请求后,再根据结果决定加载前端内容或弹出错误提示,彻底解决你遇到的问题。

内容的提问来源于stack exchange,提问作者Bartballon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 20:42:02