Görünüm Modelini Hilt Bağımlılık Enjeksiyonu Kullanacak Şekilde Dönüştür

Görünüm Modelini Hilt Bağımlılık Enjeksiyonu Kullanacak Şekilde Dönüştür

Bu yüzden adımları takip ettim Hilt Android Uygulamasında Nasıl Uygulanır? dönüştürmek için makale Android Haber uygulaması Hilt Bağımlılık Enjeksiyonu kullanmak için. Önceki makaledeki fark, Görünüm Modeli bağımlılık enjeksiyonunu kapsamamasıdır.

1. Bağımlılıklar ve @HiltAndroidApp

İlk kurulum adımları aşağıdakilerle tamamen aynıdır:

2. @HiltViewModel ve @InjectConstructor

Hilt’in oluşturması için MainViewModelsınıfa açıklama eklemeniz gerekiyor @HiltViewModel. @Inject constructor Hilt’e bağımlılıkların nasıl oluşturulabileceğini anlatmak için de kullanılır.

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

ben de kullanıyorum @Inject Constructor üzerinde SqlArticlesRepository .

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

3. @Provides ve Binds

Bağımlılıkları oluşturmak için ya @Sağlar ve @bağlar. @Provides oluşturmak için kullanılır ArticlesDatabase ve WebService örnekler.

@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 uygulamasını oluşturmak için kullanılır. ArticlesRepository arayüz.

@Module
@InstallIn(SingletonComponent::class)
abstract class RepositoryModule {

    @Binds
    @Singleton
    abstract fun bindArticlesRepository(impl: SqlArticlesRepository): ArticlesRepository
}

4. hiltViewModel() Birleştirilebilir

Şimdi oldu! Aşağıdaki tüm manuel kreasyonlar MainActivity kaldırılabilir.

    private val repository by lazy {
        SqlArticlesRepository(
            ArticlesDatabase.getInstance(application),
            WebService(),
        )
    }

    private val homeViewModel by viewModels<MainViewModel> {
        MainViewModelFactory(repository)
    }

bu MainViewModel arayarak oluşturulabilir.hiltViewModel() gerekli tüm bağımlılıkları üreten birleştirilebilir işlev.

Örneğin, bunu değiştirin MainScreen birleştirilebilir işlev

MainScreen(homeViewModel, useSystemUIController = true)

ile birlikte

MainScreen(viewModel = hiltViewModel(), useSystemUIController = true)

Aşağıdaki veritabanı oluşturma, hilt tarafından sağlandığı için de kaldırılabilir. @Provides üstünde.

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
        }
    }
}

Bu MainViewModelFactory tarafından halledildiği için de kaldırılabilir. @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")
    }
}

Çözüm

Tüm yüklü Hilt modüllerim SingletonComponent dürbün. Kurulu modülümü başka bir bileşenle değiştirirsem, örneğin ViewModelComponent veya ActivityComponentderlemede başarısız oluyor ve nasıl düzelteceğimi bilmiyorum sanırım bununla oynamak için bir sonraki adımım bu Hilt.

evet hala sevmiyorum Hilt. Bana büyük baba de, hala bunun gibi manuel bağımlılık enjeksiyonunu tercih ediyorum:

Kaynak kodu

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.