为什么 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 可能更易于使用。