我们正在尝试使用插件" Xam.Plugin.Geolocator"在我们的Xamarin Forms项目中。该项目目前仅限IOS。
我们的应用会根据设备用户的当前位置返回商家列表。我们点击API返回我们的JSON格式列表数据,API运行正常。
我们希望每当用户下拉,更改选项卡以及页面最初加载时更新列表,但目前这只在大约100次尝试中工作一次或两次。我还没有找到一个模式,说明它失败的原因,或者确实是它失败的原因。
我们在页面加载时设置应用程序属性,选择选项卡并且用户刷新如下 -
public async void GetLocation()
{
try
{
locator = CrossGeolocator.Current;
if (locator.IsGeolocationAvailable && locator.IsGeolocationEnabled)
{
var position = await locator.GetPositionAsync();
App.Current.Properties["Longitude"] = position.Longitude.ToString();
App.Current.Properties["Latitude"] = position.Latitude.ToString();
}
else
{
await DisplayAlert("Location Error", "Unable to retrieve location at this time", "Cancel");
}
}catch(Exception e)
{
await DisplayAlert("Location Error", "Unable to retrieve location at this time","Cancel");
}
}
我们在三个方面调用上述方法
1)加载页面时
public NearbyPage()
{
InitializeComponent();
GetLocation();
SetNearbyBusinesses();
NearbyBusinesses = new List<NearbyBusiness>();
SetViewData();
SetViewVisibility();
}
2)单击选项卡时
protected override void OnAppearing()
{
base.OnAppearing();
GetLocation();
SetNearbyBusinesses();
NearbyLocationsView.ItemsSource = NearbyBusinesses;
NoLocationsView.ItemsSource = UserMessages;
SetViewVisibility();
}
3)当用户下拉刷新时
public void RefreshData()
{
if (!CrossConnectivity.Current.IsConnected)
{
NoInternetMessage.IsVisible = true;
return;
}
GetLocation();
NoInternetMessage.IsVisible = false;
SetNearbyBusinesses();
NearbyLocationsView.ItemsSource = NearbyBusinesses;
NoLocationsView.ItemsSource = UserMessages;
SetViewVisibility();
_analyticsService.RecordEvent("Refresh Event: Refresh nearby businesses", AnalyticsEventCategory.UserAction);
}
任何人都可以了解我们的错误或有使用此插件的经验,可以帮助我们解决此问题吗?
谢谢
修改
通过&#34; work&#34;,我的意思是我们希望用用户当前位置数据点击我们的API,并在每次用户下拉刷新时从API返回新结果,页面最初加载或按特定选项卡时加载。目前偶尔会偶尔使用它。
我们无法使用连接到macbook的手机进行调试,因为我们安装了geolocator插件后,应用程序在连接时始终崩溃。除了位置之外,应用程序在部署到设备时似乎工作正常。我们目前正通过微软移动中心部署测试设备。
答案 0 :(得分:0)
好的,所以调试器总是崩溃并且无法看到任何堆栈跟踪等,我们在黑暗中拍摄了几张照片。
我们已经设法通过我们的代码堆栈向我们的方法签名添加async
来实现这一点。这解决了问题,地理位置和刷新工作正常。
例如,当我们更改上述方法3.刷新数据时,它工作得很好。
public async Task RefreshData()
{
if (!CrossConnectivity.Current.IsConnected)
{
NoInternetMessage.IsVisible = true;
return;
}
GetLocation();
NoInternetMessage.IsVisible = false;
SetNearbyBusinesses();
NearbyLocationsView.ItemsSource = NearbyBusinesses;
NoLocationsView.ItemsSource = UserMessages;
SetViewVisibility();
_analyticsService.RecordEvent("Refresh Event: Refresh nearby businesses", AnalyticsEventCategory.UserAction);
}
我们重构了更多代码,但添加async
是它的工作原理。
我希望这可以帮助别人节省一些时间。