Sobes.tech
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
    }
}