Sobes.tech
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
    }
}