More
Come utilizzare gli Isolates in Flutter con Back4app per gestire elaborazioni di dati pesanti
13 min
introduzione flutter è un potente framework per la creazione di applicazioni multipiattaforma, ma come molti framework mobili, esegue tutto il codice su un singolo thread per impostazione predefinita questo thread, noto come thread ui, è responsabile del rendering dell'interfaccia utente della tua app quando compiti pesanti come l'elaborazione dei dati o la gestione dei file si verificano sul thread ui, possono causare ritardi o "jank" nell'app, portando a una cattiva esperienza utente per affrontare questo problema, dart fornisce una funzionalità chiamata isolati gli isolati ti consentono di eseguire calcoli costosi su un thread separato, mantenendo la tua interfaccia utente reattiva in questo tutorial, esploreremo come utilizzare gli isolati in un'applicazione flutter per gestire compiti pesanti di elaborazione dei dati, come la deserializzazione di grandi file json recuperati da un backend back4app requisiti per completare questo tutorial, avrai bisogno di un account back4app registrati per un account gratuito su back4app com https //www back4app com un ambiente di sviluppo flutter configurato sul tuo computer locale segui la guida all'installazione di flutter https //flutter dev/docs/get started/install se non l'hai ancora configurato conoscenze di base di dart, widget flutter e programmazione asincrona passo 1 – configurare il tuo backend back4app crea un progetto back4app accedi al tuo account back4app https //www back4app com/ e crea un nuovo progetto crea classi parse per questo tutorial, crea una classe parse chiamata record che memorizza grandi quantità di dati titolo (string) il titolo del record descrizione (string) una descrizione del record metadati (json) contenuto di metadati di grandi dimensioni associato al record popola la classe con dati di esempio aggiungi diversi record alla record classe con grandi oggetti json nel campo metadati questo simulerà il tipo di elaborazione dei dati che potrebbe causare rallentamenti in un'app reale ottieni le tue credenziali back4app naviga nelle impostazioni del tuo progetto per recuperare il tuo id applicazione e la chiave client, che ti serviranno per connettere la tua app flutter a back4app passo 2 – configurare il tuo progetto flutter crea un nuovo progetto flutter apri il tuo terminale o prompt dei comandi e esegui flutter create isolate example aggiungi dipendenze apri pubspec yaml e aggiungi le seguenti dipendenze dependencies flutter sdk flutter parse server sdk flutter latest version esegui flutter pub get per installare queste dipendenze inizializza parse nella tua app in lib/main dart , importa il sdk di parse e inizializzalo nella funzione 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(), ); } } sostituisci 'your back4app app id' e 'your back4app client key' con le tue credenziali effettive di back4app passo 3 – recupero dati da back4app crea il widget recordscreen in lib/main dart , crea una nuova schermata che recupera dati da 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'), ); }, ), ); } } questo codice recupera tutti i record dalla record classe in back4app e li visualizza in un elenco passo 4 – scaricare l'elaborazione di dati pesanti su un isolate utilizzare isolate per deserializzare grandi json supponiamo che il metadata campo in ogni record contenga un grande oggetto json che deve essere deserializzato per evitare di bloccare il thread dell'interfaccia utente, utilizzeremo un isolate per eseguire questo compito 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')}'); } integra il processamento isolato nell'app aggiorna il recordscreen widget per elaborare i metadati di ciascun record utilizzando l'isolato 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'), ); }, ), ); } } questa implementazione recupera i record da back4app, scarica il pesante compito di deserializzazione json a un isolato e aggiorna l'interfaccia utente una volta completata l'elaborazione passo 5 – testare e eseguire la tua app esegui la tua app utilizzando flutter run dovresti vedere un elenco di record recuperati da back4app i metadati per ogni record vengono elaborati su un isolate separato, garantendo che l'interfaccia utente rimanga fluida e reattiva verifica le prestazioni testando con grandi file json nel campo dei metadati osserva come l'uso degli isolate previene il lag e mantiene l'interfaccia utente reattiva conclusione in questo tutorial, hai imparato come utilizzare gli isolate in flutter per gestire compiti di elaborazione dati pesanti, come la deserializzazione di grandi file json delegando questi compiti a un isolate, mantieni il thread dell'interfaccia utente libero per gestire il rendering, risultando in un'app più fluida e reattiva integrare back4app come backend ti consente di gestire e recuperare dati in modo efficiente, mentre il modello di isolate di dart garantisce che la tua app rimanga performante anche quando gestisce operazioni complesse per ulteriori informazioni su come utilizzare flutter con back4app, dai un'occhiata alla documentazione di back4app https //www back4app com/docs e documentazione di flutter https //flutter dev/docs buon coding!