Flutter

Flutter - Memahami Konsep Tata Letak (Layout) di Flutter

Flutter berbeda dari framework lain karena antramukanya (UI) ditulis langsung dalam Widget menggunakan bahasa pemrograman Dart, bukan dalam file XML untuk Android Native, atau CSS untuk Web. Widget adalah blok dasar pembangun tata letak (layout) UI Flutter. Hampir semua hal di Flutter adalah widget. Widget adalah objek yang tidak dapat diubah yang mencerminkan bagian tertentu dari UI. 

Pada tutorial ini, kita akan belajar memahami cara kerja beberapa widget dasar yang biasanya digunakan untuk membuat layout antarmuka pada aplikasi Flutter. Kita juga akan mempelajari bahwa widget Flutter dapat dikomposisi, artinya kita dapat menggabungkan widget yang ada untuk membuat widget yang lebih canggih.

Tips: Agar dapat memahami cara kerja beberapa widget dasar pembangun layout, ikuti setiap latihan yang ada di tutorial ini secara langsung ya.

Widget Row dan Column 

Widget Row dan Column merupakan kelas yang dapat berisi dan menata letak widget. Widget di dalam Row atau Column disebut children (anak-anak), sedangkan Row dan Column sendiri disebut sebagai parents (orang tua). Row meletakkan widget-widget di bawahnya secara horizontal, sedangkan Column meletakkan widgetnya secara vertikal.

Latihan 1.1: Membuat Row

Pada latihan 1 berikut bertujuan untuk menampilkan perbedaan antara Row dan Column.

  1. Klik tombol Run untuk menjalankan
  2. Dalam kode, ubah Row ke a Column, dan jalankan lagi.

Ukuran dan Perataan Sumbu (Axis)

Sejauh ini, penampakan dua widget OrangeBox dan BlueBox terlihat menyatu (baik jika diarahkan horizontal maupun vertikal pada layar). Kita dapat mengubah bagaimana ketiga widget tersebut diberi jarak menggunakan properti ukuran sumbu dan perataan yang bisa dilakukan pada widget parent (Row atau Column).

Properti MainAxisSize

Row dan Column menempati sumbu utama yang berbeda. Sumbu utama Row adalah horizontal, sedangkan sumbu utama Column adalah vertikal. Properti mainAxisSize menentukan berapa banyak ruang Row dan Column dapat menempati sumbu utama mereka. Properti mainAxisSize memiliki dua kemungkinan nilai, yaitu: MainAxisSize.max dan MainAxisSize.min.

MainAxisSize.max

Row dan Column menempati semua ruang pada sumbu utamanya. Jika lebar gabungan anak-anak mereka kurang dari total ruang pada sumbu utama mereka, anak-anak mereka ditata dengan penambahan ruang ekstra. Secara default, widget-widget di bawahnya akan ditempatkan pada awal sumbu utama.

MainAxisSize.min

Row dan Column hanya memberikan ruang secukupnya pada sumbu utama untuk widget-widget anak mereka. Widget-widget tersebut ditata tanpa memberikan ruang ekstra dan ditempatkan pada tengah sumbu utama Row dan Column.

Tip: MainAxisSize.max adalah nilai bawaan dari properti mainAxisSize. Jika kita tidak menentukan nilai dari properti mainAxisSize, nilai bawaanlah yang akan digunakan, seperti yang ditunjukkan pada contoh sebelumnya.

Latihan 1.2: Memodifikasi ukuran sumbu

Pada latihan 2 berikut, cobalah menambahkan properti mainAxisSize dan set MainAxisSize.max sebagai nilai awalnya.

  1. Klik tombol Run untuk menjalankan,
  2. Tambahkan properti mainAxisSize pada widget Row dengan nilai MainAxisSize.max,
  3. Ubah MainAxisSize.max ke MainAxisSize.min, dan jalankan lagi.

Properti mainAxisAlignment

Ketika properti mainAxisSize diatur ke MainAxisSize.max, Row dan Column mungkin akan menata widget anak-anak mereka dengan penambahan ruang ekstra. Properti mainAxisAlignment menentukan bagaimana Row dan Column dapat menempatkan anak-anak mereka di ruang ekstra itu. mainAxisAlignment memiliki enam kemungkinan nilai, yaitu:

