Middle+
Dagger Hilt yordamida ViewModel ni qanday in'ektsiya qilish mumkin?
sobes.tech AI
AIdan javob
@HiltViewModel anotatsiyasi bilan ViewModel uchun va @ActivityRetainedScoped yoki @ViewModelScoped anotatsiyalari bilan ViewModel yoki faoliyat bilan birga yashash kerak bo'lgan bog'liqliklar uchun. Bog'liqliklar @Inject anotatsiyasi bilan konstruktor orqali injektsiya qilinadi.
// ViewModel ta'rifi
@HiltViewModel
class MyViewModel @Inject constructor(
private val myRepository: MyRepository // Konstruktor orqali bog'liqlikni injektsiya qilish
) : ViewModel() {
// ViewModel mantiqi
}
// Bog'liqlik (Repository) e'lon qilish
@ActivityRetainedScoped // Misol uchun scope
class MyRepository @Inject constructor() {
// Repository mantiqi
}
Activity yoki Fragmentda, ViewModel viewModels() yoki activityViewModels() delegatlari yordamida olinadi:
// Activityda
@AndroidEntryPoint // Hilt komponentlari uchun anotatsiya
class MyActivity : AppCompatActivity() {
private val viewModel: MyViewModel by viewModels() // Delegat yordamida ViewModel olish
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// viewModeldan foydalanish
}
}
// Fragmentda
@AndroidEntryPoint // Hilt komponentlari uchun anotatsiya
class MyFragment : Fragment() {
private val viewModel: MyViewModel by viewModels() // Bu fragment uchun ViewModel olish
// yoki
// private val activityViewModel: MyViewModel by activityViewModels() // Faoliyat bilan bog'langan ViewModel
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// viewModeldan foydalanish
}
}
Kerakli bog'liqliklar (masalan, MyRepository ta'minlovchi modullar) Hilt modullarida sozlanishi kerak.
// Hilt moduli misoli
@Module
@InstallIn(SingletonComponent::class) // SingletonComponentga modul o'rnatish
object RepositoryModule {
@Provides
@Singleton // Singleton uchun scope misoli
fun provideMyRepository(): MyRepository {
return MyRepository() // MyRepository nusxasini taqdim etish
}
}