Sobes.tech
Middle+

Πώς να ενέσεις ViewModel με το Dagger Hilt;

sobes.tech AI

Απάντηση από AI

Με τη χρήση της σημείωσης @HiltViewModel για το ίδιο το ViewModel και @ActivityRetainedScoped ή @ViewModelScoped για τις εξαρτήσεις που πρέπει να ζουν όσο και το ViewModel ή η δραστηριότητα. Οι εξαρτήσεις εγχύονται μέσω του κατασκευαστή με τη σημείωση @Inject.

// Ορισμός του ViewModel
@HiltViewModel
class MyViewModel @Inject constructor(
    private val myRepository: MyRepository // Εγχείρηση εξάρτησης μέσω κατασκευαστή
) : ViewModel() {
    // Λογική του ViewModel
}
// Δήλωση της εξάρτησης (Repository)
@ActivityRetainedScoped // Παράδειγμα scope
class MyRepository @Inject constructor() {
    // Λογική του repository
}

Στην Activity ή το Fragment, το ViewModel λαμβάνεται μέσω του delegate viewModels() ή activityViewModels():

// Στην Activity
@AndroidEntryPoint // Σημείωση για τα components του Hilt
class MyActivity : AppCompatActivity() {

    private val viewModel: MyViewModel by viewModels() // Απόκτηση ViewModel μέσω delegate

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // Χρήση του viewModel
    }
}
// Στο Fragment
@AndroidEntryPoint // Σημείωση για τα components του Hilt
class MyFragment : Fragment() {

    private val viewModel: MyViewModel by viewModels() // Απόκτηση ViewModel για αυτό το fragment
    // ή
    // private val activityViewModel: MyViewModel by activityViewModels() // Απόκτηση ViewModel που σχετίζεται με την δραστηριότητα

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // Χρήση του viewModel
    }
}

Οι απαραίτητες εξαρτήσεις (π.χ. modules για την παροχή του MyRepository) πρέπει να διαμορφωθούν στα modules του Hilt.

// Παράδειγμα module του Hilt
@Module
@InstallIn(SingletonComponent::class) // Εγκατάσταση στο SingletonComponent
object RepositoryModule {

    @Provides
    @Singleton // Scope για singleton
    fun provideMyRepository(): MyRepository {
        return MyRepository() // Παροχή μιας στιγμιότυπου του MyRepository
    }
}