Nilai propertiFungsionalitas
MainAxisAlignment.startMemposisikan widget di dekat awal sumbu utama. (Kiri untuk Row, atas untuk Column)
MainAxisAlignment.endMemposisikan widget di dekat ujung sumbu utama. (Kanan untuk Row, bawah untuk Column)
MainAxisAlignment.centerMemposisikan widget di tengah sumbu utama.
MainAxisAlignment.spaceBetweenMembagi ruang ekstra secara merata di antara widget.
MainAxisAlignment.spaceEvenlyMembagi ruang ekstra secara merata antara sebelum dan sesudah widget.
MainAxisAlignment.spaceAroundMirip dengan MainAxisAlignment.spaceEvenly, tetapi mengurangi setengah dari ruang sebelum widget pertama dan setelah widget terakhir menjadi setengah dari lebar antara widget.
Latihan 1.3: Memodifikasi perataan sumbu utama

Pada latihan 3 berikut, cobalah memberikan MainAxisAlignment.start mainAxisAlignment ke nilai defaultnya.

  1. Klik tombol Jalankan .
  2. Tambahkan properti mainAxisAlignment dengan nilai MainAxisAlignment.start
  3. Ubah MainAxisAlignment.start ke MainAxisAlignment.end, dan jalankan lagi.

Properti crossAxisAlignment

Properti crossAxisAlignment menentukan bagaimana Row dan Column dapat memposisikan anak-anak mereka pada sumbu silang mereka. Sumbu silang Row adalah vertikal, dan sumbu silang Column adalah horizontal. Properti crossAxisAlignment memiliki lima kemungkinan nilai:

Nilai PropertiFungsionalitas
CrossAxisAlignment.startMemposisikan widget di dekat awal sumbu silang. (Atas untuk Row, Kiri untuk Column)
CrossAxisAlignment.endMemposisikan widget di dekat ujung sumbu silang. (Bawah untuk Row, Kanan untuk Column)
CrossAxisAlignment.centerMemposisikan widget di tengah sumbu silang. (Tengah untuk Row, Tengah untuk Column)
CrossAxisAlignment.stretchMeregangkan widget melintasi sumbu silang. (Atas-ke-bawah untuk Row, kiri-ke-kanan untuk Column)
CrossAxisAlignment.baselineMenyelaraskan widget dengan garis dasar karakter mereka. (untuk widget Text saja, dan mengharuskan  menambahkan properti textBaseline dan disetel ke TextBaseline.alphabetic. Lihat bagian widget Teks untuk contoh.)
Latihan 1.4: Memodifikasi perataan sumbu silang

Pada latihan 4 berikut, tambahkan properti crossAxisAlignment dan berikan nilai defaultnya, yaitu CrossAxisAlignment.center.

  1. Klik tombol Jalankan .
  2. Ubah CrossAxisAlignment.center ke CrossAxisAlignment.start, dan jalankan lagi.
  3. Cobalah juga untuk mengubah ke nilai lainnya.

Widget Fleksibel (Flexible)

Seperti yang kita lihat, properti mainAxisAlignment and crossAxisAlignment menentukan bagaimana Row dan Column memposisikan widget di sepanjang kedua sumbu (Sumbu utama dan silang). Row dan Column pertama-tama menata widget dengan ukuran (panjang atau lebar) tetap. Namun, widget dengan ukuran tetap dianggap tidak fleksibel karena tidak dapat mengubah ukurannya sendiri setelah ditata di dalam Row atau Column. Jika kemudian kita ingin melakukan pengubahan ukuran dari widget tersebut setelah ditata tanpa harus mengubah ukuran aslinya, kita membutuhkan widget lain yang bisa mengubahnya menjadi fleksibel, yaitu widget Flexible.

Widget Flexible dapat membungkus sebuah widget, sehingga widget yang dibungkusnya menjadi dapat diubah ukurannya. Saat widget Flexible membungkus sebuah widget, widget tersebut menjadi turunan dari widget Flexible widget dan dianggap fleksibel (seperti namanya). Setelah widget yang tidak fleksibel diletakkan, widget dapat diubah ukurannya dengan menyesuiakan properti flex dan fit.

Properti flex

Membandingkan dirinya dengan flex properti lain sebelum menentukan bagian dari total sisa ruang yang diterima setiap widget Flexible. Properti flex bernilai default 1, dapat diganti dengan nilai lainnya.

Properti fit

Menentukan apakah widget Flexible memenuhi semua ruang ekstranya. Properti fit dapat memiliki salah satu dari dua nilai berikut, yaitu: FlexFit.loose, membuat widget tidak memenuhi ruangan. FlexFit.loose merupakan nilai bawaan. Nilai lainnya yaitu FlexFit.tight, memaksa widget untuk mengisi semua ruang ekstra di sekitarnya.

Latihan 2: Mengubah properti fit

Dalam latihan ini, ubah properti fit untuk membuat widget Flexible mengisi ruang ekstra.

  1. Klik tombol Run untuk menjalankan .
  2. Ubah kedua nilai properti fit menjadi FlexFit.tight, dan jalankan lagi.
  3. Coba juga untuk mengubah nilai properti flex menjadi angka lain selain 1. Lihat apa yang terjadi

