Class dans kotlin/ partage info

Salut à tous!
Je galère avec Android/kotlin, j’essaie de faire un truc je pense assez simple, mais je rencontre que des échecs.
J’essaie de ranger mon code, j’ai créer un fichier class, et dedans il y a des fonctions. je souhaite les appelé depuis les activités, mais quand j’écris:
var maClasse = maclasse()

je reçois un « null »
pourtant dans le code, quand j’écris maClasse.fonction, la fonction est bien trouvé.
L’app tourne en boucle sur la déclaration et plante…
De plus, impossible d’utiliser le getSharedPreference dans la class… Si quelqu’un peut me guider?
Je continue a chercher, mais je commence à désespérer

On aurait besoin de code

oui désolé: donc j’ai créer une class qui dois récupérer des infos sur Firebase puis les sauvegarder: (je met le code en gros il n’est pas écrit réellement comme dans mon code mais ce n’est pas ça le problème):

class gérerInfo {
var prénom = ""
var score = 0
ref.child("users")... 
fun recupererNom() {
ref.child("users")... 
prénom = 'résultat du ref'
}
}

le getSharedPreference ne fonctionne pas ici. impossible de l’utiliser, Android studio me dit qu’il ne connais pas.

Dans mon MainActivity, quand j’écris:

var mesInfos = gérerInfo()
mesInfos.récupererNom()
prénom = mesInfos.prénom

il me retourne les valeurs par défaut, comme si la fonction n’était pas appelé.
La class doit mal être déclarer, ou la méthode pour récupérer les infos de la class, mais je connais pas assez Android pour comprendre ce que je fais de mal. Si vous avez la solution :grinning_face_with_smiling_eyes:
Si jamais le code ne vous suffit pas, je peux vous envoyer le réel mais je voulais faire au plus simple.
MERCI D’AVANCE!!!

Je vais réecrire ta fonction

Le code pour récupérer le prenom

val inf = gereInfo()
val prenom = inf.recupererNom()

En fait il faut marquer return pour récupérer les données et mettre comme valeur de variable class.fonction qui returne quelque chose

d’accord donc en mettant return à chaque fin de fonction ça devrais « actualiser » sur le MainActivity? et pour le getSharedPreferences, pourquoi cela ne marche pas dans une class?
Juste pour être sur, la class j’ai créer un Kotlin class/file pour pouvoir mettre ce code la à part de mon code qui gère les Activity.

Merci en tout cas pour t’as réponse ultra rapide!

Non tu met return que quand tu veut récupérer une donnée et la stocker dans une variable tu dois rajouter a ta classe : le type de la donnée que tu renvoie

Non ce n’est pas parce que tu l’a mis dans un class/file

D’accord je vais essayer tout ça!! merci de ton aide!

Bon pour le return ok j’ai compris ça fonctionne maintenant :blush:
Mais maintenant pour faire la sauvegarde avec le getShared, comment ça fonctionne dans la class? Quand j’écris:
val read = getSharedPreferences(« com », MODE_PRIVATE)

android me demande de créer la fonction. Si j’accepte il me demande:
private fun getSharedPreferences(s: String, modePrivate: Int): Any {
}

Pourquoi il n’ont pas fait comme dans les activités!

bon même le return ne fonctionne pas comme il faut, il me renvoi les données que de temps en temps… je met un (gros) bout du code pour que tu comprennes ce que j’essaie de faire… les fonctions doivent être appeler depuis n’importe quel activités, pour actualiser les points etc, les variables doivent être a jour pour quand une activité demande l’info…
Sur Xcode en faisant ça, tout fonctionne, mais Android non, et je ne comprend pas pourquoi.

