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.
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
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
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.
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.