Widget yang diperluas (Expanded)

Mirip dengan Flexible, widget Expanded dapat membungkus widget dan memaksa widget untuk mengisi ruang ekstra.

Catatan: Apa perbedaan antara widget Flexible dan Expanded? Gunakan Flexible untuk mengubah ukuran widget di Row atau Column. Dengan begitu, kita dapat menyesuaikan jarak widget anak sambil mempertahankan ukurannya dalam kaitannya dengan widget induknya. Widget Expanded mengubah batasan widget anak sedemikian rupa sehingga widget tersebut mengisi ruang kosong yang ada.

Latihan 3: Mengisi ruang ekstra

Latihan berikut menunjukkan bagaimana widget Expanded memaksa widget turunannya untuk mengisi ruang ekstra.

  1. Klik tombol Run untuk menjalankan.
  2. Bungkus widget BlueBox dalam sebuah widget Expanded.

    Sebagai contoh:
    Expanded(child: BlueBox(),),
  3. Pilih tombol Format untuk memformat kode dengan benar, dan jalankan kembali.

Widget SizedBox (Kotak Berukuran)

Widget SizedBox dapat digunakan dengan salah satu dari dua cara saat membuat dimensi yang tepat. Pertama, SizedBox dapat digunakan dengan membungkus sebuah widget, sehingga Sizedbox dapat mengubah ukuran widget yang dibungkusnya menggunakan properti height and width. Kedua, dengan tidak membungkus widget lain, SizedBox akan membuat ruang kosong dengan ukuran yang diset menggunakan properti height dan width.

Latihan 4: Mengubah ukuran widget

Pada latihan berikut, cobalah membungkus widget BlueBox dengan widget SizedBox dan setel lebar BlueBox menjadi 100 piksel.

  1. Klik tombol Run untuk menalankan,
  2. Tambahkan properti width yang sama dengan 100px di dalam widget SizedBox, dan jalankan lagi.
  3. Coba juga untuk menambahkan SizedBox di antara BlueBox dan OrangeBox kedua dengan width 50. lihat hasilnya

Widget pengatur jarak (Spacer)

Mirip dengan SizedBox, widget Spacer juga dapat membuat ruang antarwidget. Yang membedakan keduanya adalah, Spacer membuat ruang dengan menggunakan properti flex, sehingga lebih fleksibel. Sedangkan SizedBox membuat ruang dengan menambahkan properti width atau height dengan nilai tertentu, sehingga lebih statis.

Latihan 5: Menciptakan lebih banyak ruang

Latihan 5 berikut memisahkan OrangeBox dan BlueBox menggunakan widget Spacer dengan flex bernilai 1.

  1. Klik tombol Run untuk menjalankan .
  2. Tambahkan dua widget Spacer dengan nilai flex 1, masing-masing di antara OrangBox pertama dan BlueBox serta BlueBox dan OrangeBox. Lihat hasilnya
  3. Coba juga ubah nilai flex dari masing-masing Spacer

Widget Teks (Text)

Widget Text menampilkan teks dan memberikan keleluasaan dengan untuk dapat mengkonfigurasikan font, ukuran, dan warna yang diinginkan.

Latihan 6: Meratakan teks

Latihan berikut menampilkan “Halo!Vokasi!Unpak!” dalam tiga widget Text dengan ukuran huruf dan warna yang berbeda. Kita perlu menentukan properti crossAxisAlignment dan textBaseline dalam Row terlebih dahulu untuk memposisikan widget Text. Karena kita ingin memposisikan beberapa widget Text dalam Row, pastikan properti textBaseline bernilai TextBaseline.aplphabetic.

  1. Klik tombol Run untuk menalankan,
  2. Ubah CrossAxisAlignment.start ke CrossAxisAlignment.baseline, dan jalankan lagi.

Widget Icon

Widget Icon berfungi untuk menampilkan simbol grafis yang mewakili aspek UI. Flutter telah menyediakan paket ikon untuk aplikasi Material maupun Cupertino.

Latihan 7: Membuat Ikon

Pada latihan berikut, kita mencoba menampilkan widget Icons.widget dari pustaka Ikon Material dengan warna merah dan biru.

  1. Klik tombol Jalankan .
  2. Tambahkan lagi Widget Icon lain dengan jenis icon dari Material Icon dengan ukuran 50. Kamu bisa memilih icon yang kamu suka
  3. Beri Icon tersebut warna dari Colors.amber palet Material Color, dan jalankan kembali.

Referensi

Diterjemahkan dari Laman Codelabs Flutter dengan beberapa pengubahan. All Credits for Respective Authors.

Comments

Related posts