使用 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 注释。
在代码A中,注入了fun provideLogDao
的参数database
,但是作者没有添加任何注解,而是appContext
的参数fun provideDatabase
用注解@ApplicationContext
标注,为什么?
在代码B中,注入了class LoggerLocalDataSource
的参数logDao
,但是作者没有添加注解,为什么?
代码C中告诉我如下内容,为什么class AppNavigatorImpl
的参数activity
没有加注解?你知道 ApplicationContext
也是预定义的绑定,但是作者在代码 A.
的 fun provideDatabase
中添加了注释 @ApplicationContex
t
因为在 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
...
}
@ApplicationContext
“告诉”刀柄注入应用程序上下文,而不是 activity 或服务上下文。也提醒我们注入它不会造成内存泄漏。
@Inject
就在那里,在构造函数的左边。在 DI 术语中,称为“构造函数注入”,这意味着构造函数的所有参数将被 hilt 注入,而不会一一注释。
- 在您的应用被终止之前,单例组件的对象图不会被垃圾回收 - 注入 activity 会导致内存泄漏。
我正在阅读文章 Using Hilt in your Android app。
代码 A、代码 B 和代码 C 来自解决方案分支中的 sample project。
我很困惑什么时候应该添加 Hilt 注释。
在代码A中,注入了
fun provideLogDao
的参数database
,但是作者没有添加任何注解,而是appContext
的参数fun provideDatabase
用注解@ApplicationContext
标注,为什么?在代码B中,注入了
class LoggerLocalDataSource
的参数logDao
,但是作者没有添加注解,为什么?代码C中告诉我如下内容,为什么
的class AppNavigatorImpl
的参数activity
没有加注解?你知道ApplicationContext
也是预定义的绑定,但是作者在代码 A.fun provideDatabase
中添加了注释@ApplicationContex
t
因为在 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
...
}
@ApplicationContext
“告诉”刀柄注入应用程序上下文,而不是 activity 或服务上下文。也提醒我们注入它不会造成内存泄漏。@Inject
就在那里,在构造函数的左边。在 DI 术语中,称为“构造函数注入”,这意味着构造函数的所有参数将被 hilt 注入,而不会一一注释。- 在您的应用被终止之前,单例组件的对象图不会被垃圾回收 - 注入 activity 会导致内存泄漏。