
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 MainViewModel
sı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 ActivityComponent
derlemede 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: