More
Como Usar Isolates no Flutter com Back4app para Lidar com Processamento Pesado de Dados
13 min
introdução flutter é um framework poderoso para construir aplicações multiplataforma, mas como muitos frameworks móveis, ele executa todo o código em uma única thread por padrão esta thread, conhecida como a thread da ui, é responsável por renderizar a interface do seu aplicativo quando tarefas pesadas como processamento de dados ou manipulação de arquivos ocorrem na thread da ui, elas podem causar lentidão ou "jank" no aplicativo, levando a uma experiência de usuário ruim para resolver isso, dart fornece um recurso chamado isolates isolates permitem que você execute cálculos caros em uma thread separada, mantendo sua ui responsiva neste tutorial, vamos explorar como usar isolates em uma aplicação flutter para lidar com tarefas pesadas de processamento de dados, como deserializar grandes arquivos json obtidos de um backend back4app pré requisitos para completar este tutorial, você precisará uma conta back4app inscreva se para uma conta gratuita em back4app com https //www back4app com um ambiente de desenvolvimento flutter configurado em sua máquina local siga o guia de instalação do flutter https //flutter dev/docs/get started/install se você ainda não o configurou conhecimento básico de dart, widgets flutter e programação assíncrona passo 1 – configurando seu backend back4app crie um projeto back4app faça login na sua conta back4app https //www back4app com/ e crie um novo projeto crie classes parse para este tutorial, crie uma classe parse chamada registro que armazena grandes quantidades de dados título (string) o título do registro descrição (string) uma descrição do registro metadados (json) conteúdo de metadados grande associado ao registro preencha a classe com dados de exemplo adicione vários registros à classe registro com grandes objetos json no campo metadados isso simulará o tipo de processamento de dados que poderia causar lentidão em um aplicativo real obtenha suas credenciais back4app navegue até as configurações do seu projeto para recuperar seu id de aplicação e chave do cliente, que você precisará para conectar seu aplicativo flutter ao back4app passo 2 – configurando seu projeto flutter crie um novo projeto flutter abra seu terminal ou prompt de comando e execute flutter create isolate example adicionar dependências abra pubspec yaml e adicione as seguintes dependências dependencies flutter sdk flutter parse server sdk flutter latest version execute flutter pub get para instalar essas dependências inicialize o parse em seu app em lib/main dart , importe o sdk do parse e inicialize o na função 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(), ); } } substitua 'your back4app app id' e 'your back4app client key' pelas suas credenciais reais do back4app passo 3 – buscando dados do back4app crie o widget recordscreen em lib/main dart , crie uma nova tela que busca dados do 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'), ); }, ), ); } } este código busca todos os registros da record classe no back4app e os exibe em uma lista passo 4 – transferindo processamento pesado de dados para um isolate usando isolate para desserializar json grande suponha que o metadata campo em cada registro contenha um grande objeto json que precisa ser desserializado para evitar bloquear a thread da ui, usaremos um isolate para realizar essa tarefa 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')}'); } integrar o processamento isolado no app atualizar o recordscreen widget para processar os metadados de cada registro usando o isolate 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'), ); }, ), ); } } esta implementação busca registros do back4app, descarrega a pesada tarefa de desserialização de json para um isolate e atualiza a ui uma vez que o processamento esteja completo passo 5 – testando e executando seu app execute seu aplicativo usando flutter run você deve ver uma lista de registros buscados do back4app os metadados de cada registro são processados em um isolate separado, garantindo que a interface do usuário permaneça suave e responsiva verifique o desempenho testando com grandes arquivos json no campo de metadados observe como o uso de isolates previne travamentos e mantém a interface do usuário responsiva conclusão neste tutorial, você aprendeu como usar isolates no flutter para lidar com tarefas pesadas de processamento de dados, como deserializar grandes arquivos json ao transferir essas tarefas para um isolate, você mantém a thread da interface do usuário livre para lidar com a renderização, resultando em um aplicativo mais suave e responsivo integrar o back4app como backend permite que você gerencie e recupere dados de forma eficiente, enquanto o modelo de isolate do dart garante que seu aplicativo permaneça performático mesmo ao lidar com operações complexas para mais informações sobre como usar o flutter com o back4app, confira a documentação do back4app https //www back4app com/docs e documentação do flutter https //flutter dev/docs boa codificação!