class gérerInfo {
var pieceJoueur = 0
var gradeJoueur = 0
var pointJoueur = 0
var pointGagnerChasse = 0
var pieceGagnerChasse = 0
var pubAccepter = true
var prénomJoueur = « bob »
var niveauJoueur = «  »
var jeu = pagePrincipal()

fun infoJoueur() {
    auth = FirebaseAuth.getInstance()
    database = FirebaseDatabase.getInstance()
    val user = auth.currentUser
    val ref = database?.reference!!

    ref.child("users").child(user?.uid!!).addListenerForSingleValueEvent(object :
        ValueEventListener {
        override fun onDataChange(snapshot: DataSnapshot) {
            prénomJoueur = snapshot.child("prénom").value.toString()
            pieceJoueur = snapshot.child("pièces").value.toString().toInt()
            gradeJoueur = snapshot.child("grade").value.toString().toInt()
            pointJoueur = snapshot.child("points").value.toString().toInt()
            niveauJoueur = snapshot.child("niveau").value.toString()
            pubAccepter = snapshot.child("pubAccepter").value.toString().toBoolean()
            jeu.save.putString("prénomJoueur", prénomJoueur).apply()
            jeu.save.putInt("pièceJoueur", pieceJoueur).apply()
            jeu.save.putInt("gradeJoueur", gradeJoueur).apply()
            jeu.save.putInt("pointJoueur", pointJoueur).apply()
            jeu.save.putString("niveauJoueur", niveauJoueur).apply()
            jeu.save.putBoolean("pubAccepter", pubAccepter).apply()
            conversionPointEnGrade()
            récupérerPointChasseCreer()

        }

        override fun onCancelled(error: DatabaseError) {
        }
    })

}


fun sauvegarderInfoJoueur() {
    auth = FirebaseAuth.getInstance()
    database = FirebaseDatabase.getInstance()
    val user = auth.currentUser
    val ref = database?.reference!!
    prénomJoueur = jeu.read.getString("prénomJoueur", "No imported").toString()
    pieceJoueur = jeu.read.getInt("pièceJoueur", 0)
    gradeJoueur = jeu.read.getInt("gradeJoueur", 0)
    pointJoueur = jeu.read.getInt("pointJoueur", 0)
    niveauJoueur = jeu.read.getString("niveauJoueur", "").toString()
    pubAccepter = jeu.read.getBoolean("pubAccepter", true)

    ref.child("users").child(user?.uid!!).child("pièces").setValue(pieceJoueur)
    ref.child("users").child(user?.uid!!).child("points").setValue(pointJoueur)
    ref.child("users").child(user?.uid!!).child("grade").setValue(gradeJoueur)
    ref.child("users").child(user?.uid!!).child("pubAccepter").setValue(pubAccepter)
    ref.child("users").child(user?.uid!!).child("niveau").setValue(niveauJoueur)


}


fun ajoutPiècesJoueur(pièceGagner: Int) {
    pieceJoueur = jeu.read.getInt("pièceJoueur", 0)
    pieceJoueur += pièceGagner
    jeu.save.putInt("pièceJoueur", pieceJoueur).apply()

    sauvegarderInfoJoueur()
}

fun ajoutPointJoueur(pointGagner: Int) {
    pointJoueur = jeu.read.getInt("pointJoueur", 0)
    pointJoueur += pointGagner
    jeu.save.putInt("pointJoueur", pointJoueur).apply()
    conversionPointEnGrade()
    sauvegarderInfoJoueur()

}

fun ajoutGradeJoueur(gradeGagner: Int) {
    gradeJoueur = jeu.read.getInt("gradeJoueur", 0)
    gradeJoueur += gradeGagner
    jeu.save.putInt("pointJoueur", pointJoueur).apply()
    niveauDuJoueur()
    sauvegarderInfoJoueur()

}


fun achatSupprimerPub() {
    auth = FirebaseAuth.getInstance()
    database = FirebaseDatabase.getInstance()
    val user = auth.currentUser
    val ref = database?.reference!!
    jeu.save.putBoolean("pubAccepter", true).apply()
    ref.child("users").child(user?.uid!!).child("pubAccepter").setValue(false)
    ref.child("users").child(user?.uid!!).child("paiement").child("supprimerPub")
        .setValue("$formatted + paiement pub supprimer")
    pubAccepter = false


}

fun achatPièces(nombrePieceAcheter: Int) {
    auth = FirebaseAuth.getInstance()
    database = FirebaseDatabase.getInstance()
    val user = auth.currentUser
    val ref = database?.reference!!
    pieceJoueur = jeu.read.getInt("pièceJoueur", 0)
    pieceJoueur += nombrePieceAcheter
    jeu.save.putInt("pièceJoueur", pieceJoueur).apply()
    ref.child("users").child(user?.uid!!).child("pièces").setValue(pieceJoueur)
    ref.child("users").child(user?.uid!!).child("paiement").child("achatPièces")
        .child("Le $formatted").setValue("Achat de $nombrePieceAcheter pièces")

}


fun récupérerPointChasseCreer() {
    database = FirebaseDatabase.getInstance()
    val ref = database?.reference!!

    ref.child("JoueurInscrit").child("prénom").child(prénomJoueur).child("pointObtenuChasse")
        .addListenerForSingleValueEvent(object :
            ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {
                pointGagnerChasse = snapshot.child("points").value.toString().toInt()
                pieceGagnerChasse = snapshot.child("pièces").value.toString().toInt()
                jeu.read.getInt("pointGagnerChasse", pointGagnerChasse)
                jeu.read.getInt("pieceGagnerChasse", pieceGagnerChasse)

            }

            override fun onCancelled(error: DatabaseError) {
            }
        })


}


