如何用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
相关产品推荐
相关产品推荐

