MvvmCross ViewModels 未在 FragmentManager.PopBackstackImmediate() 上销毁
MvvmCross ViewModels not destroyed on FragmentManager.PopBackstackImmediate()
我构建了一个 Xamarin Android 应用程序,它向用户显示一系列数据输入表单,就像向导一样。该向导有一个带有上一个和下一个按钮的底部导航栏,以及一个菜单按钮,按下该按钮会显示向导中所有表单的列表,并允许用户跳转到任何给定的表单。
所需的功能是保留线性导航,以便当用户跳到向导的中间时,他们仍然可以使用上一个和下一个按钮按顺序翻阅各种表单。他们还应该能够使用硬件后退按钮来查看向导中的上一个表单。
我怀疑我的实现对 MvvmCross 不友好,因为我发现它有一些错误,特别是当我清除片段后台堆栈时我的视图模型没有被破坏(向导托管在 Activity 中,每个表单都是一个片段)。
我应该如何实施?
您是否尝试过使用 PopBackStackImmediate
的 this 重载?这将弹出所有片段,直到您在字符串中指定的片段(如果传递了包含标志,则该片段也会被弹出),因此您无需遍历整个片段后栈。
Activity.SupportFragmentManager.PopBackStackImmediate("myViewTag", (int)PopBackStackFlags.Inclusive);
其中 "myViewTag"
是您视图的 UniqueImmutableCacheTag
我的实施一定有一些非常规的地方,但在截止日期和社区的帮助很少的情况下,您如何解决您的黑客问题,但要进一步破解它?
我的解决方案有两个:
1) 我没有使用 FragmentManager.PopBackstackImmediate(),而是实现了一个 while 循环,条件是:activity.SupportFragmentManager.BackStackEntryCount > 0,在主体中调用 Close(fragment.ViewModel)。这应该修复了这个错误,但它没有。
2) 我请求关闭的 ViewModels 仍然没有被处理,所以我不得不解析当前的 IMvxMultipleViewModelCache 并使用预期的参数对其调用 GetAndClear。这迫使我的 ViewModels 被处置,以便在下次查看其 Fragment 时重新创建它们。
这感觉像是黑客攻击。关闭 ViewModel 应该处理它,无论它与 Fragment 还是 Activity 相关联,但由于某些原因它不是。这是这个错误的关键,但就像我说的,最后期限,黑客攻击。
我构建了一个 Xamarin Android 应用程序,它向用户显示一系列数据输入表单,就像向导一样。该向导有一个带有上一个和下一个按钮的底部导航栏,以及一个菜单按钮,按下该按钮会显示向导中所有表单的列表,并允许用户跳转到任何给定的表单。 所需的功能是保留线性导航,以便当用户跳到向导的中间时,他们仍然可以使用上一个和下一个按钮按顺序翻阅各种表单。他们还应该能够使用硬件后退按钮来查看向导中的上一个表单。 我怀疑我的实现对 MvvmCross 不友好,因为我发现它有一些错误,特别是当我清除片段后台堆栈时我的视图模型没有被破坏(向导托管在 Activity 中,每个表单都是一个片段)。
我应该如何实施?
您是否尝试过使用 PopBackStackImmediate
的 this 重载?这将弹出所有片段,直到您在字符串中指定的片段(如果传递了包含标志,则该片段也会被弹出),因此您无需遍历整个片段后栈。
Activity.SupportFragmentManager.PopBackStackImmediate("myViewTag", (int)PopBackStackFlags.Inclusive);
其中 "myViewTag"
是您视图的 UniqueImmutableCacheTag
我的实施一定有一些非常规的地方,但在截止日期和社区的帮助很少的情况下,您如何解决您的黑客问题,但要进一步破解它?
我的解决方案有两个: 1) 我没有使用 FragmentManager.PopBackstackImmediate(),而是实现了一个 while 循环,条件是:activity.SupportFragmentManager.BackStackEntryCount > 0,在主体中调用 Close(fragment.ViewModel)。这应该修复了这个错误,但它没有。 2) 我请求关闭的 ViewModels 仍然没有被处理,所以我不得不解析当前的 IMvxMultipleViewModelCache 并使用预期的参数对其调用 GetAndClear。这迫使我的 ViewModels 被处置,以便在下次查看其 Fragment 时重新创建它们。
这感觉像是黑客攻击。关闭 ViewModel 应该处理它,无论它与 Fragment 还是 Activity 相关联,但由于某些原因它不是。这是这个错误的关键,但就像我说的,最后期限,黑客攻击。