0Pricing
Android Academy · 课时

向 ViewModel 注入依赖

使用 @HiltViewModel 实现简洁的依赖注入

向 ViewModel 注入依赖 是 CoddyKit 上的免费 Android Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Android Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Android Academy 课程共包含 4 节课。

使用 Hilt 注入 ViewModel

ViewModel 比较特殊:框架会通过工厂实例化它们。Hilt 通过 @HiltViewModel 注解与这一机制集成。

为 ViewModel 添加注解

为 ViewModel 添加 @HiltViewModel,并为其构造函数添加 @Inject。

import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject

@HiltViewModel
class UserViewModel @Inject constructor(
    private val repo: UserRepository
) : ViewModel()

Hilt 提供的内容

Hilt 会在依赖关系图中查找构造函数的每个参数。只要 UserRepository 已绑定(通过模块或构造函数注入),Hilt 就会自动提供它。

在 Compose 中获取 ViewModel

在 Composable 中使用 hiltViewModel(),即可获取由 Hilt 提供的 ViewModel。

import androidx.hilt.navigation.compose.hiltViewModel

@Composable
fun UserScreen(
    vm: UserViewModel = hiltViewModel()
) {
    val state by vm.uiState
        .collectAsStateWithLifecycle()
}

宿主必须是入口点

要使 hiltViewModel() 正常工作,宿主 Activity 必须添加 @AndroidEntryPoint 注解。这样才能将 Compose 连接到 Hilt 依赖关系图。

@AndroidEntryPoint
class MainActivity : ComponentActivity()

注入其他依赖项

您可以注入依赖关系图中的任何内容:存储库、用例,甚至是由模块提供的 Room 数据库。

@HiltViewModel
class HomeViewModel @Inject constructor(
    private val getUsers: GetUsersUseCase,
    private val analytics: Analytics
) : ViewModel()

注入应用上下文

需要上下文?请使用 @ApplicationContext 注入限定的应用上下文。

@HiltViewModel
class PrefsViewModel @Inject constructor(
    @ApplicationContext private val context: Context
) : ViewModel()

SavedStateHandle

Hilt 会自动提供 SavedStateHandle,它会携带导航参数,并在进程终止后保留这些参数。

@HiltViewModel
class DetailViewModel @Inject constructor(
    handle: SavedStateHandle
) : ViewModel() {
    val id: Int = handle.get<Int>("id") ?: 0
}

完整的连接过程

完整流程如下:模块提供存储库 → Hilt 将其注入 ViewModel → Compose 通过 hiltViewModel() 获取 ViewModel。整个过程无需手动创建任何工厂。

无需手动编写工厂代码

如果没有 Hilt,您需要为每个需要构造函数参数的 ViewModel 编写自定义的 ViewModelProvider.Factory。@HiltViewModel 消除了所有这些工作。

串联整个技术栈

现在,您已经拥有完整的现代技术栈:ViewModel + 感知生命周期的状态、Room 持久化、协程和 Flow,并全部通过 Hilt DI 连接起来。

快速检查

测试您对 ViewModel 注入的理解。

回顾

您学到了:

  • @HiltViewModel + @Inject 构造函数可以让 Hilt 构建 ViewModel。
  • 在带有 @AndroidEntryPoint 的宿主中,通过 Compose 的 hiltViewModel() 获取 ViewModel。
  • 注入存储库、@ApplicationContext 和 SavedStateHandle。
  • 无需手动创建工厂。

常见问题解答

「向 ViewModel 注入依赖」课时是免费的吗?

是的 — 「向 ViewModel 注入依赖」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Android Academy 课程的其余内容,请升级到 CoddyKit PRO。 Android Academy 课程共包含 4 节课。

「向 ViewModel 注入依赖」这节课中我会学到什么?

使用 @HiltViewModel 实现简洁的依赖注入 你通过在浏览器中直接运行的动手代码来练习 Android Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Android Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Android Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「向 ViewModel 注入依赖」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Android Academy 课中编写并运行代码吗?

能。每节 Android Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 为什么使用依赖注入
  2. 设置 Hilt
  3. 模块和提供者
  4. 向 ViewModel 注入依赖
← 返回 Android Academy