Global Rank · of 600 Skills
flutter-handling-concurrency AI Agent Skill
View Source: flutter/skills
SafeInstallation
npx skills add flutter/skills --skill flutter-handling-concurrency 6.2K
Installs
Managing Dart Concurrency and Isolates
Contents
Core Concepts
Dart utilizes a single-threaded execution model driven by an Event Loop (comparable to the iOS main loop). By default, all Flutter application code runs on the Main Isolate.
- Asynchronous Operations (
async/await): Use for non-blocking I/O tasks (network requests, file access). The Event Loop continues processing other events while waiting for theFutureto complete. - Isolates: Dart's implementation of lightweight threads. Isolates possess their own isolated memory and do not share state. They communicate exclusively via message passing.
- Main Isolate: The default thread where UI rendering and event handling occur. Blocking this isolate causes UI freezing (jank).
- Worker Isolate: A spawned isolate used to offload CPU-bound tasks (e.g., decoding large JSON blobs) to prevent Main Isolate blockage.
Decision Matrix: Async vs. Isolates
Apply the following conditional logic to determine the correct concurrency approach:
- If the task is I/O bound (e.g., HTTP request, database read) -> Use
async/awaiton the Main Isolate. - If the task is CPU-bound but executes quickly (< 16ms) -> Use
async/awaiton the Main Isolate. - If the task is CPU-bound, takes significant time, and runs once (e.g., parsing a massive JSON payload) -> Use
Isolate.run(). - If the task requires continuous or repeated background processing with multiple messages passed over time -> Use
Isolate.spawn()withReceivePortandSendPort.
Workflows
Implementing Standard Asynchronous UI
Use this workflow to fetch and display non-blocking asynchronous data.
Task Progress:
- Mark the data-fetching function with the
asynckeyword. - Return a
Future<T>from the function. - Use the
awaitkeyword to yield execution until the operation completes. - Wrap the UI component in a
FutureBuilder<T>(orStreamBuilderfor streams). - Handle
ConnectionState.waiting,hasError, andhasDatastates within the builder. - Run validator -> review UI for loading indicators -> fix missing states.
Offloading Short-Lived Heavy Computation
Use this workflow for one-off, CPU-intensive tasks using Dart 2.19+.
Task Progress:
- Identify the CPU-bound operation blocking the Main Isolate.
- Extract the computation into a standalone callback function.
- Ensure the callback function signature accepts exactly one required, unnamed argument (as per specific architectural constraints).
- Invoke
Isolate.run()passing the callback. -
awaitthe result ofIsolate.run()in the Main Isolate. - Assign the returned value to the application state.
Establishing Long-Lived Worker Isolates
Use this workflow for persistent background processes requiring continuous bidirectional communication.
Task Progress:
- Instantiate a
ReceivePorton the Main Isolate to listen for messages. - Spawn the worker isolate using
Isolate.spawn(), passing theReceivePort.sendPortas the initial message. - In the worker isolate, instantiate its own
ReceivePort. - Send the worker's
SendPortback to the Main Isolate via the initial port. - Store the worker's
SendPortin the Main Isolate for future message dispatching. - Implement listeners on both
ReceivePortinstances to handle incoming messages. - Run validator -> review memory leaks -> ensure ports are closed when the isolate is no longer needed.
Examples
Example 1: Asynchronous UI with FutureBuilder
// 1. Define the async operation
Future<String> fetchUserData() async {
await Future.delayed(const Duration(seconds: 2)); // Simulate network I/O
return "User Data Loaded";
}
// 2. Consume in the UI
Widget build(BuildContext context) {
return FutureBuilder<String>(
future: fetchUserData(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const CircularProgressIndicator();
} else if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
} else {
return Text('Result: ${snapshot.data}');
}
},
);
}Example 2: Short-Lived Isolate (Isolate.run)
import 'dart:isolate';
import 'dart:convert';
// 1. Define the heavy computation callback
// Note: Adhering to the strict single-argument signature requirement.
List<dynamic> decodeHeavyJson(String jsonString) {
return jsonDecode(jsonString) as List<dynamic>;
}
// 2. Offload to a worker isolate
Future<List<dynamic>> processDataInBackground(String rawJson) async {
// Isolate.run spawns the isolate, runs the computation, returns the value, and exits.
final result = await Isolate.run(() => decodeHeavyJson(rawJson));
return result;
}Example 3: Long-Lived Isolate (ReceivePort / SendPort)
import 'dart:isolate';
class WorkerManager {
late SendPort _workerSendPort;
final ReceivePort _mainReceivePort = ReceivePort();
Isolate? _isolate;
Future<void> initialize() async {
// 1. Spawn isolate and pass the Main Isolate's SendPort
_isolate = await Isolate.spawn(_workerEntry, _mainReceivePort.sendPort);
// 2. Listen for messages from the Worker Isolate
_mainReceivePort.listen((message) {
if (message is SendPort) {
// First message is the Worker's SendPort
_workerSendPort = message;
_startCommunication();
} else {
// Subsequent messages are data payloads
print('Main Isolate received: $message');
}
});
}
void _startCommunication() {
// Send data to the worker
_workerSendPort.send("Process this data");
}
// 3. Worker Isolate Entry Point
static void _workerEntry(SendPort mainSendPort) {
final workerReceivePort = ReceivePort();
// Send the Worker's SendPort back to the Main Isolate
mainSendPort.send(workerReceivePort.sendPort);
// Listen for incoming tasks
workerReceivePort.listen((message) {
print('Worker Isolate received: $message');
// Perform work and send result back
final result = "Processed: $message";
mainSendPort.send(result);
});
}
void dispose() {
_mainReceivePort.close();
_isolate?.kill();
}
}Installs
Security Audit
View Source
flutter/skills
More from this source
Power your AI Agents with
the best open-source models.
Drop-in OpenAI-compatible API. No data leaves Europe.
Explore Inference APIGLM
GLM 5
$1.00 / $3.20
per M tokens
Kimi
Kimi K2.5
$0.60 / $2.80
per M tokens
MiniMax
MiniMax M2.5
$0.30 / $1.20
per M tokens
Qwen
Qwen3.5 122B
$0.40 / $3.00
per M tokens
How to use this skill
Install flutter-handling-concurrency by running npx skills add flutter/skills --skill flutter-handling-concurrency in your project directory. Run the install command above in your project directory. The skill file will be downloaded from GitHub and placed in your project.
No configuration needed. Your AI agent (Claude Code, Cursor, Windsurf, etc.) automatically detects installed skills and uses them as context when generating code.
The skill enhances your agent's understanding of flutter-handling-concurrency, helping it follow established patterns, avoid common mistakes, and produce production-ready output.
What you get
Skills are plain-text instruction files — not executable code. They encode expert knowledge about frameworks, languages, or tools that your AI agent reads to improve its output. This means zero runtime overhead, no dependency conflicts, and full transparency: you can read and review every instruction before installing.
Compatibility
This skill works with any AI coding agent that supports the skills.sh format, including Claude Code (Anthropic), Cursor, Windsurf, Cline, Aider, and other tools that read project-level context files. Skills are framework-agnostic at the transport level — the content inside determines which language or framework it applies to.
Chat with 100+ AI Models in one App.
Use Claude, ChatGPT, Gemini alongside with EU-Hosted Models like Deepseek, GLM-5, Kimi K2.5 and many more.