I'm trying to navigate from a splash screen (ContentPage) to the main app screen (MasterDetailPage).
In my ViewModel, I send a message to the native Android activity passing in the new MasterDetailPage.
On the message handler, I just SetPage(message.NewPage) and everything works fine.
BUT...
If I send the message in an async method after a Task.Delay(2500), the message reaches the Activity code and the SetPage is executed, but the Android emulator only shows a blank screen =( No exceptions are thrown (at least the debugger didn't catch any).
Which is the best way to override the current Page (I don't need navigation here), after an async call?
Resume:
Works: Method GoTo(new ContentPage()) => Sends a Message with ContentPage => The AndroidActivity listens to this message => SetPage(ContentPage) => Success \O/
Does not works: Method async Task.Delay(2500); GoTo(new ContentPage()) => everything is exactly the same after that => SetPage(ContentPage) => Blank screen =(
BTW... In Windows Phone, both sync/async methods works fine. Didn't had the time to test on iOS.
In Windows Phone, the code is:
protected virtual void OnTopNavigationMessage(TopNavigationMessage message)
{
Device.BeginInvokeOnMainThread(() =>
{
var newContent = (FrameworkElement) message.View.XFormsPage.ConvertPageToUIElement(this);
if (newContent.Parent != null)
{
((Panel) newContent.Parent).Children.Remove(newContent);
}
Content = newContent;
});
}
In Android:
protected virtual void OnTopNavigationMessage(TopNavigationMessage message)
{
Device.BeginInvokeOnMainThread(() => SetPage(message.View.XFormsPage));
}
And in iOS:
protected virtual void OnTopNavigationMessage(TopNavigationMessage message)
{
Device.BeginInvokeOnMainThread(() =>
{
window.RootViewController = message.View.XFormsPage.CreateViewController();
});
}
This works:
protected override void OnInitialize()
{
GoTo<HomeView>();
}
public void GoTo<TView>()
where TView : BaseView
{
var view = BaseApp.BaseInstance.DependencyContainer.Resolve<TView>();
MessengerInstance.Send(new TopNavigationMessage(view));
}
But this doesn't:
protected override async void OnInitialize()
{
await Task.Delay(2500);
GoTo<HomeView>();
}
public void GoTo<TView>() (SAME CODE ABOVE)