More
Comment utiliser des isolats dans Flutter avec Back4app pour gérer le traitement intensif des données
13 min
introduction flutter est un framework puissant pour créer des applications multiplateformes, mais comme de nombreux frameworks mobiles, il exécute tout le code sur un seul thread par défaut ce thread, connu sous le nom de thread ui, est responsable du rendu de l'interface utilisateur de votre application lorsque des tâches lourdes comme le traitement de données ou la gestion de fichiers se produisent sur le thread ui, elles peuvent provoquer un retard ou un "jank" dans l'application, entraînant une mauvaise expérience utilisateur pour y remédier, dart propose une fonctionnalité appelée isolates les isolates vous permettent d'exécuter des calculs coûteux sur un thread séparé, gardant ainsi votre interface utilisateur réactive dans ce tutoriel, nous allons explorer comment utiliser les isolates dans une application flutter pour gérer des tâches de traitement de données lourdes, telles que la désérialisation de grands fichiers json récupérés d'un backend back4app prérequis pour compléter ce tutoriel, vous aurez besoin de un compte back4app inscrivez vous pour un compte gratuit sur back4app com https //www back4app com un environnement de développement flutter configuré sur votre machine locale suivez le guide d'installation de flutter https //flutter dev/docs/get started/install si vous ne l'avez pas encore configuré connaissances de base en dart, widgets flutter et programmation asynchrone étape 1 – configuration de votre backend back4app créer un projet back4app connectez vous à votre compte back4app https //www back4app com/ et créez un nouveau projet créer des classes parse pour ce tutoriel, créez une classe parse nommée record qui stocke de grandes quantités de données titre (string) le titre de l'enregistrement description (string) une description de l'enregistrement métadonnées (json) contenu de métadonnées volumineux associé à l'enregistrement remplir la classe avec des données d'exemple ajoutez plusieurs enregistrements à la record classe avec de grands objets json dans le champ métadonnées cela simulera le type de traitement de données qui pourrait provoquer des ralentissements dans une application réelle obtenez vos identifiants back4app accédez aux paramètres de votre projet pour récupérer votre id d'application et votre clé client, dont vous aurez besoin pour connecter votre application flutter à back4app étape 2 – configuration de votre projet flutter créer un nouveau projet flutter ouvrez votre terminal ou invite de commande et exécutez flutter create isolate example ajouter des dépendances ouvrez pubspec yaml et ajoutez les dépendances suivantes dependencies flutter sdk flutter parse server sdk flutter latest version exécutez flutter pub get pour installer ces dépendances initialiser parse dans votre application dans lib/main dart , importez le sdk parse et initialisez le dans la fonction main import 'package\ flutter/material dart'; import 'package\ parse server sdk flutter/parse server sdk flutter dart'; void main() async { widgetsflutterbinding ensureinitialized(); const keyapplicationid = 'your back4app app id'; const keyclientkey = 'your back4app client key'; const keyparseserverurl = 'https //parseapi back4app com'; await parse() initialize(keyapplicationid, keyparseserverurl, clientkey keyclientkey, autosendsessionid true); runapp(myapp()); } class myapp extends statelesswidget { @override widget build(buildcontext context) { return materialapp( home recordscreen(), ); } } remplacez 'your back4app app id' et 'your back4app client key' par vos véritables identifiants back4app étape 3 – récupération des données depuis back4app créez le widget recordscreen dans lib/main dart , créez un nouvel écran qui récupère des données depuis back4app class recordscreen extends statefulwidget { @override recordscreenstate createstate() => recordscreenstate(); } class recordscreenstate extends state\<recordscreen> { list\<parseobject>? records; bool isloading = true; @override void initstate() { super initstate(); fetchrecords(); } future\<void> fetchrecords() async { final query = querybuilder\<parseobject>(parseobject('record')); final response = await query query(); if (response success && response results != null) { setstate(() { records = response results as list\<parseobject>; isloading = false; }); } } @override widget build(buildcontext context) { return scaffold( appbar appbar(title text('records')), body isloading ? center(child circularprogressindicator()) listview\ builder( itemcount records! length, itembuilder (context, index) { final record = records!\[index]; return listtile( title text(record get\<string>('title') ?? 'no title'), subtitle text(record get\<string>('description') ?? 'no description'), ); }, ), ); } } ce code récupère tous les enregistrements de la record classe dans back4app et les affiche dans une liste étape 4 – décharger le traitement de données lourdes vers un isolate utiliser un isolate pour désérialiser un grand json supposons que le metadata champ dans chaque enregistrement contienne un grand objet json qui doit être désérialisé pour éviter de bloquer le fil d'interface utilisateur, nous allons utiliser un isolate pour effectuer cette tâche import 'dart\ isolate'; import 'dart\ convert'; future\<map\<string, dynamic>> deserializejsoninisolate(string jsonstring) async { // spawning an isolate to perform json decoding final result = await isolate run(() { return jsondecode(jsonstring) as map\<string, dynamic>; }); return result; } future\<void> processrecord(parseobject record) async { string metadata = record get\<string>('metadata') ?? '{}'; // offload json deserialization to an isolate map\<string, dynamic> decodeddata = await deserializejsoninisolate(metadata); // do something with the decoded data print('processed metadata for ${record get\<string>('title')}'); } intégrer le traitement isolé dans l'application mettre à jour le recordscreen widget pour traiter les métadonnées de chaque enregistrement en utilisant l'isolat class recordscreenstate extends state\<recordscreen> { list\<parseobject>? records; bool isloading = true; @override void initstate() { super initstate(); fetchandprocessrecords(); } future\<void> fetchandprocessrecords() async { final query = querybuilder\<parseobject>(parseobject('record')); final response = await query query(); if (response success && response results != null) { list\<parseobject> fetchedrecords = response results as list\<parseobject>; // process each record's metadata using an isolate for (var record in fetchedrecords) { await processrecord(record); } setstate(() { records = fetchedrecords; isloading = false; }); } } @override widget build(buildcontext context) { return scaffold( appbar appbar(title text('records')), body isloading ? center(child circularprogressindicator()) listview\ builder( itemcount records! length, itembuilder (context, index) { final record = records!\[index]; return listtile( title text(record get\<string>('title') ?? 'no title'), subtitle text(record get\<string>('description') ?? 'no description'), ); }, ), ); } } cette implémentation récupère des enregistrements depuis back4app, décharge la lourde tâche de désérialisation json à un isolat, et met à jour l'interface utilisateur une fois le traitement terminé étape 5 – tester et exécuter votre application exécutez votre application en utilisant flutter run vous devriez voir une liste d'enregistrements récupérés depuis back4app les métadonnées de chaque enregistrement sont traitées sur un isolate séparé, garantissant que l'interface utilisateur reste fluide et réactive vérifiez les performances en testant avec de grands fichiers json dans le champ des métadonnées observez comment l'utilisation des isolates empêche les saccades et maintient l'interface utilisateur réactive conclusion dans ce tutoriel, vous avez appris à utiliser les isolates dans flutter pour gérer des tâches de traitement de données lourdes, telles que la désérialisation de grands fichiers json en déchargeant ces tâches sur un isolate, vous gardez le fil d'interface utilisateur libre pour gérer le rendu, ce qui donne une application plus fluide et réactive l'intégration de back4app en tant que backend vous permet de gérer et de récupérer efficacement des données, tandis que le modèle d'isolate de dart garantit que votre application reste performante même lors de la gestion d'opérations complexes pour plus d'informations sur l'utilisation de flutter avec back4app, consultez la documentation de back4app https //www back4app com/docs et la documentation de flutter https //flutter dev/docs bon codage!