问题标签 [viewmodel-savedstate]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android-savedstate - Viewmodel SavedStateHandle 数据在进程死亡后丢失
我正在尝试在我的 ViewModel 中使用 savedStateHandle 并对其进行测试。我的简单案例是我只是在 SavedStateHandle 中存储一个 Int 值,并在进程死亡后尝试再次获取它。但它根本不起作用。我正在使用以下依赖项
下面是我的片段,它有一个按钮和一个 TextView。当我单击按钮时,数字 5 存储在 ViewModel 的 savedStateHandle 中,然后通过 savedStateHandle 的 getLiveData 方法观察到相同的情况,并且数字显示在 TextView 中。因此,在进程死亡后,它应该正确恢复 5 的值并在文本视图中显示它。以下是我的片段代码
以下是我的 ViewModel 代码
运行此应用程序并单击按钮时,数字 5 存储在 savedStateHandle 中,并在文本视图中正确显示“5”。但是,当我将应用程序置于后台并使用 adb 终止该进程,然后从最近的屏幕重新启动该进程时,整个应用程序将重新启动,并且它不会在 textView 中显示记住的数字。相反,它显示了我在布局 xml 中设置的“Hello”。我正在杀死进程如下
任何人都可以帮助我,为什么它根本不适合我?我在这里做错了什么?
android - 如何在动态功能模块中将 SavedStateHandle 注入 ViewModel?
使用@Assisted
带有 savedStateHandleby viewModels()
的注释,并且可以将 SavedStateHandle 对象注入到 ViewModel 中的模块中,这些模块不是带有匕首柄的动态功能模块
但是动态功能模块不可能这样做。动态功能模块 ViewModels 是如何完成的?
android - 试图将 SavedStateHandle.getLiveData() 公开为 MutableStateFlow,但 UI 线程冻结
我正在尝试使用以下代码:
我正在尝试像这样使用它:
UI 线程冻结。我有一种感觉,因为collect()
我试图创建一个由封闭协程上下文管理的内部订阅,但我还需要将此 StateFlow 作为一个字段。还有值的交叉写入(如果其中一个发生更改,如果它是新值,则更新另一个)。
总的来说,这个问题似乎collect()
是暂停的,因为我在getStateFlow()
.
有谁知道创建流的“内部订阅”的好方法,而不会最终冻结周围的线程?需要,runBlocking {
以便我可以将值同步分配给 ViewModel 构造函数中的字段。(这甚至可能在“结构化并发”的范围内吗?)
android - 为什么 SavedStateHandle 不保存或返回我的实时数据?
如果我移动到另一个片段然后我导航回具有视图模型的片段然后视图模型 livedata 为空但我不知道为什么。如果我知道正确,我不需要手动调用savedStateHandle.set
来保存数据,因为savedStateHandle
无论如何都会这样做。我将Place
对象存储在 livedata 中,并且此类扩展了 Parcelable。
视图模型:
类 OverviewViewModel(private val savedStateHandle: SavedStateHandle) : ViewModel() {
地方:
我订阅 livedata 的更改,然后调用 getAll:
java - 获取上下文 SavedStateHandle Java Android
我想从 ViewModel 类中的 SharedPreferences 中得到一些东西。构造函数只有一个 SavedStateHandle 参数,我不知道如何获取上下文。这是我的代码:
视图类中的 viewModel 定义:
android - 无论我尝试什么,都无法让 ViewModel 上的 SavedState 正常工作
没关系。显然我对 SavedState 应该做什么有错误的想法。把这个职位留在这里,这样我的愚蠢就会被保存很久。
一直在尝试使用 SavedStateModel 的 ViewModel 工作了很长时间。请告诉我我遗漏了一些完全明显的东西,我已经进行了一项非常基本的活动,但仍然无法解决。它会继续返回主屏幕并返回(尽管我猜这通常是 ViewModel 的事情),但在应用程序被杀死时不会。
这是压缩的 Android Studio 项目,很抱歉我一开始就没有提供它的愚蠢:https ://www.slasheethecow.com/code/MooSavedState.zip
编辑:而不必复制/粘贴所有这些我压缩了 Android Studio 项目。删除了一堆其他(更复杂的)活动等,但我很确定它仍然可以工作。
这是活动CowSaved.kt:
这是 ViewModel,CowSavedModel.kt:
这些可能无关紧要,但这是布局,activity_cow_saved.xml
这是相关的字符串,cow_strings.xml
这是它在清单中声明的方式,AndroidManifest.xml (duh):
这是build.gradle(我可能在依赖项上试图找到一个有效的依赖项):
我无计可施。有或没有蹄子的人都知道我做错了什么吗?
android - Ы屏幕旋转时的activity状态
当我旋转屏幕时,活动被重新加载。如果我需要保存 1-2 条记录,我可以使用 savedinstancestate。但就我而言,在活动中我加载了 6 个片段,向 Firebase 数据库发出了很多请求。等等。现在我正在寻找一种方法来保存这些数据。这样当我转动屏幕时,没有对网络的请求,并且应用程序本身在转动后会快速加载。我也听说有些数据可以放在sqlite中。但在我看来,这就像使用 put for savedinstancestate
asp.net-core - ASP.Netcore 如何在 HomeIndexView 等另一个控制器中调用模型/视图模型
我有一个名为“GetInTouch”(联系我们表格)的模型及其控制器,并查看所有工作正常。
我的问题是,当应用程序加载时,它有一个“主页/登陆页面”,我需要在有一个“HomeController”的登陆页面上显示这个“GetInTouch”视图,而不是将它作为一个单独的页面。因此,在从着陆页“提交”时,它应该转到“GetInTouchController”并处理数据(保存和发送电子邮件),但它返回 null。
这是 GetInTouch 模型
这是 GetInTouchController
和 GetInTouch 视图
上面的代码工作正常,现在我想做的是在另一个视图中将这个“表单/视图”显示为一个部分(就在页脚之前),比如主页索引视图,但是当用户点击“发送”时,它当然应该去给GetInTouchController 创建动作和流程。
因此,我将视图从 GetInTouch 创建视图复制到页脚之前的主页索引视图,但主页/视图有一个视图模型名称“indexViewModel”,它列出了来自另一个模型的数据,但我知道你只能将一个模型传递给一个视图(所以没有办法说@model project.Model.GetInTouch,而是我在主页中有@model IndexViewModel)所以我想要的只是一旦用户完成表单并从主页视图中点击“发送”它就会转到'GetInTouchController' 创建操作并保存输入到 GetInTouch 模型中的所有详细信息并发送电子邮件(我有电子邮件功能)只需要保存数据,因为它全部返回为空。这是 IndexViewModel
我不知道如何继续,我尝试将确切的 create 方法复制到 HomeController 并将表单指向 HomeController Create 操作,但这也不起作用 - 知道如何在另一个视图中处理表单吗?很抱歉它很长,但需要解释我想要实现的目标,希望它很清楚,并感谢您的时间。
android - 带有 SavedState 的 Android ViewModel 重写新实例的参数
我有一个应用程序,它具有 Master/Detail 类型的架构。当我选择某个项目时,详细信息会显示在详细信息片段中。
为了让详细片段知道要加载什么,id
通过Arguments
. 在 VM 中使用SavedStateHandle
,我可以直接从句柄中读取这些参数,而无需重新路由它Fragment
本身。这对于第一个细节片段非常有用。问题来自下一个选择。
每次我加载详细信息时,id
都会填充第一个选择,尽管每次创建一个新片段时都会与新的 ViewModel一起创建。
我正在研究生命周期视图模型保存状态库(v.2.3.1)的代码,并在调用中找到了这个方法SavedStateHandle
:
在这里,我可以看到为每个新视图模型设置defaultState
了正确的 id 。但正如您所见defaultState
,先restoredState
处理后处理。restoredState
包含与 old 相同id
的密钥,最后替换defaultState
.
我可以理解这可能是真正恢复所需的行为,但在我的情况下,我没有恢复片段。是的,类是相同的,但我只是用另一个具有新/不同数据的细节片段替换细节片段。
难道我做错了什么?我可以给框架一个提示,这不是恢复并且我对旧片段中保存的值不感兴趣吗?
android - 在应用进程被杀死之前,如何在 ViewModel 的 onCleared 方法中为 SavedStateHandle 提供的 LiveData 设置特定值
在我的个人项目中,我使用 Hilt(依赖注入)、SavedStateHandle 和 ViewModel。
SavedStateHandle 允许我在进程死亡时保存数据。
因为 ViewModel 在进程死亡后无法生存,所以我使用 Hilt 注入在 ViewModel 中注入了 savedStateHandle 对象。
当使用 coroutines/viewModelScope 处理 http 请求时,我使用自定义类“ViewState”来处理从 UI 观察到的一个 LiveData 中的多个状态。
例如:LiveData<ViewState<User>>
然后在 UI 中,我绑定了 viewState:viewMvc.bind(userViewState)
在 ViewState.Loading 类中,作业是瞬态的,因为它不可序列化。而且在 viewModel 中使用 SavedStateHandle 之前,我不需要序列化 LiveData 值,因为它在创建 ViewModel 时被初始化为 null。
问题是
当应用程序进程在用户的 viewState 为 ViewState.Loading 时被杀死时,viewModelScope 不再处于活动状态,并且与其关联的作业在 ViewModel 的 onCleared() 中被取消。
天真地,我认为当“onCleared”事件发生时,我必须将 LiveData 的值更改为 null 或任何我想避免 ViewState.Loading 值跨进程死亡但显然 SavedStateHandle 此时已经保存;因为否则当应用程序状态恢复时,用户视图状态是 ViewState.Loading() 并且我正在等待由于作业已经取消而永远不会发生的事情。序列化 SavedStateHandle 时,我永远不应该保存 ViewState.Loading 对象。所以在实践中“工作”变量不应该是瞬态的,因为它永远不会被序列化。
如何截取 SavedStateHandle 被序列化/打包的确切时间以避免此类问题?