Buscar pacotes, repositórios e categorias de apps

Detalhes do pacotev0.1.1

isolated_worker

Um trabalhador isolado singleton para Flutter (Isolate) e Web (Web Worker).

AndroidiOSWebmacOSWindowsLinux
Downloads em 30 dias
6,4 mil
Curtidas
89
Pontos Pub
130

Instalar pacote

flutter pub add isolated_worker

Visão geral do pacote

Orientação gerada a partir de informações públicas. Apenas para referência.

isolated_worker fornece uma implementação de worker singleton para plataformas Flutter e web, utilizando Isolates no mobile e Web Workers na web. Permite processamento eficiente em segundo plano ao isolar tarefas pesadas da thread principal, melhorando a responsividade do aplicativo. O pacote abstrai as diferenças específicas de plataforma, oferecendo uma API unificada para gerenciar execução isolada em Android, iOS, Web, macOS, Windows e Linux. É ideal para operações intensivas em CPU, como análise de dados, processamento de imagens ou cálculos demorados.

Casos de uso

  • Processamento de dados de fundo
  • Manipulação de imagem ou arquivo
  • cálculos de longa duração
  • Análise de dados em tempo real
  • Tarefas em segundo plano multiplataforma

Principais recursos

  • padrão de trabalhador singleton
  • API unificada para todas as plataformas
  • Detecção automática de plataforma
  • Suporte para passagem de mensagens
  • Tratamento de erro embutido

Indicado para

  • Desenvolvedores que precisam de execução em segundo plano multiplataforma
  • Aplicativos com operações intensivas em CPU
  • Equipes que priorizam a reutilização de código entre plataformas
  • Projetos que exigem interface do usuário responsiva durante tarefas intensivas
  • Aplicativos Flutter destinados a múltiplos sistemas operacionais

Considerações

  • Requer entendimento sobre comunicação entre isolados
  • Limitado a uma instância ativa de trabalhador
  • Sobrecarga de serialização de mensagem
  • Não adequado para tarefas de E/S sem um bom design
  • Limitações específicas da plataforma podem se aplicar

README original

Snapshot do README original do repositório-fonte vinculado. Consulte o repositório para o conteúdo mais recente.

A singleton isolated worker for all platforms. On most platforms, it uses Flutter's Isolate, except on the web, since Isolate is not available, it uses Worker instead.

Features

  • 💙 Easy to use*
  • 👬 Identical syntax to the compute function provided by Flutter*
  • 🚫 Not a one-off worker
  • 🌐 Available on web**

*except on web **by using JsIsolatedWorker

Usage

Basic example
int doSomeHeavyCalculation(int count) {
    // ...
}
void main() {
    // if using compute function:
    // compute(doSomeHeavyCalculation, 1000);
    IsolatedWorker().run(doSomeHeavyCalculation, 1000);
}

If we want to do some heavy work that does not need any arguments and/or return values.

// WRONG
void doSomethingHeavy() {
    // ...
}

// CORRECT
void doSomethingHeavy(void _) {
    // ...
}

void main() {
    IsolatedWorker().run(doSomethingHeavy, null);
}

Web example

We can utilize the JsIsolatedWorker for spawning a web worker. However, it cannot use Dart closures as messages to the worker because of some limitations (I have tried using JSONfn and allowInterop but no luck). Instead we need to use native JS closures. In order to do this, we can utilize existing JS APIs or by importing external libraries/files.

Let's assume we want to stringify objects using JSON.stringify.

void main() {
    JsIsolatedWorker().run(
        functionName: ['JSON', 'stringify'],
        arguments: {},
        // optional argument, in case web worker is not available.
        fallback: () {
            return '{}';
        },
    ).then(print);
    // prints "{}"
}

Now let's assume we have external js libraries/files that we want the worker to use.

void main() async {
    // import the scripts first
    // and check if web worker is available
    final bool loaded = await JsIsolatedWorker().importScripts(['myModule1.js']);
    // web worker is available
    if(loaded) {
        print(await JsIsolatedWorker().run(
            functionName: 'myFunction1',
            arguments: 'Hello from Dart :)',
        ));
    }else{
        print('Web worker is not available :(');
    }
}

Shared Platform Worker

There might be a case where we need to use both IsolatedWorker and JsIsolatedWorker. There are many ways to go about it. We can use conditional import, dependency injections, or WorkerDelegator.

WorkerDelegator

For example, we have a foo Dart method that returns a list of numbers from 1 to count.

List<int> foo(int count) {
    List<int> result = <int>[];
    for(int i = 1; i <= count; i++) {
        result.add(i);
    }
    return result;
}

And a JS file foo.js containing a foo JS method that does the same thing.

function foo(count) {
    let result = [];
    for(let i = 1; i <= count; i++) {
        result.push(i);
    }
    return result;
}

To call these methods using WorkerDelegator, we need to create a DefaultDelegate, JsDelegate, and WorkerDelegate first. Then register the WorkerDelegate to our WorkerDelegator.

Future<void> main() async {
    const DefaultDelegate<int, List<int>> fooDelegate = 
        DefaultDelegate(callback: foo);
    
    const JsDelegate fooJsDelegate = JsDelegate(callback: 'foo');

    const WorkerDelegate<int, List<int>> workerDelegate = 
        WorkerDelegate(
            key: 'foo',
            defaultDelegate: fooDelegate,
            jsDelegate: fooJsDelegate,
        );
    
    WorkerDelegator().addDelegate(workerDelegate);

    // Don't forget to call importScripts for our "foo" js method.
    await WorkerDelegator().importScripts(const <String>['foo.js']);
}

After registering our WorkerDelegate, we just need to call it using its key "foo".

...
print(await WorkerDelegator().run('foo', 9));
...

The key can be anything except null.

enum DelegateKeys { foo, bar }
const WorkerDelegate<int, List<int>> workerDelegate = 
    WorkerDelegate(
        key: DelegateKeys.foo,
        defaultDelegate: fooDelegate,
        jsDelegate: fooJsDelegate,
    );

Notes: WorkerDelegator() is a singleton. If we need to create a new instance, we can create one using

WorkerDelegator.asNewInstance(
    delegates: /* pass our WorkerDelegates here. OPTIONAL. */
);

Web Worker Setup

In order for JsIsolatedWorker to run properly on Flutter web, there needs to be a single worker.js file in the web folder. You can download it here and put it in your web folder like below

...
web /
    index.html
    worker.js
    ...

Examples

  • Fetch - an example of how to get response from a URL using IsolatedWorker and JsIsolatedWorker

Categorias

Dependências

Lista de dependências 1 itens

Repositório-fonte

Projetos que usam este pacote

Ainda não há dados.