在Xamarin Forms Shell中,AppShell.xaml的内容如下:
<Shell ...>
<ShellContent Route="login" ContentTemplate="{DataTemplate local:LoginPage}" />
<TabBar Route="home">
<ShellContent Route="Tab1" ContentTemplate="{DataTemplate home:Tab1Page}" Title="tab1" />
<ShellContent Route="Tab2" ContentTemplate="{DataTemplate home:Tab2Page}" Title="Tab2" />
</TabBar>
</Shell>首先显示登录页。
user1登录后,将显示带有user1内容的选项卡。登录页面没有被销毁(为什么?)。
注销后,再次显示登录页。该页面没有重新创建,因为它在开始时没有被销毁。此外,标签没有被销毁(为什么?)
然后user2登录:标签将再次显示,但不会重新创建。它们仍然显示user1 1的内容。
登录后,我将使用以下代码强制从导航堆栈中删除登录页:
foreach (var page in Shell.Current.Navigation.NavigationStack.Reverse().Where(p => p != null))
Shell.Current.Navigation.RemovePage(page);
await Shell.Current.GoToAsync($"//home/Tab1");我在注销后使用Shell.Current.GoToAsync("//login");。
这个问题似乎是由AppShell.xaml中的静态声明引起的,该声明缓存所有创建的页面。
实现这种常见场景的正确方法是什么?(我不使用任何飞碟)
发布于 2022-03-10 06:16:43
关于这一点,我认为您可以参考文章使用Xamarin窗体Shell创建登录流。
壳牌的结构如下:
<Shell>
<!-- Loading/Start Page -->
<ShellItem Route="loading">
<ShellContent ContentTemplate="{DataTemplate local:LoadingPage}" />
</ShellItem>
<!-- Login and Registration Page -->
<ShellContent Route="login"
ContentTemplate="{DataTemplate local:LoginPage}">
</ShellContent>
<!-- Main Page -->
<FlyoutItem Route="main"
FlyoutDisplayOptions="AsMultipleItems" IsTabStop="False">
<ShellContent Route="home"
IsTabStop="False"
ContentTemplate="{DataTemplate local:MainPage}"
Title="Home" />
</FlyoutItem>
<MenuItem Text="Logout"
Command="{Binding ExecuteLogout}" />
</Shell>对于登录页面,我们将其设置如下:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
...
Shell.PresentationMode="ModalAnimated"
...>
...
</ContentPage>而且,每当您以模式导航时,在目标页面后面的代码中重写后退按钮导航总是一个好主意,如下所示:
protected override bool OnBackButtonPressed()
{
return true;
}在上面的文章中包含了一个示例,您可以查看它这里。
https://stackoverflow.com/questions/71406814
复制相似问题