为什么 viewModel() 在 composabe 中使用,而 viewModels() 在 activity 或片段中使用?
Why is viewModel() used in a composabe and viewModels() in an activity or fragment?
In this link 它被指示在任何可组合项和 activity 中使用 viewModel()
,我们将在调用 viewModel()
时获得相同的对象。虽然指示在可组合项内使用 viewModel()
,但我也能够在 setContent{}
(在任何可组合项之外)中使用它。
In this link 指示在 activity 或片段中使用 viewModels()
来获取扩展 ViewModel
的 class 的对象。
在这两种情况下,我们都得到一个扩展 ViewModel
的 class 的对象。那么,为什么我们需要使用两种不同的方法(viewModel()
和 viewModels()
)?
如果您问是否可以在 Compose 中只使用 viewModel
而不使用 viewModels
,答案是肯定的。但在某些情况下两者同时使用更方便。
viewModels
属于androidx.activity
包,是ComponentActivity
的扩展,与Compose无关。它曾用于基于视图的 Android,当您需要使用一些 activity 特定的回调来初始化或更新您的视图模型时,它仍然可以与 Compose 一起使用。
反过来,viewModel
是 Compose 的一部分,可让您轻松地 create/access 来自任何可组合项的视图模型。
您可以直接在 setContent
中调用它,因为它已经属于可组合范围,但是您在 activity 中的其他任何地方调用它会不太舒服,例如 [=17] =](我知道它已被弃用,这只是一个例子)。您仍然可以按照 中所示的方式进行操作,但在某些情况下 viewModels
可能更易于使用。
In this link 它被指示在任何可组合项和 activity 中使用 viewModel()
,我们将在调用 viewModel()
时获得相同的对象。虽然指示在可组合项内使用 viewModel()
,但我也能够在 setContent{}
(在任何可组合项之外)中使用它。
In this link 指示在 activity 或片段中使用 viewModels()
来获取扩展 ViewModel
的 class 的对象。
在这两种情况下,我们都得到一个扩展 ViewModel
的 class 的对象。那么,为什么我们需要使用两种不同的方法(viewModel()
和 viewModels()
)?
如果您问是否可以在 Compose 中只使用 viewModel
而不使用 viewModels
,答案是肯定的。但在某些情况下两者同时使用更方便。
viewModels
属于androidx.activity
包,是ComponentActivity
的扩展,与Compose无关。它曾用于基于视图的 Android,当您需要使用一些 activity 特定的回调来初始化或更新您的视图模型时,它仍然可以与 Compose 一起使用。
反过来,viewModel
是 Compose 的一部分,可让您轻松地 create/access 来自任何可组合项的视图模型。
您可以直接在 setContent
中调用它,因为它已经属于可组合范围,但是您在 activity 中的其他任何地方调用它会不太舒服,例如 [=17] =](我知道它已被弃用,这只是一个例子)。您仍然可以按照 viewModels
可能更易于使用。