代码之家  ›  专栏  ›  技术社区  ›  HelloCW

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

  •  0
  • HelloCW  · 技术社区  · 4 年前

    我在读这篇文章 Using Hilt in your Android app

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

    我不知道什么时候应该添加Hilt注释。

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

    2. 在代码B中,参数 logDao 属于 class LoggerLocalDataSource 被注入,但作者没有添加任何注释,为什么?

    3. 在代码C中,我被告知以下内容,为什么参数 activity 属于 class AppNavigatorImpl 添加了注释吗?你知道 ApplicationContext 也是预定义的绑定,但作者添加了注释 @ApplicationContex t英寸 趣味提供数据库 代码A中。

    由于活动容器中提供了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
        ...
    }
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   Shlomi Katriel    4 年前
    1. @ApplicationContext 告诉hilt注入应用程序上下文,而不是活动或服务上下文。还提醒我们,注入它不会导致内存泄漏。
    2. @Inject 就在那里,在构造函数的左边。在DI术语中,被称为“构造函数注入”,这意味着构造函数的所有参数都将由hilt注入,而不需要逐一注释。
    3. Singleton组件的对象图不会被垃圾收集,直到你的应用程序被杀死——在那里注入一个活动会导致内存泄漏。
    推荐文章