Hilt 是 Google 推出的依赖注入框架,用于简化 Android 应用中的依赖注入。ViewModel 是 Android Architecture Components 的一部分,用于管理 UI 相关的数据,并处理与 UI 控制器的生命周期相关的问题。
Hilt 支持多种类型的依赖注入:
Hilt 和 ViewModel 的组合常用于以下场景:
在某些情况下,你可能需要在运行时传递参数来实例化 ViewModel。Hilt 提供了 @AssistedInject
注解来实现这一点。
假设我们有一个 UserViewModel
,需要根据用户 ID 来实例化:
import androidx.lifecycle.ViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@HiltViewModel
class UserViewModel @Inject constructor(
private val userId: String,
private val userService: UserService
) : ViewModel() {
// 使用 userId 和 userService 进行业务逻辑处理
}
为了在运行时传递 userId
,我们需要定义一个接口:
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
interface UserViewModelFactory {
fun create(userId: String): UserViewModel
}
class UserViewModelFactoryImpl @AssistedFactory constructor(
private val userService: UserService
) : UserViewModelFactory {
@AssistedInject
override fun create(userId: String): UserViewModel {
return UserViewModel(userId, userService)
}
}
然后在模块中提供 UserViewModelFactory
:
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Provides
fun provideUserService(): UserService {
return UserServiceImpl()
}
}
最后,在 Activity 或 Fragment 中使用 UserViewModelFactory
来实例化 UserViewModel
:
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private val viewModelFactory: UserViewModelFactory by viewModels()
private val viewModel: UserViewModel by viewModels { viewModelFactory.create("123") }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 使用 viewModel 进行数据展示和处理
}
}
通过上述步骤,你可以在运行时传递参数来实例化 ViewModel,并利用 Hilt 简化依赖注入的过程。
领取专属 10元无门槛券
手把手带您无忧上云