Hiểu lầm đắt đỏ nhất khi tối ưu hiệu năng Flutter là nghĩ async nghĩa là “chạy ở thread khác”. Không phải. Đánh dấu một hàm là async không thay đổi chút nào chuyện thân hàm chạy ở đâu — mọi câu lệnh vẫn chạy trên isolate đã gọi nó, mà trong app Flutter thì gần như luôn là UI isolate , chính cái isolate đang build widget và chạy animation cho bạn. Thứ await mang lại là một điểm tạm dừng (suspension point). Hàm chạy tới await đầu tiên, trả quyền điều khiển về event loop, rồi tiếp tục khi future được await hoàn tất. Giữa hai điểm tạm dừng, code của bạn chiếm trọn thread và không có gì khác — không cú chạm nào, không frame nào — được chen vào. Một jsonDecode mất 200 ms bên trong hàm async sẽ chặn đủ 200 ms, rắc bao nhiêu await xung quanh cũng không đổi. Cách sửa là dùng isolate thứ hai: bộ nhớ riêng, event loop riêng, chạy song song thật trên máy nhiều nhân. Phần đó dễ. Phần khiến người ta mắc kẹt là mọi thứ xung quanh nó — cái gì được phép đi qua ranh giới, vì sao một closure bắ...