Middle+
Cum să injectezi un ViewModel folosind Dagger Hilt?
sobes.tech AI
Răspuns de la AI
Cu adnotarea @HiltViewModel pentru ViewModel-ul în sine și @ActivityRetainedScoped sau @ViewModelScoped pentru dependențele care trebuie să trăiască atât cât ViewModel-ul sau activitatea. Dependențele sunt injectate prin constructor cu adnotarea @Inject.
// Definirea ViewModel-ului
@HiltViewModel
class MyViewModel @Inject constructor(
private val myRepository: MyRepository // Injecție de dependență prin constructor
) : ViewModel() {
// Logica ViewModel
}
// Declararea dependenței (Repository)
@ActivityRetainedScoped // Exemplu de scope
class MyRepository @Inject constructor() {
// Logica repository-ului
}
În Activity sau Fragment, ViewModel se obține cu ajutorul delegatului viewModels() sau activityViewModels():
// În Activity
@AndroidEntryPoint // Anotare pentru componente Hilt
class MyActivity : AppCompatActivity() {
private val viewModel: MyViewModel by viewModels() // Obținerea ViewModel-ului prin delegat
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Utilizarea viewModel
}
}
// În Fragment
@AndroidEntryPoint // Anotare pentru componente Hilt
class MyFragment : Fragment() {
private val viewModel: MyViewModel by viewModels() // Obținerea ViewModel-ului pentru acest fragment
// sau
// private val activityViewModel: MyViewModel by activityViewModels() // Obținerea ViewModel-ului legat de activitate
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// Utilizarea viewModel
}
}
Dependențele necesare (de exemplu, module pentru furnizarea MyRepository) trebuie configurate în modulele Hilt.
// Exemplu de modul Hilt
@Module
@InstallIn(SingletonComponent::class) // Instalare în SingletonComponent
object RepositoryModule {
@Provides
@Singleton // Scope pentru singleton
fun provideMyRepository(): MyRepository {
return MyRepository() // Furnizarea unei instanțe de MyRepository
}
}