Hilt 종속성 주입을 사용하도록 보기 모델 변환

다음은 내가 수행한 단계와 내 Android 뉴스 앱을 hilt 종속성 주입을 사용하도록 변환하는 주요 학습 내용입니다.

이 기사는 원래 2022년 7월 16일 vtsen.hashnode.dev에 게시되었습니다.

그래서 How to Implement Hilt in Android App? 문서의 단계에 따라 Android News app을 Hilt 종속성 주입을 사용하도록 변환했습니다. 이전 기사의 차이점은 View Model 종속성 주입을 다루지 않는다는 것입니다.

1. 종속성 및 @HiltAndroidApp 추가



초기 설정 단계는 다음과 정확히 동일합니다.
  • Setup Hilt Dependencies
  • Add @HiltAndroidApp in your application class

  • 2. @HiltViewModel 및 @Inject 생성자 추가



    Hilt가 MainViewModel 를 생성하려면 클래스에 @HiltViewModel 로 주석을 추가해야 합니다. @Inject constructor 은 Hilt에 종속성을 생성하는 방법을 알려주는 데에도 사용됩니다.

    @HiltViewModel
    class MainViewModel
        @Inject constructor(
            private val repository: ArticlesRepository,
        ) : ViewModel() {
        ...
    }
    


    나는 또한 @Inject ConstructorSqlArticlesRepository 를 사용합니다.

    class SqlArticlesRepository @Inject constructor(
        private val database: ArticlesDatabase,
        private val webService: WebService,
    ) : ArticlesRepository {
       ...
    }
    


    3. @Provides 및 @Binds 추가



    종속성을 만들기 위해 @Provides@Binds 중 하나를 사용합니다. @ProvidesArticlesDatabaseWebService 인스턴스를 만드는 데 사용됩니다.

    @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()
        }
    }
    

    @BindsArticlesRepository 인터페이스 구현을 만드는 데 사용됩니다.

    @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 . 할아버지라고 불러주세요. 저는 여전히 다음과 같은 수동 종속성 주입을 선호합니다.
  • Recommended Ways To Create ViewModel or AndroidViewModel

  • 소스 코드


  • GitHub 리포지토리: Android News (Hilt 분기)
  • 분기 차이: Master vs Hilt



  • 또한보십시오


  • Android Development Tips and Tricks
  • 좋은 웹페이지 즐겨찾기