Isolates

Igor L Sambo💙🇲🇿
GDG Maputo
Published in
3 min readApr 18, 2021

O flutter por definição é reactivo, assíncrono e corre em uma única thread (single thread). Porque ele é single thread as actividades podem ser concorrentes, portanto estas são assíncronas para permitir essa concorrência sem perder nenhuma delas. Mas nem sempre é possível acolher às necessidades do projecto apenas com componentes assíncronos por si só! E para esse tipo de situações, é importante conhecer os Isolates, que vamos abordar neste artigo.

Um dos cenários mais comuns para recorrer a isolates é quando precisamos de reter dados JSON e fazer o cast para o determinado objecto, pode não parecer necessário para uma lista de apenas 10–100 objectos bem básicos, mas aí vem o Gestor de Projecto ou Project Owner e discute-se a possibilidade de redesenhar a estrutra do projecto, onde também é/são afectados objectos e começam a ser compostos por outros objectos e listas e ainda temos um aumento de utilizadores e os mesmos utilizadores vão gerando cada vez mais dados e as listas JSON ficam cada vez maiores, vemos a requisição a ocorrer com sucesso pela nossa console (se tivermos a sorte de identificar ainda em debug rsrsrs) mas a lista nunca é exibida, mas precisamos continuar a executar alguma tarefa na app e ver o CircularProgressIndicator começa a ser chato.

Nesse momento pensamos no porquê de não estar a utilizar Java ou outra tecnologia multithread que facilitaria a nossa vida, mas no Flutter também podemos ter concorrência recorrendo aos isolates, que permitem resolver um conjunto de dados em “background” enquanto deixamos em meio-tempo o utilizador executar outras tarefas e evitar um possível time-out em alguma tarefa.

Mas, o que seria isolates?

Isolates é um conceito usado em Flutter para permitir a concorrência de tarefas onde, a partir do isolate principal que é o que nós usamos de forma subjectiva, podendo ser necessário (tal como no cenário antes exposto) criar um novo.
É onde todo código Dart corre e considera-se um espaço próprio na máquina com sua memória privada e uma single thread a correr os eventos (loops).

E sua implementação é bastante simples, podendo usar o isolates.spawn() do dart ou o compute() do Flutter para gerir os nossos isolates.

Implementação

Antes de mais nada, o ideal é escolher um ponto super estratégico para lançar o processo de modo que o utilizador não perceba a latência enquanto usa app.

Focando em Flutter vamos observar a implementação do compute().

Consideremos a necessidade de reter para nossa aplicação um conjunto de produtos e suas características de modo que o utilizador possa ter acesso e manipular as mesmas. Podemos iniciar a nossa requisção da seguinte forma:

import 'package:flutter/foundation.dart';
...
Future getProdutos() async {
String url = '$baseUrl/produtos';

http.Response response = await http.get(Uri.parse(url), headers: {
HttpHeaders.contentTypeHeader: 'application/json',
sessionKey: sharedPreferences.getString(sessionKey)
});
if (response.statusCode == 200) {
return compute(parsePrdutos, response.body);
}
}

Como podemos ver em vez de iniciar com o processo de transformação do JSON para objecto chamamos o compute que basta apenas ter o import do foundation para ter acesso, sem precisar instanciar concretamente um novo isolate.

Como parâmetros ele precisa da função a executar e os dados que esta função precisará, por isso temos como argumentos passados o nosso parseProdutos que veremos logo a seguir e a nossa resposta JSON que precisamos fazer o cast/parse.
Então o que teremos a seguir é a execução desta operação de parsing que vai automaticamente pelo compute operar de forma concorrente, permitindo executar outras tarefas no meio-tempo.

parseProviders(String response) {
Produto produto = Produto();
List resposta = jsonDecode(response);

List<Produto> produtos = [];
for (Map prod in resposta) {
produto = Produto.fromJson(prod);
produtos.add(produto)
}

return produtos;
}

Após esta implementação a aplicação está preparada para executar tarefas concorrentes e entregar a lista com mínima latência possível ao utilizador e sem comprometer o fluxo de tarefas na mesma.

Espero que tenha aprendido com este artigo e que se tenha divertido enquanto lia.

Obrigado por acompanhar até ao fim e espero por você no próximo artigo.

Para questões e sugestões esteja a vontade para tal nos comentários, email ou twitter @lsambo02.

Obrigado e até ao próximo artigo!!!

--

--