fun supprimerPointChasseCreer() {
    database = FirebaseDatabase.getInstance()
    val ref = database?.reference!!
    ref.child("JoueurInscrit").child("prénom").child(prénomJoueur).child("pointObtenuChasse")
        .child("points").removeValue()
    ref.child("JoueurInscrit").child("prénom").child(prénomJoueur).child("pointObtenuChasse")
        .child("pièces").removeValue()
}


fun conversionPointEnGrade() {

    pointJoueur = jeu.read.getInt("pointJoueur", 0)
    gradeJoueur = jeu.read.getInt("gradeJoueur", 0)

    if (gradeJoueur >= 100 && pointJoueur >= 15000) {
        gradeJoueur += 1
        pointJoueur -= 15000
        jeu.save.putInt("gradeJoueur", 0).apply()
        jeu.save.putInt("pointJoueur", 0).apply()
        conversionPointEnGrade()
    }
    if (gradeJoueur >= 80 && gradeJoueur <= 99 && pointJoueur >= 10000) {
        gradeJoueur += 1
        pointJoueur -= 10000
        jeu.save.putInt("gradeJoueur", 0).apply()
        jeu.save.putInt("pointJoueur", 0).apply()
        conversionPointEnGrade()
    }
    if (gradeJoueur >= 70 && gradeJoueur <= 79 && pointJoueur >= 6000) {
        gradeJoueur += 1
        pointJoueur -= 6000
        jeu.save.putInt("gradeJoueur", 0).apply()
        jeu.save.putInt("pointJoueur", 0).apply()
        conversionPointEnGrade()
    }
    if (gradeJoueur >= 50 && gradeJoueur <= 69 && pointJoueur >= 5000) {
        gradeJoueur += 1
        pointJoueur -= 5000
        jeu.save.putInt("gradeJoueur", 0).apply()
        jeu.save.putInt("pointJoueur", 0).apply()
        conversionPointEnGrade()
    }
    if (gradeJoueur >= 30 && gradeJoueur <= 49 && pointJoueur >= 3000) {
        gradeJoueur += 1
        pointJoueur -= 3000
        jeu.save.putInt("gradeJoueur", 0).apply()
        jeu.save.putInt("pointJoueur", 0).apply()
        conversionPointEnGrade()
    }
    if (gradeJoueur >= 20 && gradeJoueur <= 29 && pointJoueur >= 2000) {
        gradeJoueur += 1
        pointJoueur -= 2000
        jeu.save.putInt("gradeJoueur", 0).apply()
        jeu.save.putInt("pointJoueur", 0).apply()
        conversionPointEnGrade()
    }

    if (gradeJoueur >= 11 && gradeJoueur <= 19 && pointJoueur >= 1500) {
        gradeJoueur += 1
        pointJoueur -= 1500
        jeu.save.putInt("gradeJoueur", 0).apply()
        jeu.save.putInt("pointJoueur", 0).apply()
        conversionPointEnGrade()
    }

    if (gradeJoueur >= 4 && gradeJoueur <= 10 && pointJoueur >= 1000) {
        gradeJoueur += 1
        pointJoueur -= 1000
        jeu.save.putInt("gradeJoueur", 0).apply()
        jeu.save.putInt("pointJoueur", 0).apply()
        conversionPointEnGrade()
    }

    if (gradeJoueur >= 0 && gradeJoueur <= 3 && pointJoueur >= 500) {
        gradeJoueur += 1
        pointJoueur -= 500
        jeu.save.putInt("gradeJoueur", 0).apply()
        jeu.save.putInt("pointJoueur", 0).apply()
        conversionPointEnGrade()
    } else {
        sauvegarderInfoJoueur()
        niveauDuJoueur()
    }

}

