【发布时间】:2014-07-31 11:26:39
【问题描述】:
源代码 - https://github.com/benhysell/V.FlyoutTest/
问题 - 在混合片段和基本视图并使用设备上的设置时 - 如果 OnDestory() 被调用并且活动被调用,则“开发人员选项/不保留活动”视图模型为空带回了视野。这会导致空引用异常和应用程序崩溃。
说明 我在 Android 中有一个使用 MvvmCross 的滑出/汉堡菜单。在应用程序启动时,会发生以下步骤:
- HomeViewModel 设置为加载
- HomeViewModel 加载 HomeView 设置滑出/汉堡菜单
- 由于 HomeView 从未真正显示,只管理它调用的片段并显示 EnterTimeViewModel、默认视图和我们真正关心的视图。
- 在加载 HomeView 结束时,会使用 messenger 插件生成一条消息以“登录”到系统
在 EnterTimeViewModel 中接收到消息,通常在这里我们会进行某种检查以查看我们是否已登录,但在这种情况下,我们只需使用 LoginViewModel 调用 ShowViewModel 来模拟登录请求并提示用户。
LoginViewModel 不是一个片段,只是一个普通的基础视图。显示给用户
- 发生这种情况时,HomeView 将从系统中删除,因为我们设置了“开发者选项/不保留活动”
- 用户通过点击登录来登录系统,在演示中这是一个无操作,它只是关闭了 LoginView
- HomeView 然后恢复,除了在恢复期间 EnterTimeViewModel 为 null...当 EnterTime 视图尝试访问 EnterTimeViewModel 时,会命中一个 null 引用。
在加载和卸载 HomeView 时,关于 MvvmCross 转换的事件顺序如下:
- 创建时
- StartActivityForResult
- 开机
- OnResume
- 暂停
- OnSaveInstanceState
- OnStop
- OnDestroy
登录后显示登录屏幕
- 创建时
- 开机
- 崩溃、空引用异常
感觉好像跳过了几个步骤,导致崩溃。想法?想去的地方?
作为参考,我基于滑动菜单的项目https://github.com/jamesmontemagno/Xam.NavDrawer 也存在同样的问题。
更新 实施了一个修复http://benjaminhysell.com/archive/2014/06/mvvmcross-flyoutnavigation-hamburger-menu-sliding-menu-for-android-null-reference-exception-on-fragment-shown-fix/,tldr - 负责尝试保存 ViewModel,如果从内存中卸载片段,则在最坏的情况下重新创建它们。
【问题讨论】:
标签: android-fragments xamarin.android mvvmcross