133 votes

Existe-t-il un moyen de charger des données asynchrones sur la méthode InitState ?

Je suis à la recherche d'un moyen de charger des données asynchrones sur la méthode InitState, j'ai besoin de certaines données avant l'exécution de la méthode de construction. J'utilise un code GoogleAuth, et je dois exécuter la méthode de construction jusqu'à ce qu'un Stream soit exécuté.

Ma méthode initState est :

 @override
  void initState () {
    super.initState();
    _googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount account)     {
      setState(() {
        _currentUser = account;
      });
    });
    _googleSignIn.signInSilently();
  }

J'apprécierai tout commentaire.

4 votes

StreamBuilder est la solution correcte

0 votes

Ce code est absolument parfait tel quel ?

1 votes

Depuis initState() n'est appelé qu'une seule fois, y a-t-il un intérêt à utiliser setState() à l'intérieur ?

-1voto

amirzolal Points 78

Je suis venu ici parce que j'avais besoin d'aller chercher des fichiers sur le FTP au démarrage du programme. Mon projet est une application de bureau flutter. Le thread principal télécharge le dernier fichier ajouté au serveur FTP, le décrypte et affiche le contenu crypté, cette méthode est appelée depuis initState(). Je voulais que tous les autres fichiers soient téléchargés en arrière-plan après l'affichage de l'interface graphique.

Aucune des méthodes mentionnées ci-dessus n'a fonctionné. La construction d'un isolat est relativement complexe.

Le moyen le plus simple était d'utiliser la méthode "compute" :

  1. déplacer la méthode de téléchargement de tous les fichiers du FTP hors de la classe.
  2. en faire une fonction int avec un paramètre int (je n'utilise pas le paramètre int ni le résultat)
  3. l'appeler depuis la méthode initState()

De cette façon, l'interface graphique s'affiche et le programme télécharge les fichiers en arrière-plan.

  void initState() {
    super.initState();
    _retrieveFileList(); // this gets the first file and displays it
    compute(_backgroundDownloader, 0); // this gets all the other files so that they are available in the local directory
  }

int _backgroundDownloader(int value) {
  var i = 0;
  new Directory('data').createSync();
  FTPClient ftpClient = FTPClient('www.guckguck.de',
      user: 'maxmusterman', pass: 'maxmusterpasswort');
  try {
    ftpClient.connect();
    var directoryContent = ftpClient.listDirectoryContent();
    // .. here, fileNames list is reconstructed from the directoryContent

    for (i = 0; i < fileNames.length; i++) {
      var dirName = "";
      if (Platform.isLinux)
        dirName = 'data/';
      else
        dirName = r'data\';
      var filePath = dirName + fileNames[i];
      var myDataFile = new File(filePath);
      if (!myDataFile.existsSync())
        ftpClient.downloadFile(fileNames[i], File(filePath));
    }
  } catch (err) {
    throw (err);
  } finally {
    ftpClient.disconnect();
  }
  return i;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X