Hilt 与 Compose 集成:依赖注入最佳实践

2024-05-20 · 24 min · 依赖注入

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 作用域;通过接口抽象依赖便于测试;遵循分层架构原则。

总结