Sobes.tech
Middle+

Kaip įdiegti ViewModel naudojant Dagger Hilt?

sobes.tech AI

Atsakymas iš AI

Naudojant @HiltViewModel anotaciją pačioje ViewModel ir @ActivityRetainedScoped arba @ViewModelScoped anotacijas priklausomybėms, kurios turi gyvuoti tiek pat ilgai kaip ir ViewModel arba aktyvumas. Priklausomybės injekuojamos per konstruktorių su @Inject anotacija.

// ViewModel apibrėžimas
@HiltViewModel
class MyViewModel @Inject constructor(
    private val myRepository: MyRepository // Priklausomybės injekcija per konstruktorių
) : ViewModel() {
    // ViewModel logika
}
// Priklausomybės (Repository) deklaravimas
@ActivityRetainedScoped // Pavyzdinis srities pavyzdys
class MyRepository @Inject constructor() {
    // Saugyklos logika
}

Activity arba Fragment, ViewModel gaunamas naudojant viewModels() arba activityViewModels() delegatus:

// Activity
@AndroidEntryPoint // Anotacija Hilt komponentams
class MyActivity : AppCompatActivity() {

    private val viewModel: MyViewModel by viewModels() // Gauti ViewModel naudojant delegatą

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // Naudojimas viewModel
    }
}
// Fragment
@AndroidEntryPoint // Anotacija Hilt komponentams
class MyFragment : Fragment() {

    private val viewModel: MyViewModel by viewModels() // Gauti ViewModel šiam fragmentui
    // arba
    // private val activityViewModel: MyViewModel by activityViewModels() // Gauti aktyvumo susietą ViewModel

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

Reikalingos priklausomybės (pavyzdžiui, moduliai, teikiantys MyRepository) turi būti sukonfigūruotos Hilt moduliuose.

// Hilt modulės pavyzdys
@Module
@InstallIn(SingletonComponent::class) // Modulis įdiegtas SingletonComponent
object RepositoryModule {

    @Provides
    @Singleton // Sritis singletonui
    fun provideMyRepository(): MyRepository {
        return MyRepository() // Teikia MyRepository egzempliorių
    }
}