You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Hilt在Activity范围内为所有ViewModel注入同一Repository实例?

用Hilt实现与Activity生命周期绑定的单例Repository注入

当然可以通过Hilt实现这个需求,核心是利用Hilt的作用域注解绑定Repository的生命周期到Activity,确保同一Activity下的所有ViewModel都获取到同一个实例。

步骤1:定义带Activity作用域的Repository

给Repository添加@ActivityScoped注解,Hilt会自动在同一个Activity生命周期内维护该类的唯一实例:

import dagger.hilt.android.scopes.ActivityScoped

@ActivityScoped
class MyRepository @Inject constructor(
    // 这里可以注入Repository依赖的其他对象,比如ApiService、Room Dao等
) {
    // 实现你的数据操作逻辑
}

步骤2:在ViewModel中注入Repository

给ViewModel添加@HiltViewModel注解,并通过构造函数注入Repository:

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

@HiltViewModel
class Fragment1ViewModel @Inject constructor(
    private val repository: MyRepository
) : ViewModel() {
    // 实现Fragment1对应的ViewModel逻辑
}

@HiltViewModel
class Fragment2ViewModel @Inject constructor(
    private val repository: MyRepository
) : ViewModel() {
    // 实现Fragment2对应的ViewModel逻辑
}

步骤3:配置Activity和Fragment的Hilt注解

确保宿主Activity和所有相关Fragment都添加@AndroidEntryPoint注解,让Hilt能够管理它们的依赖注入:

import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    // Activity逻辑
}

@AndroidEntryPoint
class Fragment1 : Fragment() {
    private val viewModel: Fragment1ViewModel by viewModels()
    // Fragment1逻辑
}

@AndroidEntryPoint
class Fragment2 : Fragment() {
    private val viewModel: Fragment2ViewModel by viewModels()
    // Fragment2逻辑
}

原理说明

@ActivityScoped注解会将Repository的实例生命周期绑定到Activity的Hilt组件上:

  • 同一个Activity下的所有ViewModel(无论属于哪个Fragment),注入的都是同一个Repository实例
  • 当Activity被销毁时,该Repository实例也会被Hilt清理,完全遵循Activity的生命周期

内容的提问来源于stack exchange,提问作者Tushar Saha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 13:52:44