如何从可打包数据初始化androidx ViewModel?

marcw:

在我的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?

非常感谢您在此提出的任何提示。

Bö变成蓝色:

由于您具有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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章