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 performLogin
mé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
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.
laisse moi dire quelques mots