在我的Android应用中,我使用可拆分界面将自定义数据(UByteArray)从一项活动传递到了另一项活动。
我在多个片段中使用此数据,因此我重写了数据类以扩展androidx ViewModel并将LiveData属性公开给片段。现在用户界面的更新要好得多,但是我认为我用错了,因为我覆盖了其中的所有ViewModel值onCreate
。
现在我的问题是:只初始化一次ViewModel我需要更改什么?以下是我当前的代码(此问题已缩写并重命名):
class ActivityB : AppCompatActivity() {
private val bData: ViewModelB by viewModels()
// ...
override fun onCreate(savedInstanceState: Bundle?) {
// ...
intent.getParcelableExtra<ViewModelB>("id")?.let {
Log.e(TAG, "Found parceled bData $it")
// This seems like a very stupid way to do it, is there a better one?
bData.copyAll(it)
}
}
}
我看到可以将SavedState注入到ViewModelB构造函数中,但是直到现在我还没有保存状态,并且数据只需要传递一次。
我应该将tagData的初始化更改by viewModels()
为= ViewModelB(intent)
吗?
还是我需要以某种方式扩展ViewModelFactory?
非常感谢您在此提出的任何提示。
由于您具有ViewModel
实现的工具Parcelable
,因此您可以ViewModelB
直接从中获得实例Intent
。
将Intent
其用于启动ActivityB
可能不是!= null
在的时候ActivityB
被实例化,但可以使用
lateinit var bData: ViewModelB
然后在 onCreate()
bData = if(intent.hasExtra("id")) intent.getParcelableExtra<ViewModelB>("id") else ViewModelProvider(this).get(ViewModelB::class.java)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句