Widget Container di Flutter adalah salah satu widget paling fleksibel dan sering digunakan. Fungsinya mirip seperti sebuah box yang dapat digunakan untuk membungkus widget lain dan mengatur berbagai properti visual.

Fungsi Utama Container:

  1. Menampung widget lain
    Container bisa digunakan sebagai pembungkus untuk satu widget anak melalui properti child.

  2. Memberi padding, margin, dan alignment

    • padding: jarak ke dalam antara batas Container dan widget anaknya.

    • margin: jarak ke luar dari Container ke widget lain.

    • alignment: posisi child di dalam Container.

  3. Menentukan ukuran

    • width dan height bisa digunakan untuk menetapkan ukuran tertentu.

    • Atau bisa dibiarkan fleksibel tergantung isi atau parent.

  4. Memberi dekorasi (warna, border, radius, dll)
    Menggunakan properti decoration, kamu bisa menambahkan:

    • Warna latar (color)

    • Border

    • Border radius (sudut melengkung)

    • Shadow

    • Background image

  5. Transformasi dan animasi
    Bisa digunakan dengan properti transform untuk memutar, menerjemahkan, atau menskalakan widget.

Contoh:

Container( width: 200, height: 100, padding: EdgeInsets.all(16), margin: EdgeInsets.symmetric(horizontal: 10), alignment: Alignment.center, decoration: BoxDecoration( color: Colors.blue, borderRadius: BorderRadius.circular(10), ), child: Text( 'Hello Flutter', style: TextStyle(color: Colors.white), ), )

Kalau kamu mau tahu kapan lebih baik pakai Container atau Padding/SizedBox, bisa aku jelaskan juga.


Ini penjelasannya supaya kamu tahu kapan sebaiknya pakai Container, Padding, atau SizedBox di Flutter:

1. Container

Gunakan saat kamu butuh kombinasi dari:

  • Padding

  • Margin

  • Ukuran (width/height)

  • Warna/background

  • Border atau radius

  • Alignment

Kelebihan: serbaguna, bisa melakukan banyak hal dalam satu widget.

Contoh:

Container(

  width: 100,

  height: 100,

  color: Colors.red,

  padding: EdgeInsets.all(10),

  child: Text('Isi'),

)


2. Padding

Gunakan saat kamu hanya butuh memberi ruang di dalam widget (jarak dari tepi ke konten).

Lebih ringan dan efisien daripada Container.

Contoh:

Padding( padding: EdgeInsets.all(16), child: Text('Dengan padding'), )

3. SizedBox

Gunakan saat kamu hanya ingin mengatur ukuran atau membuat jarak (spasi kosong).

Contoh 1: Mengatur ukuran

SizedBox( width: 100, height: 50, child: ElevatedButton( onPressed: () {}, child: Text('Tombol'), ), )

Contoh 2: Memberi spasi antar widget

Column( children: [ Text('Atas'), SizedBox(height: 20), // Spasi 20px Text('Bawah'), ], )

Rangkuman Sederhana:

TujuanWidget yang cocok
Padding (jarak dalam)Padding
Margin, padding, warna, borderContainer
Hanya untuk spasi atau ukuranSizedBox

Kalau kamu butuh contoh lebih spesifik sesuai layout yang kamu bikin, tinggal kasih tahu aja ya!


Mari kita bahas lebih dalam dan praktis—kapan sebaiknya kamu pilih Container, Padding, atau SizedBox dalam situasi nyata:

1. Mau atur posisi konten dengan jarak ke dalam (padding)?

Gunakan Padding!

Contoh:


Padding( padding: EdgeInsets.all(8), child: Text('Ini pakai padding'), )

Kenapa? Karena Padding lebih ringan dan langsung fokus ke satu tujuan: kasih ruang di dalam.


2. Mau kasih ruang antar widget (jarak kosong)?

Gunakan SizedBox!

Contoh:


Column( children: [ Text('Atas'), SizedBox(height: 16), // Spasi vertikal Text('Bawah'), ], )

Kenapa? Karena ini lebih cepat dan efisien daripada Container.


3. Mau bikin box dengan background, border, padding, dan ukuran?

Gunakan Container!

Contoh:

Container( width: 100, height: 100, padding: EdgeInsets.all(10), decoration: BoxDecoration( color: Colors.blue, borderRadius: BorderRadius.circular(12), ), child: Text('Box dekoratif'), )

Kenapa? Karena kamu butuh gabungan properti yang hanya bisa dilakukan oleh Container.


BONUS: Kombinasi yang Efisien

Kalau kamu butuh padding dan background color saja, kamu bisa gabungkan Padding + DecoratedBox, dan ini lebih hemat daripada langsung pakai Container.


Padding( padding: EdgeInsets.all(8), child: DecoratedBox( decoration: BoxDecoration(color: Colors.green), child: Text('Lebih ringan dari Container'), ), )

Kesimpulan Singkat

TujuanGunakan
Hanya kasih jarak dalamPadding
Hanya kasih spasi antar widget atau ukuran tetapSizedBox
Butuh kombinasi (padding, warna, border, ukuran, alignment)Container
Optimasi performa (jangan selalu pakai Container)Gunakan widget yang sesuai kebutuhan saja


Penjelasan tentang Column dan Row ini penting banget karena dua widget ini adalah dasar dari layout di Flutter. Yuk langsung aja:

1. Column

Digunakan untuk menyusun widget secara vertikal (atas ke bawah).

Struktur Umum:

Column( children: [ Widget1(), Widget2(), Widget3(), ], )

Contoh Sederhana:

Column( children: [ Text('Atas'), Text('Tengah'), Text('Bawah'), ], )

Properti Penting:

  • mainAxisAlignment → mengatur posisi widget di sumbu utama (vertikal).

  • crossAxisAlignment → mengatur posisi widget di sumbu silang (horizontal).

Contoh:

Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.start, children: [ Text('Item 1'), Text('Item 2'), ], )

2. Row

Digunakan untuk menyusun widget secara horizontal (kiri ke kanan).

Struktur Umum:

Row( children: [ WidgetA(), WidgetB(), WidgetC(), ], )

Contoh Sederhana:

Row( children: [ Icon(Icons.star), Text('Favorit'), ], )

Properti Penting:

  • mainAxisAlignment → mengatur posisi widget di sumbu utama (horizontal).

  • crossAxisAlignment → mengatur posisi widget di sumbu silang (vertikal).

Contoh:

Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: [ Text('Kiri'), Text('Kanan'), ], )

Catatan Penting:

  • Column dan Row butuh ruang. Kalau kontennya melebihi layar, bisa error (overflow). Solusinya? Bungkus pakai SingleChildScrollView atau Expanded / Flexible untuk mengatur space.

  • Kalau kamu pakai Column dalam Column, hati-hati dengan tinggi widgetnya. Bisa overflow juga.


Tips Kombinasi:

Contoh layout kartu info:

Row( children: [ Icon(Icons.person), SizedBox(width: 8), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text('Nama'), Text('Deskripsi singkat'), ], ), ], )

Kalau kamu punya layout tertentu yang pengen dibikin dengan Column dan Row, tinggal bilang aja. Bisa aku bantu bikinin strukturnya!