dois-je toujours appeler ma méthode dans viewmodel à partir d'un fragment/activité ?

Alexa289

donc je suis nouveau dans le modèle MVVM sous Android. Je souhaite effectuer deux actions, lorsqu'un bouton est cliqué, je vérifie d'abord la connexion Internet, si la connexion Internet est disponible, puis connectez-vous au serveur.

voici mon ViewModel

class LoginViewModel(application: Application) : AndroidViewModel(application) {


    private val _hasInternetConnection = MutableLiveData(false)
    val hasInternetConnection: LiveData<Boolean>
        get() = _hasInternetConnection


    fun checkIfItHasInternetConnection() {

        if (InternetConnection.checkConnection(getApplication())) {
            _hasInternetConnection.value = true
        } else {
            _hasInternetConnection.value = false

        }

    }

    fun performLogin() {

    }



}

et voici mon fragment

class LoginFragment : Fragment() {

    lateinit var model: LoginViewModel

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        model = ViewModelProvider(this).get(LoginViewModel::class.java)

        button.setOnClickListener {
            model.checkIfItHasInternetConnection()
        }

        model.hasInternetConnection.observe(this, Observer { hasInternetConnection ->

            if (!hasInternetConnection) {
                longToast("You have no internet connection")
            } else {

            }

        })



    }


}

Le problème est que je ne sais pas où dois-je appeler la performLoginméthode depuis mon modèle de vue, dois-je l'appeler dans mon fragment comme ceci dans l'observateur ?

model.hasInternetConnection.observe(this, Observer { hasInternetConnection ->

            if (!hasInternetConnection) {
                longToast("You have no internet connection")
            } else {
                model.performLogin()
            }

 })

ou dois-je l'appeler dans le viewmodel lui-même après avoir vérifié la connexion Internet ? comme ça

// inside viewModel
fun checkIfItHasInternetConnection() {

        if (InternetConnection.checkConnection(getApplication())) {
            _hasInternetConnection.value = true
            performLogin()
        } else {
            _hasInternetConnection.value = false

        }

    }

désolé si la question est trop basique, j'essaie d'apprendre MVVM, et d'après les tutoriels que je regarde, il semble que je doive appeler la méthode dans viewModel à partir du fragment, mais ce sera plus pratique si je l'appelle depuis le viewmodel lui-même. J'ai besoin de connaître la bonne façon de résoudre un cas comme celui-ci

Sébu

Je vous suggère de jeter un œil au Guide du développeur Android pour l'architecture d'applications . Il est basé sur l'architecture MVVM et introduit un référentiel qui gère les appels Web. Peut-être que cela vous aidera.

Mais pour répondre à votre question : suivant une architecture MVVM claire, l'activité ne doit appeler qu'une méthode dans le ViewModel et ne faire aucune logique. Cette méthode dans le ViewModel doit alors soit faire la logique, soit déléguer plus loin au modèle, ou, par exemple, un référentiel.

Si la connexion ne peut pas être effectuée en raison d'une connexion Internet manquante, le ViewModel doit gérer cela en définissant des LiveData, peut LiveData<String> errorMessage- être , et l'activité doit observer ces LiveData et afficher un message à l'utilisateur chaque fois que ces LiveData fournissent une nouvelle chaîne.

Edit : quelques exemples de code.

Dépôt:

public void performLogin(String username, String password, MutableLiveData<LoginStatus> loginStatus) {
  if (/*check Internet access*/) {
    performLoginAsync(username, password, loginStatus);
  } else {
    loginStatus.setValue(LoginStatus.NO_INTERNET);
  }
}
private void performLoginAsync(String username, String password, MutableLiveData<LoginStatus> loginStatus) {
  /*perform async login with success and error callback*/
  myWebservice.login(
    username,
    password,
    () -> loginStatus.setValue(LoginStatus.SUCCESS), /*success callback*/
    error -> loginStatus.setValue(LoginStatus.ERROR) /*error callback*/
  );
}

Afficher le modèle :

public MutableLiveData<LoginStatus> loginStatus;
private Repository myRepository;
public void performLogin(String username, String password) {
  myRepository.performLogin(username, password, loginStatus);
}

Fragment:

private ViewModel myViewModel;
private EditText loginUsername, loginPassword;
private Button loginButton;

/* in some method, where you want your initialization, e.g. in onViewCreated */
  loginButton.setOnClickListener(v -> {
    myViewModel.login(loginUsername.getText().toString(), loginPassword.getText().toString());
  });
  myViewModel.loginStatus.observe(this, loginStatus -> Toast.makeText(this, loginStatus.getText(), Toast.LENGTH_LONG));

