Middle+
Ako injektovať ViewModel pomocou Dagger Hilt?
sobes.tech AI
Odpoveď od AI
S pomocou anotácie @HiltViewModel pre samotný ViewModel a @ActivityRetainedScoped alebo @ViewModelScoped pre závislosti, ktoré majú žiť rovnako dlho ako ViewModel alebo aktivita. Závislosti sú injektované cez konštruktor s anotáciou @Inject.
// Definícia ViewModel
@HiltViewModel
class MyViewModel @Inject constructor(
private val myRepository: MyRepository // Injektovanie závislosti cez konštruktor
) : ViewModel() {
// Logika ViewModel
}
// Vyhlásenie závislosti (Repository)
@ActivityRetainedScoped // Príklad scope
class MyRepository @Inject constructor() {
// Logika repozitára
}
V Activity alebo Frgmente sa ViewModel získa pomocou delegátu viewModels() alebo activityViewModels():
// V Activity
@AndroidEntryPoint // Anotácia pre Hilt komponenty
class MyActivity : AppCompatActivity() {
private val viewModel: MyViewModel by viewModels() // Získanie ViewModel pomocou delegátu
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Použitie viewModel
}
}
// V Frgmente
@AndroidEntryPoint // Anotácia pre Hilt komponenty
class MyFragment : Fragment() {
private val viewModel: MyViewModel by viewModels() // Získanie ViewModel pre tento fragment
// alebo
// private val activityViewModel: MyViewModel by activityViewModels() // Získanie ViewModel via aktivita
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// Použitie viewModel
}
}
Potrebné závislosti (napríklad moduly na poskytovanie MyRepository) by mali byť nakonfigurované v Hilt moduloch.
// Príklad Hilt modulu
@Module
@InstallIn(SingletonComponent::class) // Inštalácia do SingletonComponent
object RepositoryModule {
@Provides
@Singleton // Scope pre singleton
fun provideMyRepository(): MyRepository {
return MyRepository() // Poskytovanie inštancie MyRepository
}
}