Sobes.tech
Middle+

Kuidas injekteerida ViewModel Dagger Hilt abil?

sobes.tech AI

Vastus AI-lt

Kasutades @HiltViewModel annotatsiooni otse ViewModelis ja @ActivityRetainedScoped või @ViewModelScoped annotatsioone sõltuvustele, mis peavad kestma sama kaua kui ViewModel või aktiivsus. Sõltuvused injekteeritakse konstruktoriga @Inject annotatsiooniga.

// ViewModel defineerimine
@HiltViewModel
class MyViewModel @Inject constructor(
    private val myRepository: MyRepository // Sõltuvuse injekteerimine konstruktoriga
) : ViewModel() {
    // ViewModel'i loogika
}
// Sõltuvuse (Repository) defineerimine
@ActivityRetainedScoped // Näidisskala
class MyRepository @Inject constructor() {
    // Repositooriumi loogika
}

Activity või Fragment, ViewModel saadakse viewModels() või activityViewModels() delegaadi abil:

// Activity
@AndroidEntryPoint // Annotations Hilt komponentidele
class MyActivity : AppCompatActivity() {

    private val viewModel: MyViewModel by viewModels() // ViewModel saamine delegaadi kaudu

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // Kasutamine viewModel
    }
}
// Fragment
@AndroidEntryPoint // Annotations Hilt komponentidele
class MyFragment : Fragment() {

    private val viewModel: MyViewModel by viewModels() // Saadakse ViewModel selle fragmenti jaoks
    // või
    // private val activityViewModel: MyViewModel by activityViewModels() // Saadakse seotud aktiivsusega ViewModel

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

Vajalikud sõltuvused (näiteks moodulid, mis pakuvad MyRepository) peavad olema konfigureeritud Hilt moodulites.

// Hilt mooduli näide
@Module
@InstallIn(SingletonComponent::class) // Moodul installitud SingletonComponenti
object RepositoryModule {

    @Provides
    @Singleton // Näide sünkroniseeritud skoopist
    fun provideMyRepository(): MyRepository {
        return MyRepository() // Tagab MyRepository eksemplari
    }
}