Ce code n'est pas un exemple fonctionnel, mais il devrait en contenir la majeure partie et devrait vous orienter dans la bonne direction. J'espère que ça aide. Si quelque chose n'est pas clair, faites un autre commentaire

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

Appeler une méthode dans une page CORE Razor à partir d'un ViewModel

Comment appeler une méthode à partir d'un autre ViewModel dans une vue (WPF)

Où dois-je configurer mon algorithme avant d'appeler sa méthode dans un pilote?

Comment puis-je appeler une méthode parent à partir d'un objet compagnon dans kotlin

Comment dois-je appeler ma fonction dans la méthode map ?

Dois-je effectuer un transtypage avant d'appeler une méthode héritée

Dois-je masquer les importations de dépendances dans un module python à partir de la méthode __dir__?

C# Comment puis-je appeler une méthode d'interface à partir de ma classe dérivée

Comment puis-je appeler une méthode qui se trouve à l'intérieur d'un UIViewController intégré dans un conteneur à partir d'un UIViewController parent?

Que dois-je mettre dans ma principale méthode

swift - puis-je appeler une structure par défaut memberwise init à partir de ma méthode init personnalisée?

Vue - comment puis-je appeler une autre méthode à partir d'un rappel ?

Comment appeler la méthode d'un composant enfant à partir d'un composant parent dans React

appeler la méthode d'instance à partir d'un composant d'ordre supérieur dans react

Comment appeler une méthode dans une classe avec état à partir d'un constructeur dans Flutter

Comment puis-je exécuter correctement une méthode asynchrone à partir d'un ViewModel?

Comment appeler une méthode à partir d'un fichier JS dans un composant angulaire

Appeler une méthode dans un fragment à partir d'un autre

Comment appeler une méthode dans un composant enfant à partir d'un composant parent?

Comment appeler une méthode de composant à partir d'un événement d'application dans nativescript

Dans ma classe, je dois créer une méthode pour trouver plusieurs nombres maximum dans un tableau C#

existe-t-il un moyen d'appeler la méthode onClick à l'intérieur d'une fonction, que dois-je passer à la méthode dans les paramètres?

Comment puis-je appeler une méthode dans un moteur de rendu d'image de base à partir du moteur de rendu personnalisé iOS?

Pourquoi ne puis-je pas appeler une méthode protégée à partir d'une classe héritée dans un autre package en Java?

Appeler la méthode à partir d'un autre composant dans Vue.js

Comment appeler une méthode à partir d'un collecteur dans Java 8 Streaming?

Comment appeler une méthode dans Golang à partir d'un package différent

Comment appeler une méthode dans Activity à partir d'un CustomAdapter

Appeler une méthode dans une autre classe à partir d'un fichier CSHTML

TOP liste

  1. 1

    L'application React Native ne répond pas au démarrage si le débogueur n'est pas connecté

  2. 2

    Liens dynamiques Firebase | Les liens courts ne s'ouvriront pas directement sur mobile

  3. 3

    Comment calculer l'aire de l'intersection de deux cercles ?

  4. 4

    Fonction de puissance en Java

  5. 5

    Comment changer la couleur de fond d'une seule cellule dans un notebook / jupyterlab jupyter?

  6. 6

    Comment obtenir l'image actuelle dans un flux en direct avec python et opencv ?

  7. 7

    Comment définir la couleur de l'intersection dans un diagramme de Venn?

  8. 8

    Comment résoudre "Erreur fatale PHP: Inconnu: échec de l'ouverture requise"

  9. 9

    mauvaise valeur pour le type long: - Postgresql, Hibernate, Spring

  10. 10

    comment calculer la somme totale et le nombre maximal d'écrans utilisés dans power bi?

  11. 11

    "Le service xxx a une dépendance sur un service inexistant" ce qui ne semble pas vrai?

  12. 12

    Erreurs d'arrondi possibles en Python?

  13. 13

    Échec de l'exécution de 'insertBefore' sur 'Node': le paramètre 1 n'est pas de type 'Node'

  14. 14

    Utilisation du modèle de référentiel lors de l'utilisation des méthodes async / await Asp.NET MVC5 EF

  15. 15

    Nextcloud avec Docker: impossible de créer ou d'écrire dans le répertoire de données

  16. 16

    Ignorer les valeurs négatives de Java Arraylist pour les calculs

  17. 17

    Comment accélérer la lecture du fichier DBF vers Dataframe en PYTHON ?

  18. 18

    Changer la connexion / nom d'utilisateur GIT dans IntelliJ IDEA, WebStorm, RubyMine, etc.

  19. 19

    Comment vérifier les dépendances entre les fichiers Jar?

  20. 20

    Animation CSS - Effet de gonflement

  21. 21

    Pandas - Remplacer la valeur de ligne du calcul dérivé

chaudétiquette

Archive