Неправильно: async/await для CPU-тяжелой задачи
Future<String> processBigData() async {
final raw = await fetchHugeJson(); // ← I/O — ок
final data = jsonDecode(raw); // ← блокирует UI ~1с
final result = heavyMath(data); // ← ещё ~1с
return result;
}
Правильно и просто: compute()
import 'package:flutter/foundation.dart';
Future<String> processBigData() async {
final raw = await fetchHugeJson(); // сеть — ок
return compute(_heavyWork, raw); // ← выполняется в Isolate
}
String _heavyWork(String json) {
final data = jsonDecode(json);
return heavyMath(data);
}
Когда нужен полный контроль, подойдет Raw Isolate
Future<void> startWorker() async {
final receivePort = ReceivePort();
isolate = await Isolate.spawn(_worker, receivePort.sendPort);
sendPort = await receivePort.first as SendPort;
}
Future<String> doHeavyTask(String input) async {
final response = ReceivePort();
sendPort.send([input, response.sendPort]);
return await response.first as String;
}
static void _worker(SendPort mainPort) async {
final port = ReceivePort();
mainPort.send(port.sendPort);
await for (final msg in port) {
final input = msg[0] as String;
final replyTo = msg[1] as SendPort;
replyTo.send("processed: $input"); // heavy work here
}
}
Разберем по ситуации:
- Блокирует main thread > ~300 мс → compute()
- Просто ждет (network/db) → async/await
- Нужен worker с диалогом → raw Isolate
А ты пользуешься Isolate/compute или решаешь через async/await? Делись опытом ⚙️
