Sobes.tech
Middle+

Jak injektovat ViewModel pomocí Dagger Hilt?

sobes.tech AI

Odpověď od AI

Pomocí anotace @HiltViewModel pro samotný ViewModel a @ActivityRetainedScoped nebo @ViewModelScoped pro závislosti, které mají žít stejně dlouho jako ViewModel nebo aktivita. Závislosti jsou injektovány přes konstruktor s anotací @Inject.

// Definice ViewModel
@HiltViewModel
class MyViewModel @Inject constructor(
    private val myRepository: MyRepository // Injekce závislosti přes konstruktor
) : ViewModel() {
    // Logika ViewModel
}
// Deklarace závislosti (Repository)
@ActivityRetainedScoped // Příklad scope
class MyRepository @Inject constructor() {
    // Logika repozitáře
}

V Activity nebo Fragmentu je ViewModel získán pomocí delegátu viewModels() nebo activityViewModels():

// V Activity
@AndroidEntryPoint // Anotace pro Hilt komponenty
class MyActivity : AppCompatActivity() {

    private val viewModel: MyViewModel by viewModels() // Získání ViewModel pomocí delegátu

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // Použití viewModel
    }
}
// V Fragmentu
@AndroidEntryPoint // Anotace pro Hilt komponenty
class MyFragment : Fragment() {

    private val viewModel: MyViewModel by viewModels() // Získání ViewModel pro tento fragment
    // nebo
    // private val activityViewModel: MyViewModel by activityViewModels() // Získání ViewModel spojeného s aktivitou

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // Použití viewModel
    }
}

Potřebné závislosti (například moduly pro poskytování MyRepository) by měly být nakonfigurovány v Hilt modulech.

// Příklad Hilt modulu
@Module
@InstallIn(SingletonComponent::class) // Instalace do SingletonComponent
object RepositoryModule {

    @Provides
    @Singleton // Scope pro singleton
    fun provideMyRepository(): MyRepository {
        return MyRepository() // Poskytování instance MyRepository
    }
}