使用 Hilt 作为依赖注入时,什么时候需要添加注解?

When do I need to add annotation when I use Hilt as dependency injection?

我正在阅读文章 Using Hilt in your Android app

代码 A、代码 B 和代码 C 来自解决方案分支中的 sample project

我很困惑什么时候应该添加 Hilt 注释。

  1. 在代码A中,注入了fun provideLogDao的参数database,但是作者没有添加任何注解,而是appContext的参数fun provideDatabase用注解@ApplicationContext标注,为什么?

  2. 在代码B中,注入了class LoggerLocalDataSource的参数logDao,但是作者没有添加注解,为什么?

  3. 代码C中告诉我如下内容,为什么class AppNavigatorImpl的参数activity没有加注解?你知道 ApplicationContext 也是预定义的绑定,但是作者在代码 A.

    fun provideDatabase 中添加了注释 @ApplicationContext

因为在 Activity 容器中提供了一个 AppNavigator 实例,所以 FragmentActivity 已经可以作为预定义绑定使用。

代码A

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

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

    @Provides
    fun provideLogDao(database: AppDatabase): LogDao {
        return database.logDao()
    }
}

代码B

class LoggerLocalDataSource @Inject constructor(private val logDao: LogDao) : LoggerDataSource {
   ...
}

代码C

class AppNavigatorImpl @Inject constructor(private val activity: FragmentActivity) : AppNavigator {
   ...
}

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    @Inject lateinit var navigator: AppNavigator
    ...
}
  1. @ApplicationContext“告诉”刀柄注入应用程序上下文,而不是 activity 或服务上下文。也提醒我们注入它不会造成内存泄漏。
  2. @Inject 就在那里,在构造函数的左边。在 DI 术语中,称为“构造函数注入”,这意味着构造函数的所有参数将被 hilt 注入,而不会一一注释。
  3. 在您的应用被终止之前,单例组件的对象图不会被垃圾回收 - 注入 activity 会导致内存泄漏。