使用hilt注入dao依赖到ViewModel

上一篇Philipp Lackner 教程中没有给出Hilt作为依赖的操作说明,而是直接构造了ViewModelProvider.Factory 被用来创建 ContactViewModel 的实例。 查看上一篇代码点击链接 ,因为注入ContactViewModel 需要一个 ContactDatabase.Dao 实例来与其数据库进行交互,可以用hilt来完成dao实例的注入。
使用hilt的最大用处就是解耦,比如一个外卖员他送的商品,他不需在意食品是如何生产的,鲜花是如何种植的,药品的配方是什么,他的职责就是将商品送到客户手里。送货的业务里不包含商品的实例化过程,只关注运输的步骤,完成业务的解耦。

言归正传,首先加入hilt依赖:
打开根 build.gradle 文件,并在类路径中找到以下 Hilt 依赖项:

plugins {
    id 'com.google.dagger.hilt.android' version '2.44' apply false
}

然后,为在 app 模块中使用 gradle 插件,我们应在 app/build.gradle 文件中指定它,具体方法为:将 gradle 插件添加到此文件的顶部、kotlin-kapt 插件之下:

plugins {
    id 'com.android.application'
    id 'kotlin-kapt'
    id 'dagger.hilt.android.plugin'
}

dependencies {
    implementation platform('androidx.compose:compose-bom:2022.10.00')

    // Room
    implementation "androidx.room:room-ktx:2.4.3"
    kapt "androidx.room:room-compiler:2.4.3"

    // Hilt dependencies
    def hilt_version=2.44
    implementation "com.google.dagger:hilt-android:$hilt_version"
    kapt "com.google.dagger:hilt-android-compiler:$hilt_version"
}

plugins {
    id 'com.google.dagger.hilt.android' version '2.44' apply false
}
在manifest中建立一个name为.ContactApplication
<?xml version="1.0" encoding="utf-8"?>

<application
    android:name=".ContactApplication"
    android:allowBackup="true"
 .....
    </activity>
</application>

与 ContactApplication 类要添加附着于应用的生命周期的容器,我们需要为 Application 类添加 @HiltAndroidApp 注解。
如此来告知Hilt该程序进行依赖注入。可以在其他组件(如Activity、Fragment)中使用@AndroidEntryPoint注解来标记需要进行依赖注入的地方。Hilt会根据注解生成必要的代码,在运行时完成依赖注入。该注解会触发 Hilt 的代码生成应用的一个基类,该基类可使用依赖项注入。application 容器是应用的父级容器,这意味着其他容器可以访问它提供的依赖项。

@HiltAndroidApp
class ContactApplication : Application() {

}

@HiltViewModel注解 用于修饰的ViewModel类项目提供ViewModel实例。同时使用@HiltViewModel修饰的节点必须继承androidx.lifecycle.ViewModel;
如要执行字段注入,由 Hilt 注入Android 类字段使用 @Inject 注解。而在构造函数添加 @Inject 注解。还需要加入 constructor 关键字。这里使用 dao作为ContactViewModel 构造函数依赖注入。
由 Hilt 注入的字段不能是私有字段,class ContactViewModel(private val dao: ContactDao)要取消构造器中的private。 这里不取消也不影响运行。

@HiltViewModel
class ContactViewModel @Inject constructor(val dao: ContactDao) : ViewModel() {
   ...

dao是接口类型,在 Hilt 模块中为函数添加 @Provides 注解,来完成无法通过构造函数注入的类型。
每当 Hilt 需要提供相应类型的实例时,都会执行带有 @Provides 注解的函数的函数主体。带有 @Provides 注解的函数的返回值类型会告知 Hilt 绑定的类型,即如何提供该类型的实例。
@InstallIn 注解用于指定一个类或模块应该在哪里被解析和实例化。SingletonComponent::class 表示这个类或模块应该在应用的单例组件中解析和实例化。单例组件是一个在整个应用生命周期中只创建一次的组件。
使用 @InstallIn(SingletonComponent::class) 可以确保你的依赖或模块在应用的单例组件中可用,并且在整个应用中都可以访问。

新建一个模块,构建一个Room联系人表的实例ContactDatabase ,放入provideContactDao函数, 返回database.dao得到ContactDao 的实例。

@InstallIn(SingletonComponent::class)
@Module
object DatabaseModule {

