Isolate'e Taşımayı Geç Fark Ettim
Parse UI karesini yer

Dışa aktarılmış bir yedek dosyası 2 MB civarıydı. jsonDecode ve model map'i doğrudan onPressed içindeydi. Düğmeye basınca 300 ms boyunca liste kıpırdamadı. Timeline'da UI thread sarı blok. Jank sanmıştım; senkron işti.
Ne taşınır
Taşınan şey widget değil, CPU. Parse, sıkıştırma, kriptolu bir özet, büyük bir listeyi sıralama. setState, BuildContext, TextEditingController taşınmaz. Isolate mesajı kopyalar; kopyalanamayan nesneyi gönderince derleme değil, runtime kızar.
typedef RawNote = Map;
Future> parseBackup(String json) {
return Isolate.run(() {
final decoded = jsonDecode(json);
if (decoded is! List) return [];
return [
for (final row in decoded)
if (row is RawNote) NoteCard.fromJson(row),
];
});
}
Future importBackup(String json) async {
final cards = await parseBackup(json);
if (!mounted) return;
setState(() => _cards = cards);
}
Isolate.run Dart 2.19'dan beri compute kadar kısa. compute duruyor; run, extra dosya ve callback imzası istemiyor. İkisi de mesaj sınırını korur. 20 satırlık bir liste için isolate açmak da israf; eşiği timeline ile koyuyorum.
Geç fark etmek
Küçük yedeklerde sorun görünmedi. İlk 'gerçek' dosya gelince göründü. Bu yüzden içe aktarmayı örnek JSON ile değil, şişirilmiş bir fixture ile ölçüyorum. Geç fark ettim çünkü mutlu yol kısa dosyaydı.
Yorumlar
Yorumlar (0)
Yorumlar üyelere açık. Üye ol · Giriş yap