Sobes.tech
Middle+

Wie injiziert man ein ViewModel mit Dagger Hilt?

sobes.tech KI

Antwort von AI

Mit der Annotation @HiltViewModel für das ViewModel selbst und @ActivityRetainedScoped oder @ViewModelScoped für Abhängigkeiten, die so lange leben sollen wie das ViewModel oder die Aktivität. Abhängigkeiten werden über den Konstruktor mit der Annotation @Inject injiziert.

// Definition des ViewModels
@HiltViewModel
class MyViewModel @Inject constructor(
    private val myRepository: MyRepository // Abhängigkeit durch Konstruktorinjektion
) : ViewModel() {
    // Logik des ViewModels
}
// Deklaration der Abhängigkeit (Repository)
@ActivityRetainedScoped // Beispiel Scope
class MyRepository @Inject constructor() {
    // Logik des Repositories
}

In der Activity oder im Fragment wird das ViewModel mit dem Delegaten viewModels() oder activityViewModels() abgerufen:

// In der Activity
@AndroidEntryPoint // Annotation für Hilt-Komponenten
class MyActivity : AppCompatActivity() {

    private val viewModel: MyViewModel by viewModels() // ViewModel mit Delegat abrufen

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // Verwendung des viewModel
    }
}
// Im Fragment
@AndroidEntryPoint // Annotation für Hilt-Komponenten
class MyFragment : Fragment() {

    private val viewModel: MyViewModel by viewModels() // ViewModel für dieses Fragment
    // oder
    // private val activityViewModel: MyViewModel by activityViewModels() // ViewModel, das mit der Aktivität verbunden ist

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // Verwendung des viewModel
    }
}

Notwendige Abhängigkeiten (z.B. Module zur Bereitstellung von MyRepository) sollten in Hilt-Modulen konfiguriert werden.

// Beispiel eines Hilt-Moduls
@Module
@InstallIn(SingletonComponent::class) // Modul im SingletonComponent installieren
object RepositoryModule {

    @Provides
    @Singleton // Beispiel Scope für Singleton
    fun provideMyRepository(): MyRepository {
        return MyRepository() // Bereitstellung einer Instanz von MyRepository
    }
}