首页 > 解决方案 > 将 MvvmCross 从 6.3.1 升级到 7.1.2 时,使用 MvxPopRecursivePresentationHint(levelsDeep: 2) 不再呈现 View

问题描述

我们已将 Xamarin Forms iOS/Android 项目 + 核心从 MvvmCross 6.3.1 升级到 7.1.2,但我们遇到了问题。

我们有 4 个 ViewModel -

A B C D

我已经从 A 导航到 B,然后从 B 导航到 C,然后从 C 导航到 D -

A -> B -> C -> D

B、C 和 D 视图具有标准属性 -

    [MvxContentPagePresentation(WrapInNavigationPage = true)]

在 D 视图中,我点击“完成”按钮并返回 B 我们使用 -

  var presentationHint = new MvxPopRecursivePresentationHint(levelsDeep: 2);
  await NavigationService.ChangePresentation(presentationHint);

这曾经在 6.3.1 中工作,但在 7.1.2 中,当它导航回 B 时,屏幕为空白,XAML 未呈现。它确实导航回 B,我们在 B 的 ViewAppeared 中放置了一个断点。

奇怪的是,当它导航回 B 时,我们可以在空白屏幕上点击一个按钮导航到 C,然后它导航到 C。然后如果我们点击返回(顶部的 Android 后退按钮,而不是底部/设备),它确实导航回 B 并且视图也正确显示,XAML 被渲染。

此外,这并不总是发生 - 有时在导航回 B 时它会正确呈现 B 视图。我们已经在 Android 上重现了这个问题,无论是在金属上发布还是在 Android 模拟器上调试。在 iOS 上它始终有效。

同样的问题发生在 -

  await NavigationService.ChangePresentation(new MvxPopPresentationHint(typeof(B)));

这确实有效并导航回 A 并呈现 A 视图 -

  var presentationHint = new MvxPopToRootPresentationHint();
  await NavigationService.ChangePresentation(presentationHint);

但有时我们需要导航回 B 或 C,而不是一直回到根 A。

https://www.mvvmcross.com/mvvmcross-7.1.0-release/中,我确实看到“这是次要版本,主要包含错误修复和围绕 Android 和 iOS 演示者代码的代码清理。” - 但如果我们遇到上述问题,我还没有找到任何关于升级到 7.1.2 后我们需要做什么的具体步骤。

很难提供一个示例项目,所以在花时间这样做之前,我想知道是否有人知道问题可能是什么。

从 6.3.1 到 7.1.2 是否发生了一些变化,这需要我们改变如何使用 MvxPopRecursivePresentationHint(levelsDeep: 2) 从 D 导航回 B 以便渲染 B 视图?

这也可能与 MvvmCross 没有任何关系,但我们的 Android 项目存在一些问题,因为我们升级到 AndroidX 仍在 Xamarin Forms 4.8 上 - 有人有任何提示或解决方法建议吗?

标签: xamarinxamarin.formsmvvmcross

解决方案


经过大量的谷歌搜索和堆栈溢出,并尝试了许多不同的东西,我们偶然发现了这个:

https://forums.xamarin.com/discussion/51782/navigation-popasync-true-shows-blank-page

然后我们找到了一种解决方法,在 B、C 和 D 视图上,我们从 -

    [MvxContentPagePresentation(WrapInNavigationPage = true)]
    public partial class BPage : MvxContentPage<BViewModel>

至 -

    [MvxContentPagePresentation(WrapInNavigationPage = true, Animated = false))]
    public partial class BPage : MvxContentPage<BViewModel>

添加“Animated = false” - 这解决了问题!现在在 D 中执行此操作时 -

  var presentationHint = new MvxPopRecursivePresentationHint(levelsDeep: 2);
  await NavigationService.ChangePresentation(presentationHint);

B 视图不再为空白,屏幕已正确渲染。


推荐阅读