Hilt 종속성 주입을 사용하도록 보기 모델 변환
이 기사는 원래 2022년 7월 16일 vtsen.hashnode.dev에 게시되었습니다.
그래서 How to Implement Hilt in Android App? 문서의 단계에 따라 Android News app을 Hilt 종속성 주입을 사용하도록 변환했습니다. 이전 기사의 차이점은 View Model 종속성 주입을 다루지 않는다는 것입니다.
1. 종속성 및 @HiltAndroidApp 추가
초기 설정 단계는 다음과 정확히 동일합니다.
2. @HiltViewModel 및 @Inject 생성자 추가
Hilt가
MainViewModel
를 생성하려면 클래스에 @HiltViewModel
로 주석을 추가해야 합니다. @Inject constructor
은 Hilt에 종속성을 생성하는 방법을 알려주는 데에도 사용됩니다.@HiltViewModel
class MainViewModel
@Inject constructor(
private val repository: ArticlesRepository,
) : ViewModel() {
...
}
나는 또한
@Inject Constructor
에 SqlArticlesRepository
를 사용합니다.class SqlArticlesRepository @Inject constructor(
private val database: ArticlesDatabase,
private val webService: WebService,
) : ArticlesRepository {
...
}
3. @Provides 및 @Binds 추가
종속성을 만들기 위해 @Provides 및 @Binds 중 하나를 사용합니다.
@Provides
는 ArticlesDatabase
및 WebService
인스턴스를 만드는 데 사용됩니다.@Module
@InstallIn(SingletonComponent::class)
object DatabaseModule {
@Provides
@Singleton
fun provideDatabase(@ApplicationContext appContext: Context): ArticlesDatabase {
return Room.databaseBuilder(
appContext,
ArticlesDatabase::class.java,
"articles.db",
)
.fallbackToDestructiveMigration()
.build()
}
}
@Module
@InstallIn(SingletonComponent::class)
object WebServiceModule {
@Provides
@Singleton
fun provideWebService(): WebService {
return WebService()
}
}
@Binds
는 ArticlesRepository
인터페이스 구현을 만드는 데 사용됩니다.@Module
@InstallIn(SingletonComponent::class)
abstract class RepositoryModule {
@Binds
@Singleton
abstract fun bindArticlesRepository(impl: SqlArticlesRepository): ArticlesRepository
}
4. hiltViewModel() 컴포저블 호출
이제 끝났습니다!
MainActivity
에서 아래의 모든 수동 생성을 제거할 수 있습니다.private val repository by lazy {
SqlArticlesRepository(
ArticlesDatabase.getInstance(application),
WebService(),
)
}
private val homeViewModel by viewModels<MainViewModel> {
MainViewModelFactory(repository)
}
MainViewModel
생성은 필요한 모든 종속성을 생성하는 hiltViewModel()
구성 가능 함수를 호출하여 수행할 수 있습니다.예를 들어 이 구성 가능한 함수
MainScreen
를 교체합니다.MainScreen(homeViewModel, useSystemUIController = true)
~와 함께
MainScreen(viewModel = hiltViewModel(), useSystemUIController = true)
아래의 데이터베이스 생성은 위의 hilt
@Provides
에서 제공되었으므로 제거할 수도 있습니다.companion object {
@Volatile
private lateinit var instance: ArticlesDatabase
fun getInstance(context: Context): ArticlesDatabase {
synchronized(this) {
if (!::instance.isInitialized) {
instance = Room.databaseBuilder(
context.applicationContext,
ArticlesDatabase::class.java,
"articles.db")
.fallbackToDestructiveMigration()
.build()
}
return instance
}
}
}
이
MainViewModelFactory
는 @HiltViewModel
에 의해 처리되었으므로 제거할 수도 있습니다.@Suppress("UNCHECKED_CAST")
class MainViewModelFactory(private val repository: ArticlesRepository)
: ViewModelProvider.NewInstanceFactory() {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(MainViewModel::class.java)) {
return MainViewModel(repository) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
결론
설치된 모든 Hilt 모듈은
SingletonComponent
범위에 있습니다. 설치된 모듈을 다른 구성요소(예: ViewModelComponent
또는 ActivityComponent
)로 변경하면 컴파일에 실패하고 이를 수정하는 방법을 모르겠습니다. .예, 여전히 마음에 들지 않습니다
Hilt
. 할아버지라고 불러주세요. 저는 여전히 다음과 같은 수동 종속성 주입을 선호합니다.소스 코드
또한보십시오
Reference
이 문제에 관하여(Hilt 종속성 주입을 사용하도록 보기 모델 변환), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/vtsen/convert-view-model-to-use-hilt-dependency-injection-1mb3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)