Hilt 是 Android 官方推荐的依赖注入框架,与 Compose 配合使用可以构建可测试、可维护的应用架构。
一、基础配置
// Application
@HiltAndroidApp
class MyApplication : Application()
// Activity
@AndroidEntryPoint
class MainActivity : ComponentActivity()
二、hiltViewModel
@HiltViewModel
class HomeViewModel @Inject constructor(
private val repository: UserRepository
) : ViewModel() {
private val _uiState = MutableStateFlow(HomeUiState())
val uiState: StateFlow<HomeUiState> = _uiState.asStateFlow()
fun loadUsers() {
viewModelScope.launch {
val users = repository.getUsers()
_uiState.update { it.copy(users = users) }
}
}
}
@Composable
fun HomeScreen(
viewModel: HomeViewModel = hiltViewModel()
) {
val uiState by viewModel.uiState.collectAsState()
// ...
}
三、与 Navigation 集成
NavHost(navController, startDestination = "home") {
composable("home") {
HomeScreen() // 自动获取正确作用域的 ViewModel
}
composable(
route = "detail/{itemId}",
arguments = listOf(navArgument("itemId") { type = NavType.StringType })
) {
DetailScreen() // itemId 自动从 SavedStateHandle 获取
}
}
四、Module 定义
@Module
@InstallIn(SingletonComponent::class)
abstract class RepositoryModule {
@Binds
@Singleton
abstract fun bindUserRepository(
impl: UserRepositoryImpl
): UserRepository
}
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
@Provides
@Singleton
fun provideRetrofit(): Retrofit {
return Retrofit.Builder()
.baseUrl("https://api.example.com/")
.build()
}
}
五、测试
@Module
@TestInstallIn(
components = [SingletonComponent::class],
replaces = [RepositoryModule::class]
)
abstract class FakeRepositoryModule {
@Binds
@Singleton
abstract fun bindUserRepository(
impl: FakeUserRepository
): UserRepository
}
💡 最佳实践
使用 hiltViewModel() 自动管理 ViewModel 作用域;通过接口抽象依赖便于测试;遵循分层架构原则。
总结
- hiltViewModel():在 Composable 中获取 ViewModel
- @HiltViewModel:标记可注入的 ViewModel
- SavedStateHandle:自动获取 Navigation 参数
- 作用域:Singleton、ActivityRetained、ViewModelScoped
- 测试:使用 @TestInstallIn 替换模块