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
}
}