Я думаю, вы должны рассматривать страницы входа и регистрации отдельно от оболочки. Другими словами, когда приложение запускается, проверьте, нужно ли пользователю войти / зарегистрироваться. Если это так, введите sh страницу входа и / или регистрации в качестве модальной страницы, охватывающей интерфейс Shell. Закончив вход в систему / регистрацию, откройте модальную страницу, и вы окажетесь в своей Оболочке с вкладками.
В качестве альтернативы, вы можете назначить Application.MainPage
своей странице входа или регистрации при запуске приложения, а затем, когда завершите, переназначить Application.MainPage
на AppShell
, например:
MainPage = new LoginPage();
// Authenticated!! - now open the shell
MainPage = new AppShell();
ОБНОВЛЕНИЕ: хотя я не могу думать о том, чтобы убедиться, что страница входа / регистрации находится «в оболочке», тем более что было заявлено, что они не хотят вкладок при отображении страниц регистрации / регистрации, проблема с кодом во вступительном вопросе заключается в том, что они вызывают Shell.Current во время конструктора AppShell. Вероятно, вы можете избежать этой ошибки, добавив await Task.Delay(500)
, чтобы позволить AppShell завершить построение sh (и вам, вероятно, следует сначала вызвать InitializeComponent
), например:
public AppShell()
{
InitializeComponent();
MainThread.BeginInvokeOnMainThread(async () =>
{
await Task.Delay(500);
await Shell.Current.GoToAsync("//register");
});
}
Однако это действительно против лучших практики, которые не рекомендуют запускать асин c методы из конструкторов. Вот сообщение в блоге об альтернативе: https://blog.stephencleary.com/2013/01/async-oop-2-constructors.html
например, сделайте что-то вроде:
public sealed class MyClass
{
private MyData asyncData;
private MyClass() { ... }
private async Task<MyClass> InitializeAsync()
{
asyncData = await GetDataAsync();
return this;
}
public static Task<MyClass> CreateAsync()
{
var ret = new MyClass();
return ret.InitializeAsync();
}
}
public static async Task UseMyClassAsync()
{
MyClass instance = await MyClass.CreateAsync();
...
}