【问题标题】:How to instance a ViewModel class automatically with Hilt when I use Compose?使用 Compose 时如何使用 Hilt 自动实例化 ViewModel 类?
【发布时间】:2021-12-30 02:49:03
【问题描述】:

代码A来自官方样本project的末尾分支。

项目使用Hilt实现依赖注入。

在我看来,当我使用Hilt时,我不需要手动实例化ViewModel类,系统会在需要时自动实例化ViewModel

但是作者似乎在代码A中使用代码viewModel: MainViewModel = viewModel()手动实例化ViewModel类,我使用Compose时如何使用Hilt自动实例化ViewMode类?

代码 A

@OptIn(ExperimentalMaterialApi::class)
@Composable
fun CraneHomeContent(
    onExploreItemClicked: OnExploreItemClicked,
    openDrawer: () -> Unit,
    modifier: Modifier = Modifier,
    viewModel: MainViewModel = viewModel(),
) {
    ...
}



@HiltViewModel
class MainViewModel @Inject constructor(
    private val destinationsRepository: DestinationsRepository,
    @DefaultDispatcher private val defaultDispatcher: CoroutineDispatcher
) : ViewModel() {

   ...
}

【问题讨论】:

    标签: kotlin android-jetpack-compose dagger-hilt


    【解决方案1】:

    documentation中所述

    ViewModel 部分提到的 viewModel() 函数 自动使用 Hilt 构造的 ViewModel @HiltViewModel 注释。我们提供了文档 关于 Hilt 的 ViewModel 集成的信息。

    因此,只要您的视图模型具有 @HiltViewModel 注释,您就不必更改任何内容。

    【讨论】:

      【解决方案2】:

      正如@Karim0x1 所说。 Official Android Developer Documentation 像这样引导我们:

      ViewModel 部分中提到的 viewModel() 函数自动使用 Hilt 使用 @HiltViewModel 注解构造的 ViewModel。我们提供了有关 Hilt's ViewModel integration 信息的文档。

      @HiltViewModel
      class ExampleViewModel @Inject constructor(
          private val savedStateHandle: SavedStateHandle,
          private val repository: ExampleRepository
      ) : ViewModel() { /* ... */ }
      
      @Composable
      fun ExampleScreen(
          exampleViewModel: ExampleViewModel = viewModel()
      ) { /* ... */ }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-14
        • 1970-01-01
        • 2021-04-18
        • 2023-02-15
        • 2022-12-14
        • 2022-09-29
        相关资源
        最近更新 更多