Sobes.tech
Middle+

Hogyan injektáljuk a ViewModel-t Dagger Hilt segítségével?

sobes.tech MI

Válasz az MI-től

A @HiltViewModel annotációval a ViewModel-hez, és @ActivityRetainedScoped vagy @ViewModelScoped annotációkkal azokhoz a függőségekhez, amelyeknek ugyanannyi ideig kell élniük, mint a ViewModel vagy az aktivitás. A függőségek a @Inject annotációval ellátott konstruktoron keresztül injektálódnak.

// ViewModel meghatározása
@HiltViewModel
class MyViewModel @Inject constructor(
    private val myRepository: MyRepository // Függőség injektálása konstruktoron keresztül
) : ViewModel() {
    // ViewModel logikája
}
// Függőség deklarálása (Repository)
@ActivityRetainedScoped // Példa scope
class MyRepository @Inject constructor() {
    // Repository logikája
}

Az Activity vagy Fragment esetében a ViewModel a viewModels() vagy activityViewModels() delegált segítségével szerezhető be:

// Activity-ben
@AndroidEntryPoint // Anotáció a Hilt komponensekhez
class MyActivity : AppCompatActivity() {

    private val viewModel: MyViewModel by viewModels() // ViewModel beszerzése delegált segítségével

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // A viewModel használata
    }
}
// Fragmentben
@AndroidEntryPoint // Anotáció a Hilt komponensekhez
class MyFragment : Fragment() {

    private val viewModel: MyViewModel by viewModels() // A ViewModel beszerzése ehhez a fragmenthez
    // vagy
    // private val activityViewModel: MyViewModel by activityViewModels() // A ViewModel beszerzése az aktivitáshoz kötve

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // A viewModel használata
    }
}

A szükséges függőségek (pl. modulok a MyRepository biztosításához) a Hilt modulokban kell legyenek konfigurálva.

// Hilt modul példája
@Module
@InstallIn(SingletonComponent::class) // A modul telepítése a SingletonComponent-be
object RepositoryModule {

    @Provides
    @Singleton // Scope például singleton
    fun provideMyRepository(): MyRepository {
        return MyRepository() // Egy példány biztosítása a MyRepository-ból
    }
}