Middle+
Jak wstrzyknąć ViewModel za pomocą Dagger Hilt?
sobes.tech AI
Odpowiedź od AI
Za pomocą adnotacji @HiltViewModel dla samego ViewModel i @ActivityRetainedScoped lub @ViewModelScoped dla zależności, które mają żyć tak długo jak ViewModel lub aktywność. Zależności są wstrzykiwane przez konstruktor z adnotacją @Inject.
// Definicja ViewModel
@HiltViewModel
class MyViewModel @Inject constructor(
private val myRepository: MyRepository // Wstrzykiwanie zależności przez konstruktor
) : ViewModel() {
// Logika ViewModel
}
// Deklaracja zależności (Repository)
@ActivityRetainedScoped // Przykład zakresu
class MyRepository @Inject constructor() {
// Logika repozytorium
}
W Activity lub Fragment, ViewModel jest pobierany za pomocą delegata viewModels() lub activityViewModels():
// W Activity
@AndroidEntryPoint // Adnotacja dla komponentów Hilt
class MyActivity : AppCompatActivity() {
private val viewModel: MyViewModel by viewModels() // Uzyskanie ViewModel za pomocą delegata
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Użycie viewModel
}
}
// W Fragment
@AndroidEntryPoint // Adnotacja dla komponentów Hilt
class MyFragment : Fragment() {
private val viewModel: MyViewModel by viewModels() // Uzyskanie ViewModel dla tego fragmentu
// lub
// private val activityViewModel: MyViewModel by activityViewModels() // Uzyskanie ViewModel powiązanego z aktywnością
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// Użycie viewModel
}
}
Niezbędne zależności (np. moduły do dostarczania MyRepository) powinny być skonfigurowane w modułach Hilt.
// Przykład modułu Hilt
@Module
@InstallIn(SingletonComponent::class) // Instalacja modułu w SingletonComponent
object RepositoryModule {
@Provides
@Singleton // Przykład zakresu dla singletona
fun provideMyRepository(): MyRepository {
return MyRepository() // Dostarczenie instancji MyRepository
}
}