et sur les activités, j’appelle les fonctions, par exemple gérerInfo.infoJoueur() ou gérerInfo.ajoutGradeJoueur(3) etc. mais les variables quand elles sont appelé sont toujours celle par défaut, et le getSharedPréference ne marche pas…

As tu une erreur de compil

Non aucune erreur de compilation, mais quand je la lance, elle crash car une boucle ce créer sur 'var gérerInfo = gererInfoJoueur() ’ dans l’activité

Est-ce que c’est la première fois que tu lance l’emulateur si tu l’as lancer plusieurs fois est ce que cela marchait avant

C’est quoi ta fonction niveaudujoueur()
Peut-être que dans ta fonction

Dans les conditions de la fonction la condition relance ta fonction en boucle

Bien vu, il est louche ce code. La fonction conversionPointEnGrade() s’appelle elle-même, cas idéal pour planter une application !

Les fonctions récursives sont toujours dangereuses.

Désolé je n’est pas pu me connecter avant. Pour l’émulateur, ça plante depuis que j’essaie de mettre ça en place, avant sur l’app je devais récupérer ces infos à quasiment chaque activités, du coup je voulais mettre ça dans une class pour appeler certaines infos moins souvent. La boucle ce créer vraiment sur l’activité quand je lui dit ou trouver l’info qu’il à besoin: val gérerInfo = gererInfoJoueur()

pour la fonction pointEnGrade() je n’est pas eu d’autre idée pour arriver à faire cela… les points sont déduit pour augmenter le grade du joueur… et il y a plusieurs paliers du coup elles ce rappelle elle même jusqu’à ce que plus aucune condition soit rempli… Je n’est peut être pas eu la bonne logique, mais du coté de Xcode ça fonctionne sans problème sur cette fonction.

Je vais effacer tout ça et reprendre à zéro voir étape par étape ou cela plante.

pour le getSharedPreference, il attend un contexte, mais dans une class comment on fait du coup? je veux l’appeler à l’intérieur de cette class… j’ai vraiment du mal désolé! :grinning_face_with_smiling_eyes:

Tu peut faire sa

d’accord, j’avais essayé mais j’avais des bugs c’est peut-être pour ça que ça n’a pas marché. je vais réessayer quand j’aurais fini de refaire tout cette parti du code…

Allez une dernière question et j’arrête :grinning_face_with_smiling_eyes: J’ai donc une fonction qui récupère les données sur Firebase qui est dans la class. une autre qui affiche ces informations, qui est dans le mainActivity. Seulement elle ce lance avant que les données n’arrivent. j’ai mis un Handler().postDelayed({ chargerInfo()}, 1000) et ça fonctionne très bien, mais il n’y a pas une façon de voir quand elle à fini, ou quand une donnée change? j’ai essayer en mettant un return, mais la fonction s’appelle plusieurs fois (seule cette fois, c’est pas moi qui lui demande :grinning_face_with_smiling_eyes: ) du coup le return passe avant que les infos ce charge…

Tu devrais créer un autre post pour cette question. L’idée est d’avoir un post par question, afin que les gens puissent parcourir rapidement les sujets à la recherche d’une réponse à un problème précis. un forum c’est un lieu d’échange, mais aussi une base de données de problèmes résolus.

Pour en revenir à ton problème ce n’est pas simple. C’est de l’asynchrone, donc les données arrivent quand elles veulent, en fonction des fluctuations des flux d’informations sur internet.

Penche-toi sur la gestion des processus asynchrones sur kotlin. Je n’ai pas de code à te donner, n’ayant pas touché à Kotlin depuis plus de 3 ans, et n’étant pas allé jusqu’à là quand j’étudiais ce langage.

En simplifiant, un processus asynchrone utilise un callback, un appel de fonction pour indiquer à l’application qu’une tâche en arrière plan est terminée.