在 Xamarin.forms 中设置 MainPage 在 Android 上崩溃 - System.ArgumentException
Setting the MainPage in Xamarin.forms crashes on Android - System.ArgumentException
下面是我在 Xamarin.Forms 项目中的 App.css。
public partial class App : Application
{
//public static string access_token;
//public static string bearer;
public static new App Current;
public App()
{
InitializeComponent();
Current = this;
var isLoggedIn = Properties.ContainsKey("IsLoggedIn") ? (bool)Properties["IsLoggedIn"] : false;
if (isLoggedIn)
MainPage = new NavigationPage(new MasterPage());
else
MainPage = new NavigationPage(new LoginPage());
}
......
protected async override void OnResume()
{
base.OnResume();
}
public async void OnBackButtonPressed(object sender, EventArgs e)
{
}
public void ShowMainPage()
{
MainPage = new NavigationPage(new MasterPage());
}
public void Logout()
{
Properties["IsLoggedIn"] = false; // only gets set to 'true' on the LoginPage
MainPage = new NavigationPage(new LoginPage());
}
}
当我登录时,抽屉图标不显示。
我尝试旋转屏幕,现在显示了。
之后,我点击注销按钮(它调用了我上面提到的 App.css 的注销功能),它显示
System.ArgumentException
Handle must be valid.
Parameter name :instance
谁能帮帮我?
快速信息:
- 最低 Android 版本:4.0.3(API 级别 15)
- 目标 Android 版本:自动 - 使用目标版本 (API 25)
- Xamarin Android 版本:7.3
更新:登录页面
public partial class LoginPage : ContentPage
{
RestService service;
public LoginPage()
{
InitializeComponent();
var signInGesture = new TapGestureRecognizer();
signInGesture.Tapped += SignInGesture_Tapped;
signInButton.GestureRecognizers.Add(signInGesture);
NavigationPage.SetHasNavigationBar(this, false);
}
async void SignInGesture_Tapped(object sender, EventArgs e)
{
await signInButton.ScaleTo(0.95, 50, Easing.CubicOut);
signInButton.ScaleTo(1, 50, Easing.CubicIn);
if (string.IsNullOrEmpty(emailEntry.Text) || string.IsNullOrEmpty(passwordEntry.Text) )
await DisplayAlert("Error", "Username and Password should not be empty.", "OK");
else if(!Utils.IsValidEmail(emailEntry.Text))
await DisplayAlert("Error", "Email should be in valid format.", "OK");
else
{
loadingIndicator.IsRunning = true;
var login = new Login{
grant_type = "password",
username = emailEntry.Text,
password = passwordEntry.Text
};
service = new RestService();
var response = await service.Login(login);
if (response != null)
{
if (response.status_code == System.Net.HttpStatusCode.OK)
{
App.Current.Properties["IsLoggedIn"] = true;
App.Current.ShowMainPage();
}
else
{
loadingIndicator.IsRunning = false;
await DisplayAlert(response.error, response.error_description, "OK");
}
}
else
{
loadingIndicator.IsRunning = false;
await DisplayAlert("Failed", Config.CommonErrorMsg, "OK");
}
}
}
async void ResetButton_Clicked(object sender, EventArgs e)
{
loadingIndicator.IsRunning = false;
await Navigation.PushAsync(new ForgetPasswordPage());
}
}
MasterPage:CS 文件中的空构造函数,我只是附加 XAML。
<?xml version="1.0" encoding="UTF-8"?>
<MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="MyTenantWorld.MasterPage" xmlns:local="clr-namespace:MyTenantWorld;assembly=MyTenantWorld">
<MasterDetailPage.Master>
<local:MenuPage x:Name="menuPage" />
</MasterDetailPage.Master>
<MasterDetailPage.Detail>
<NavigationPage>
<x:Arguments>
<local:HomePage />
</x:Arguments>
</NavigationPage>
</MasterDetailPage.Detail>
</MasterDetailPage>
不可见的菜单图标在 MasterDetailPage 的详细信息页面上带有 NavigationPage.SetHasNavigationBar(this, false);
。
下面是我在 Xamarin.Forms 项目中的 App.css。
public partial class App : Application
{
//public static string access_token;
//public static string bearer;
public static new App Current;
public App()
{
InitializeComponent();
Current = this;
var isLoggedIn = Properties.ContainsKey("IsLoggedIn") ? (bool)Properties["IsLoggedIn"] : false;
if (isLoggedIn)
MainPage = new NavigationPage(new MasterPage());
else
MainPage = new NavigationPage(new LoginPage());
}
......
protected async override void OnResume()
{
base.OnResume();
}
public async void OnBackButtonPressed(object sender, EventArgs e)
{
}
public void ShowMainPage()
{
MainPage = new NavigationPage(new MasterPage());
}
public void Logout()
{
Properties["IsLoggedIn"] = false; // only gets set to 'true' on the LoginPage
MainPage = new NavigationPage(new LoginPage());
}
}
当我登录时,抽屉图标不显示。
我尝试旋转屏幕,现在显示了。
之后,我点击注销按钮(它调用了我上面提到的 App.css 的注销功能),它显示
System.ArgumentException
Handle must be valid.
Parameter name :instance
谁能帮帮我?
快速信息: - 最低 Android 版本:4.0.3(API 级别 15) - 目标 Android 版本:自动 - 使用目标版本 (API 25) - Xamarin Android 版本:7.3
更新:登录页面
public partial class LoginPage : ContentPage
{
RestService service;
public LoginPage()
{
InitializeComponent();
var signInGesture = new TapGestureRecognizer();
signInGesture.Tapped += SignInGesture_Tapped;
signInButton.GestureRecognizers.Add(signInGesture);
NavigationPage.SetHasNavigationBar(this, false);
}
async void SignInGesture_Tapped(object sender, EventArgs e)
{
await signInButton.ScaleTo(0.95, 50, Easing.CubicOut);
signInButton.ScaleTo(1, 50, Easing.CubicIn);
if (string.IsNullOrEmpty(emailEntry.Text) || string.IsNullOrEmpty(passwordEntry.Text) )
await DisplayAlert("Error", "Username and Password should not be empty.", "OK");
else if(!Utils.IsValidEmail(emailEntry.Text))
await DisplayAlert("Error", "Email should be in valid format.", "OK");
else
{
loadingIndicator.IsRunning = true;
var login = new Login{
grant_type = "password",
username = emailEntry.Text,
password = passwordEntry.Text
};
service = new RestService();
var response = await service.Login(login);
if (response != null)
{
if (response.status_code == System.Net.HttpStatusCode.OK)
{
App.Current.Properties["IsLoggedIn"] = true;
App.Current.ShowMainPage();
}
else
{
loadingIndicator.IsRunning = false;
await DisplayAlert(response.error, response.error_description, "OK");
}
}
else
{
loadingIndicator.IsRunning = false;
await DisplayAlert("Failed", Config.CommonErrorMsg, "OK");
}
}
}
async void ResetButton_Clicked(object sender, EventArgs e)
{
loadingIndicator.IsRunning = false;
await Navigation.PushAsync(new ForgetPasswordPage());
}
}
MasterPage:CS 文件中的空构造函数,我只是附加 XAML。
<?xml version="1.0" encoding="UTF-8"?>
<MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="MyTenantWorld.MasterPage" xmlns:local="clr-namespace:MyTenantWorld;assembly=MyTenantWorld">
<MasterDetailPage.Master>
<local:MenuPage x:Name="menuPage" />
</MasterDetailPage.Master>
<MasterDetailPage.Detail>
<NavigationPage>
<x:Arguments>
<local:HomePage />
</x:Arguments>
</NavigationPage>
</MasterDetailPage.Detail>
</MasterDetailPage>
不可见的菜单图标在 MasterDetailPage 的详细信息页面上带有 NavigationPage.SetHasNavigationBar(this, false);
。