Xamarin Forms 选择器 SelectedIndexChange 空异常
Xamarin Forms picker SelectedIndexChange null exception
我创建了一个应用程序,要求输入用户名和 returns 该用户的统计信息。当计数器大于 1 时,它会关注选择器并要求选择其中一个选项。之后,将调用 SelectedIndexChanged (Platformselect_SelectedIndexChanged) 方法并获取统计信息。问题是,如果用户输入用户名,则第一次有效。当用户返回并重新输入用户名时,它不会聚焦(它不会显示选择器)并自动调用 SelectedIndexChanged 方法,其中 platformselect.SelectedIndex 为 -1 导致我的程序崩溃。你能帮帮我吗?
我试过将焦点设置在主线程上,我在iOS和Android中都测试过,但出现了同样的问题。
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
platformselect.HeightRequest = 0;
this.search.Clicked += Button_Clicked;
}
public async void searchStats(string usernameText)
{
search.IsEnabled = false;
activityIndicator.IsRunning = true;
var id = await GetDataLogic.GetID(usernameText);
publicid = id;
activityIndicator.IsRunning = false;
if (id.uid == "error")
{
await DisplayAlert("Error", "Could not find username: " + usernameText, "OK");
search.IsEnabled = true;
return;
}
else if (id.uid == "errornointernet")
{
await DisplayAlert("Error", "Could not connect to the Internet. Please check your connection and try again.", "OK");
search.IsEnabled = true;
return;
}
else
{
if(id.platforms.Count > 1)
{
platformselect.ItemsSource = publicid.platforms.ToList();
//we have to show alert to choose platform and then call get user stats.
**Device.BeginInvokeOnMainThread(() =>
{
if (platformselect.IsFocused)
platformselect.Unfocus();
platformselect.Focus();
});**
}
else
{
//we call it without asking because there is only one platform.
var userstats = await GetDataLogic.GetStats(id, 0);
await Navigation.PushAsync(new Stats(userstats, favorites));
}
}
}
private async void Platformselect_SelectedIndexChanged(object sender, EventArgs e)
{
//the second time it doesnt show the picker and it automatically enters -1... it returns null exception. Has to be investigated.
var userstats = await GetDataLogic.GetStats(publicid, platformselect.SelectedIndex);
await Navigation.PushAsync(new Stats(userstats, favorites));
}
}
我希望它始终专注于选择器并等待用户的响应,而不是自动调用 SelectedIndexChanged 并将 -1 作为 selectedindex
我建议以这种方式更改您的事件处理程序
private async void Platformselect_SelectedIndexChanged(object sender, EventArgs e)
{
//Check for unselection event
if(platformselect.SelectedIndex == -1) return;
var userstats = await GetDataLogic.GetStats(publicid, platformselect.SelectedIndex);
await Navigation.PushAsync(new Stats(userstats, favorites));
}
我创建了一个应用程序,要求输入用户名和 returns 该用户的统计信息。当计数器大于 1 时,它会关注选择器并要求选择其中一个选项。之后,将调用 SelectedIndexChanged (Platformselect_SelectedIndexChanged) 方法并获取统计信息。问题是,如果用户输入用户名,则第一次有效。当用户返回并重新输入用户名时,它不会聚焦(它不会显示选择器)并自动调用 SelectedIndexChanged 方法,其中 platformselect.SelectedIndex 为 -1 导致我的程序崩溃。你能帮帮我吗?
我试过将焦点设置在主线程上,我在iOS和Android中都测试过,但出现了同样的问题。
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
platformselect.HeightRequest = 0;
this.search.Clicked += Button_Clicked;
}
public async void searchStats(string usernameText)
{
search.IsEnabled = false;
activityIndicator.IsRunning = true;
var id = await GetDataLogic.GetID(usernameText);
publicid = id;
activityIndicator.IsRunning = false;
if (id.uid == "error")
{
await DisplayAlert("Error", "Could not find username: " + usernameText, "OK");
search.IsEnabled = true;
return;
}
else if (id.uid == "errornointernet")
{
await DisplayAlert("Error", "Could not connect to the Internet. Please check your connection and try again.", "OK");
search.IsEnabled = true;
return;
}
else
{
if(id.platforms.Count > 1)
{
platformselect.ItemsSource = publicid.platforms.ToList();
//we have to show alert to choose platform and then call get user stats.
**Device.BeginInvokeOnMainThread(() =>
{
if (platformselect.IsFocused)
platformselect.Unfocus();
platformselect.Focus();
});**
}
else
{
//we call it without asking because there is only one platform.
var userstats = await GetDataLogic.GetStats(id, 0);
await Navigation.PushAsync(new Stats(userstats, favorites));
}
}
}
private async void Platformselect_SelectedIndexChanged(object sender, EventArgs e)
{
//the second time it doesnt show the picker and it automatically enters -1... it returns null exception. Has to be investigated.
var userstats = await GetDataLogic.GetStats(publicid, platformselect.SelectedIndex);
await Navigation.PushAsync(new Stats(userstats, favorites));
}
}
我希望它始终专注于选择器并等待用户的响应,而不是自动调用 SelectedIndexChanged 并将 -1 作为 selectedindex
我建议以这种方式更改您的事件处理程序
private async void Platformselect_SelectedIndexChanged(object sender, EventArgs e)
{
//Check for unselection event
if(platformselect.SelectedIndex == -1) return;
var userstats = await GetDataLogic.GetStats(publicid, platformselect.SelectedIndex);
await Navigation.PushAsync(new Stats(userstats, favorites));
}