    @Provides
    @Singleton
    fun provideDatabase(@ApplicationContext appContext: Context): ContactDatabase {
        return Room.databaseBuilder(
            appContext,
            ContactDatabase::class.java, "db.db"
        ).build()
    }

    @Provides
    fun provideContactDao(database: ContactDatabase): ContactDao {
        return database.dao
    }
}

我们需要为 MainActivity 添加 @AndroidEntryPoint 注解。最后完成了替换ViewModelProvider.Factory的工作。

@AndroidEntryPoint
class MainActivity : ComponentActivity() {
     private val viewModel by viewModels<ContactViewModel> (
        /* 使用依赖注入可以攻注解以下部分factoryProducer = {
            object :ViewModelProvider.Factory{
                override fun <T : ViewModel> create(modelClass: Class<T>): T {//now we can simply say as T so we cast that as our return value
                    return ContactViewModel(db.dao) as T
                }//that’s just how we create a viewModel with parameters
            }
        }*/
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            HiltTheme {
                val state by viewModel.state.collectAsState()
                ContactScreen(state =state , onEvent =viewModel::onEvent )
            }
        }
    }
}

参考以下文章:

官网实例:在 Android 应用中使用 Hilt
郭神介绍hilt:Jetpack新成员,一篇文章带你玩转Hilt和依赖注入
Android Compose 新闻App(二)ViewModel、Hlit、数据流

  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hilt 是一个用于简化依赖注入的框架,可以在 Android 应用程序中使用它来管理和注入依赖项。下面是使用 Hilt 进行依赖注入的一个简单示例应用: 1. 添加 Hilt 相关依赖到项目中。在项目的根目录的 `build.gradle` 文件中添加 Hilt Gradle 插件的依赖: ```groovy buildscript { repositories { ... } dependencies { ... classpath 'com.google.dagger:hilt-android-gradle-plugin:<version>' } } ``` 在应用模块的 `build.gradle` 文件中应用 Hilt 插件,并添加 Hilt 相关依赖: ```groovy apply plugin: 'kotlin-kapt' apply plugin: 'dagger.hilt.android.plugin' android { ... } dependencies { implementation 'com.google.dagger:hilt-android:<version>' kapt 'com.google.dagger:hilt-android-compiler:<version>' ... } ``` 2. 在 Application 类上添加 `@HiltAndroidApp` 注解,将其标记为 Hilt 应用程序: ```kotlin import dagger.hilt.android.HiltAndroidApp @HiltAndroidApp class MyApp : Application() { // Application 的实现代码... } ``` 3. 创建一个需要依赖注入的类,例如 UserRepository: ```kotlin import javax.inject.Inject class UserRepository @Inject constructor() { // UserRepository 的实现代码... } ``` 4. 在需要进行依赖注入的类中,使用 `@Inject` 注解来标记需要注入依赖项。例如,在 MainActivity 中: ```kotlin import javax.inject.Inject @AndroidEntryPoint class MainActivity : AppCompatActivity() { @Inject lateinit var userRepository: UserRepository // Activity 的实现代码... } ``` 通过以上步骤,Hilt 会自动管理依赖项的创建和注入。在 MainActivity 中,`userRepository` 字段将会被自动注入一个 UserRepository 实例。 需要注意的是,使用 Hilt 进行依赖注入需要在 Android Studio 中启用 kapt 插件。 这只是一个简单的示例,Hilt 可以在更复杂的应用程序中提供更多的依赖注入功能和灵活性。 希望对你有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值