web-dev-qa-db-fra.com

Comment partager la même instance de viewModel entre les activités utilisant koin di?

J'utilise Koin bibliothèque à Kotlin pour DI

Koin fournissant by viewmodel() pour obtenir une instance de viewModel by sharedViewModel() pour obtenir la même instance dans des fragments.

Comment puis-je obtenir le même exemple de la vue dans les activités? Je n'ai trouvé aucun moyen de y parvenir.

7
Sahil Arora

Après une recherche ou une discussion sur le niveau de l'architecture et signaler ainsi que Github Koin, j'ai trouvé une solution à cet égard dans ce scénario, nous devons enregistrer cet état/données dans le référentiel que nous devons partager entre plusieurs activités non dans la fenêtre et deux ou plus. Différentes images de vue peuvent accéder aux mêmes états/données enregistrés en une seule instance de référentiel

see here

0
Sahil Arora

vous devez en savoir plus sur ViewModel pour mieux le comprendre. https://developer.andrid.com/topic/libries/architecture/viewmodel

ViewModel est connecté à votre Activity

vous pouvez donc partager vos activités ViewModel uniquement entre son Fragments,

c'est ce que signifie sharedViewModel in koin

sharedViewModel est le même si vous utilisez ViewModel Factory avec le même context.

partage des données entre Activities peut être effectuée via Intent, il n'y a pas une autre solution à Android,

ou vous pouvez garder quelques static / global Données et partagez-la entre Activities

1
Hayk Melkonyan

Je suggérerais de faire l'application A ViewModelStoreOwner et d'injection des images de vue en utilisant comme propriétaire de l'application. Le code requis ressemblerait à cela

class App : Application(), ViewModelStoreOwner {
    private val mViewModelStore = ViewModelStore()

    override fun getViewModelStore(): ViewModelStore {
        return mViewModelStore
    }
}

Vous pouvez définir des extensions pour injecter facilement les images de vue


val Context.app: App
    get() = applicationContext as App

inline fun <reified T : ViewModel> Context.appViewModel(
    qualifier: Qualifier? = null,
    noinline state: BundleDefinition? = null,
    noinline parameters: ParametersDefinition? = null
): Lazy<T> {
    return lazy(LazyThreadSafetyMode.NONE) {
        GlobalContext.get().getViewModel(qualifier, state, { ViewModelOwner.from(app, null) }, T::class, parameters)
    }
}

inline fun <reified T : ViewModel> Fragment.appViewModel(
    qualifier: Qualifier? = null,
    noinline state: BundleDefinition? = null,
    noinline parameters: ParametersDefinition? = null
): Lazy<T> {
    return lazy(LazyThreadSafetyMode.NONE) {
        GlobalContext.get().getViewModel(qualifier, state, { ViewModelOwner.from(requireContext().app, null) }, T::class, parameters)
    }
}

Vous pouvez ensuite injecter votre viewModel comme celui-ci

class MainActivity : AppCompatActivity() {
    private val mAppViewModel: AppViewModel by appViewModel()
}

L'avantage de cette solution est que vous n'avez pas besoin de recréer le modèle d'affichage et si vous décidez de sauvegarder l'état entre les redémarrages de l'application, vous pouvez facilement rendre l'application SavedStateRegistryOwner aussi et utiliser le SavedStateHandle enregistrer/restaurer votre état de l'intérieur de la vue, étant maintenant lié au cycle de vie du processus.

0
Catalin

tu dois utiliser single{} à la place de viewModel{} Dans la déclaration du module.

single { SharedViewModel() }

Et vous devez utiliser Inject () au lieu de ViewModel () à votre vue.

private val viewModel: SharedViewModel by inject()

Vous obtiendrez donc une seule vue de vue pour chaque vue.

0
Özer Özcan