Sobes.tech
Middle+

Cum să injectezi un ViewModel folosind Dagger Hilt?

sobes.tech AI

Răspuns de la AI

Cu adnotarea @HiltViewModel pentru ViewModel-ul în sine și @ActivityRetainedScoped sau @ViewModelScoped pentru dependențele care trebuie să trăiască atât cât ViewModel-ul sau activitatea. Dependențele sunt injectate prin constructor cu adnotarea @Inject.

// Definirea ViewModel-ului
@HiltViewModel
class MyViewModel @Inject constructor(
    private val myRepository: MyRepository // Injecție de dependență prin constructor
) : ViewModel() {
    // Logica ViewModel
}
// Declararea dependenței (Repository)
@ActivityRetainedScoped // Exemplu de scope
class MyRepository @Inject constructor() {
    // Logica repository-ului
}

În Activity sau Fragment, ViewModel se obține cu ajutorul delegatului viewModels() sau activityViewModels():

// În Activity
@AndroidEntryPoint // Anotare pentru componente Hilt
class MyActivity : AppCompatActivity() {

    private val viewModel: MyViewModel by viewModels() // Obținerea ViewModel-ului prin delegat

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // Utilizarea viewModel
    }
}
// În Fragment
@AndroidEntryPoint // Anotare pentru componente Hilt
class MyFragment : Fragment() {

    private val viewModel: MyViewModel by viewModels() // Obținerea ViewModel-ului pentru acest fragment
    // sau
    // private val activityViewModel: MyViewModel by activityViewModels() // Obținerea ViewModel-ului legat de activitate

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

Dependențele necesare (de exemplu, module pentru furnizarea MyRepository) trebuie configurate în modulele Hilt.

// Exemplu de modul Hilt
@Module
@InstallIn(SingletonComponent::class) // Instalare în SingletonComponent
object RepositoryModule {

    @Provides
    @Singleton // Scope pentru singleton
    fun provideMyRepository(): MyRepository {
        return MyRepository() // Furnizarea unei instanțe de MyRepository
    }
}