问题标签 [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.

0 投票
1 回答
470 浏览

dependency-injection - 如何将 N ViewModelAssistedFactory 绑定到 Activity

这是我实现Lifecycle SavedState逻辑的 DI 设置:

基本活动模块:

飞溅活动模块:

视图模型:

现在假设我想在ViewModelmy中添加另一个Activity,这将失败:

另一个视图模型:

飞溅活动模块:

错误:[Dagger/MissingBinding] ....如果没有 @Inject 构造函数或 @Provides-annotated 方法,则无法提供另一个视图模型。公共抽象接口 ApplicationComponent 扩展 dagger.android.AndroidInjector<...Application> {

我怎样才能使这项工作?

0 投票
1 回答
428 浏览

android - 2 路数据绑定与 ViewModel-SavedState

我有一个订阅表格:姓名、地址、本地等等……我希望能够使用Data Binding、处理和保存数据LiveDataSavedStateHandle

让我们假设: 1 wayData BindingLiveDataSavedStateHandle

这行得通,但我认为我们可以做得更好:

  • @Parcelize class Form封装所有字段
  • 2-way Data Binding减少.xml代码

现在问题开始出现。
如何通知我内部的变化Form class以便能够坚持objectwith SavedState?尝试改进上面的代码或者2-way Data Binding我们正在失去控制实际上有优势吗?我还使用一些逻辑来启用提交按钮,如下所示:

同样,随着2-way Data Binding我失去控制,updateUi()EditText字段发生变化时我怎么能打电话?
谢谢你的时间。

0 投票
1 回答
1661 浏览

kotlin - SavedState module Android Kotlin with View Model - value does not seem to save

I have followed the instructions in Google Codelab about the Saved state module.

My gradle dependency is:

#xA;

My View Model factory is:

#xA;

My View model:

#xA;

My Fragment:

#xA;

When the app is being used, the live data for the saved state field updates correctly. But as soon as I put the app in background (and I set "don't keep activities" in developer options), and then re open app, the live data shows a value as if it was never set. In other words, the saved state handle seems to forget the field I am trying to save.

Any thoughts?

0 投票
1 回答
1547 浏览

android - 如何从 AbstractSavedStateViewModelFactory 动态设置包

我的ViewModelFactory

活动

视图模型

我想知道如何动态提供 defaultArgs 而不是:

活动模块

这个想法是有可能向 ViewModel 发送一个参数,比方说一个 DetailActivity 的 ID。通常我使用“init”方法,但如果我可以使用StateHandle map会更好。像这样这样的东西。

说得通?是否可以?

0 投票
0 回答
416 浏览

kotlin - 使用数据绑定库保留带有屏幕旋转的 EditText

我有两节课AdminPinActivity.ktAdminPinActivityPresenter.kt

AdminPinActivity.kt:

AdminPinActivityPresenter.kt:

Log.i("Input pin from savedInstanceState",savedInstanceState.getString("InputPin"))并且Log.i("input_Pin",input_Pin)每次轮换都会登录。这意味着代码工作正常,但 EditText 值没有得到更新binding.inputPin.input.setText(savedInstanceState.getString("InputPin")),即binding.inputConfirmPin.input.setText(savedInstanceState.getString("InputConfirmPin"))不能正常工作。

当我binding.inputPin.input.setText("Something")在 if 语句之外使用时,即在 handleOnCreateMethod 内部使用时,它会使用“Something”更新一次 EditText 值。但是在屏幕旋转上也丢失了。

我希望你明白这个问题。

我已经到处搜索了将近两天,但找不到解决方案。我不想使用双向数据绑定。

admin_pin_activity.xml

profile_input_view.xml:

0 投票
1 回答
8186 浏览

kotlin - io.mockk.MockKException:找不到答案:SavedStateHandle(#1).set(Key, Something)

我有一个 ViewModel 类如下(简化以演示我面临的问题)

我有一个 MockK 测试类如下

通过运行测试,我得到以下错误

我想我也需要处理setfor SavedStateHandle。我怎么能这样做MockK

0 投票
0 回答
405 浏览

android - 具有 SavedStateHandle 的 ViewModel - 反序列化具有自定义数据类的 LiveData 时出现异常

我有一个简单ViewModelSavedStateHandle. thisViewModel有一个LiveDatathat hold MyViewState<List<MyDataClass>>,如下:

LiveDatain 的检索ViewModel方式如下:

这很好用。但是,一旦应用程序被杀死并且我切换回它,应用程序就会崩溃并出现以下异常:

...我无法弄清楚为什么会发生这种崩溃以及如何解决它。

有任何想法吗?

0 投票
1 回答
233 浏览

java - 如何转换 ViewModel 以利用状态保存?

我有一个ViewModel我目前用来在片段之间包含数据和共享值的。此模型还有助于在活动开始时为应用程序实例化数据。

我现在正在尝试向我的应用程序添加状态保存功能,但我对如何将两个系统合并在一起感到困惑。android 文档提到使用这个构造函数:

但是,我不确定如何传递状态以及如何在活动中使用此构造函数(这是我的用法):

无论如何,由于我还需要实例化数据以防 savedState 为空,所以我不确定该部分如何适应。作为参考,这里是我的 ViewModel 类的概要:

显然,如果我取出旧的构造函数和MutableLiveData成员,那么当我访问片段中的 ViewModel 时,数据将为空(因为我还没有告诉活动显式保存状态),并且我还没有实例化任何数据。

0 投票
1 回答
1298 浏览

android - 如何懒惰地保存 ViewModel 的 SavedStateHandle?

我有一个加载一堆请求的屏幕,并在同一屏幕和一个外部 WebView 上从用户那里收集一些数据。因此,我有一个包含这些复杂请求对象(+ 用户输入数据)的 ViewModel。我需要通过系统启动的进程死亡来保存这些数据,这SavedStateHandle是专为。但我不想将这些数据保存在数据库中,因为它只与当前的用户体验相关。

我已将我的 ViewModel 与 Hilt 集成并收到了SaveStateHandle. 因为我有一些复杂的对象可以在代码中的多个位置访问/修改,所以我无法“随时随地”保存它们。我让它们实现Parcelable,只是想立即保存它们。不幸的是,ViewModel 没有像onSaveInstanceState().

现在,我尝试使用onCleared()听起来不错的地方来写入句柄。但事实证明,.set()我在那里执行的所有操作都会丢失(我正在使用开发人员选项“不要保留活动”进行测试。当我.set()在其他地方使用时,它确实有效)。因为 ViewModel 不绑定到单个片段/活动的生命周期,而是绑定到 NavGraph 我不能从他们的onSaveInstanceState().

我如何/在哪里可以正确地坚持我的状态SaveStateHandle

0 投票
2 回答
2199 浏览

android - IllegalArgumentException:已注册具有给定密钥的 SavedStateProvider

我的应用程序在某些用户的设备上崩溃,但以下情况除外。

在我的设备上一切正常。我在自己的测试设备和模拟器上都没有遇到这个异常。另外,我在我的应用程序中使用 Hilt。

这是我的ViewModel课。

这是activity我使用它的地方ViewModel

我没有MainActivityViewModel在其他任何地方使用它,除了MainActivity. 所以没有共享ViewModel。此外,旋转关闭 on MainActivity。所以没有旋转变化。

我从下面的错误中了解到,我的活动以某种方式试图创建另一个 ViewModel 而不是保留前一个?如果我错了,请纠正我。我无法理解SavedStateRegistry.registerSavedStateProvider()再次触发什么样的场景。

注意 -我在 ViewModel 类和活动中省略了方法以增加可读性。