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

Que dois-je mettre dans ma principale méthode

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

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 une méthode dans un fragment à partir d'un autre

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

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

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

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 parent à partir d'un objet compagnon dans kotlin

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

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

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

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

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

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

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

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

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

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?

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

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

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

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

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

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

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

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

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

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

TOP liste

  1. 1

    Comment insérer une valeur de variable dans la formule getpivotdata à l'aide de la macro Excel VBA

  2. 2

    Des résultats inattendus dans les discussions Java multi-malgré les verrous

  3. 3

    Comment appliquer un effet de flou sur une barre de navigation en css

  4. 4

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

  5. 5

    Comment puis-je faire fonctionner un effet de verre / flou CSS pour une superposition?

  6. 6

    Comment supprimer des mots d'un fichier texte en Python qui contiennent certaines lettres ?

  7. 7

    ERREUR 1054 (42S22): colonne inconnue 'marque' dans 'liste de champs'

  8. 8

    La connexion du conteneur FTP fonctionne avec docker-compose et non avec docker run

  9. 9

    Définir des URL pour la redirection vers une URL spécifique sans réécriture

  10. 10

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

  11. 11

    L'abonnement Python du kit AWS IoT SDK renvoie true mais le paramètre de rappel n'est pas appelé

  12. 12

    Impossible d'insérer des lignes et d'obtenir une contrainte de clé étrangère échoue

  13. 13

    Comment passer des paramètres d'URL lors de la redirection vers une autre URL?

  14. 14

    Python: exécutez plusieurs commandes dans CMD en une seule instance

  15. 15

    Comment faire une requête rapide vers une URL spécifique

  16. 16

    Authentification angulaire Laravel

  17. 17

    aucun opérateur ne correspond à ces opérandes ; les types d'opérandes sont : std::istream >> const char [5]

  18. 18

    Une erreur fatale s'est produite lors de la création des informations d'identification du client TLS. L'état d'erreur interne est 10013

  19. 19

    Apache XmlBeans NullPointerException

  20. 20

    JS : séparez les éléments du tableau et affichez les éléments individuels dans un tableau

  21. 21

    WebScrape - 獲取href

chaudétiquette

Archive