Episode ini mengukur dan mempercepat aplikasi: rendering performance dan jank reduction, profiling dengan DevTools, widget inspector, dan timeline, teknik mengurangi rebuild dengan widget caching dan optimasi gambar, serta memory usage dan app startup time.

Aplikasi yang lambat mengusir pengguna secepat fitur yang rusak. Episode 15 mengajarkan cara mengukur terlebih dahulu, baru mengoptimalkan: rendering performance dan jank reduction, profiling dengan DevTools dan widget inspector, teknik mengurangi rebuild dan mengoptimalkan gambar, serta memory usage dan startup time.
Aturan emas sebelum membaca episode ini: optimasi tanpa pengukuran adalah tebakan. Selalu profil dulu, baru ubah kode.
Flutter menargetkan 60 frame per detik (atau 120 pada device berkemampuan tinggi). Setiap frame hanya punya sekitar 16 milidetik untuk layout, paint, dan compositing. Ketika frame melewati batas itu, muncul jank — stutter yang terasa saat scroll.
build method (file I/O, network, parsing).class ItemList extends StatelessWidget {
const ItemList({super.key});
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: 1000,
itemBuilder: (context, index) {
return const ItemTile(index: index);
},
);
}
}Perhatikan const pada ListView.builder dan ItemTile. const memberitahu Flutter bahwa widget immutable — framework bisa melewati rebuild yang tidak perlu, salah satu penghematan performa paling mudah.
Bungkus area yang jarang berubah dengan RepaintBoundary agar tidak ikut di-repaint saat area lain berubah:
RepaintBoundary(
child: CustomPaint(painter: PetaPainter()),
)RepaintBoundary membuat CustomPaint dirender ke layer terpisah. Saat widget di sekitarnya berubah, peta tidak perlu digambar ulang — efektif untuk elemen seperti peta, background animasi, dan preview.
Jalankan aplikasi dalam mode profile untuk pengukuran realistis:
flutter run --profileflutter run --profile mengaktifkan AOT namun tetap mengaktifkan DevTools — profil ini yang dipakai untuk mengukur, bukan debug mode. Klik ikon Open DevTools di terminal untuk membuka suite tool-nya.
flutter run --profile --devtoolsflutter run --profile --devtools langsung membuka browser DevTools. Filter timeline pada frame lambat, periksa widget mana yang paling sering di-build, lalu optimalkan titik itu — bukan sembarang tempat.
Sumber pemborosan terbesar biasanya rebuild yang tidak perlu. Tiga perbaikan paling berdampak:
const untuk widget yang immutable.const terpisah.itemExtent pada list panjang agar layout lebih murah.Gambar adalah sumber memory dan bandwidth terbesar. Pakai cached_network_image untuk cache dan resolusi yang tepat:
flutter pub add cached_network_imageCachedNetworkImage(
imageUrl: 'https://example.com/logo.png',
placeholder: (context, url) => const SizedBox(
width: 48,
height: 48,
child: CircularProgressIndicator(strokeWidth: 2),
),
errorWidget: (context, url, error) => const Icon(Icons.broken_image),
)CachedNetworkImage menyimpan gambar di disk sehingga request berulang tidak terjadi, dan placeholder mencegah layout jump saat loading. Atur ukuran gambar di sisi server saat mungkin — mengunduh gambar 4K untuk thumbnail 48px adalah pemborosan.
Gunakan tab Memory DevTools dan perhatikan pola:
dispose adalah penyebab umum.class SearchScreen extends StatefulWidget {
const SearchScreen({super.key});
@override
State<SearchScreen> createState() => _SearchScreenState();
}
class _SearchScreenState extends State<SearchScreen> {
final TextEditingController _controller = TextEditingController();
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return TextField(controller: _controller);
}
}_controller.dispose() di dispose mencegah kebocoran. Aturan: setiap resource yang dibuka di initState wajib ditutup di dispose.
Startup lambat biasanya karena kerja berat di main() dan build awal. Perbaikan umum:
main() sebelum runApp.flutter build apk --release --obfuscate untuk memperkecil ukuran binary di rilis.Inti yang harus dibawa pulang:
const pada widget immutable untuk melewati rebuild.RepaintBoundary mengisolasi area yang jarang berubah.cached_network_image dan ukuran yang tepat.Di episode 16 selanjutnya kita membahas animations dan UI polish — perbedaan implicit dan explicit animations, AnimationController, Tween, dan AnimatedBuilder, Hero animations dan transitions untuk motion design, serta CustomPaint dan advanced UI effects. Aplikasi kalian mulai terasa hidup dan premium.