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" :
- déplacer la méthode de téléchargement de tous les fichiers du FTP hors de la classe.
- en faire une fonction int avec un paramètre int (je n'utilise pas le paramètre int ni le résultat)
- 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;
4 votes
StreamBuilder
est la solution correcte0 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 à utilisersetState()
à l'intérieur ?0 votes
Pensez également à FutyureBuilder, car il bloque une fois sur l'attente d'une méthode asynchrone ; alors que le modèle de construction de flux est une séquence continue d'événements non résolus.