Responsive Layout

Seperti yang kita tahu, Flutter merupakan framework untuk mengembangkan aplikasi pada berbagai platform. Pada platform mobile sendiri tersedia banyak ukuran layar dari ukuran jam hingga tablet. Ditambah Flutter baru saja mengumumkan dukungan untuk platform web dan desktop. Itu artinya, satu hal yang penting untuk kita pahami adalah bagaimana menerapkan layout yang mampu beradaptasi dengan berbagai ukuran layar yang berbeda.

Pada materi ini kita akan mulai membahas bagaimana mengimplementasikan layout yang responsif.


MediaQuery

Pendekatan pertama yang akan kita lakukan adalah menggunakan Media Query. Jika Anda sudah familier dengan pengembangan web, mungkin Anda sudah tidak asing dengan konsep ini. MediaQuery adalah kelas yang dapat kita gunakan untuk mendapatkan ukuran dan juga orientasi layar.

Mari kita lihat contoh penerapan MediaQuery.

  1. class HomePage extends StatelessWidget {
  2. const HomePage({Key? key}) : super(key: key);
  3.  
  4.   @override
  5.   Widget build(BuildContext context) {
  6.     Size screenSize = MediaQuery.of(context).size;
  7. Orientation orientation = MediaQuery.of(context).orientation;
  8.  
  9.     return Scaffold(
  10.       backgroundColor: Colors.blueGrey,
  11.       body: Column(
  12.         mainAxisAlignment: MainAxisAlignment.center,
  13.         crossAxisAlignment: CrossAxisAlignment.stretch,
  14.         children: [
  15.           Text(
  16.             'Screen width: ${screenSize.width.toStringAsFixed(2)}',
  17.             style: const TextStyle(color: Colors.white, fontSize: 18),
  18.             textAlign: TextAlign.center,
  19.           ),
  20.           Text(
  21.             'Orientation: $orientation',
  22.             style: const TextStyle(color: Colors.white, fontSize: 18),
  23.             textAlign: TextAlign.center,
  24.           ),
  25.         ],
  26.       ),
  27.     );
  28.   }
  29. }

Sekarang jalankan aplikasi untuk melihat ukuran layarnya.

20210425210419157adacac812a00588581d94981a1f9b.png

202104252104366b3ce04197eb18619ce31b70c431e387.png


LayoutBuilder

Cara lain yang bisa kita gunakan adalah dengan widget LayoutBuilder. Perbedaan umum antara MediaQuery dan Layout Builder adalah MediaQuery akan mengembalikan ukuran layar yang digunakan, sedangkan LayoutBuilder mengembalikan ukuran maksimum dari widget tertentu.

Berikut ini adalah contoh kode yang menunjukkan perbedaan antara MediaQuery dan LayoutBuilder:

  1. class HomePage extends StatelessWidget {
  2.   const HomePage({Key? key}) : super(key: key);
  3.  
  4.   @override
  5.   Widget build(BuildContext context) {
  6.     Size screenSize = MediaQuery.of(context).size;
  7.  
  8.     return Scaffold(
  9.       backgroundColor: Colors.blueGrey,
  10.       body: Row(
  11.         children: [
  12.           Expanded(
  13.             child: LayoutBuilder(
  14.               builder: (BuildContext context, BoxConstraints constraints) {
  15.                 return Column(
  16.                   mainAxisAlignment: MainAxisAlignment.center,
  17.                   crossAxisAlignment: CrossAxisAlignment.stretch,
  18.                   children: [
  19.                     Text(
  20.                       'MediaQuery: ${screenSize.width.toStringAsFixed(2)}',
  21.                       style: const TextStyle(color: Colors.white, fontSize: 18),
  22.                       textAlign: TextAlign.center,
  23.                     ),
  24.                     Text(
  25.                       'LayoutBuilder: ${constraints.maxWidth}',
  26.                       style: const TextStyle(color: Colors.white, fontSize: 18),
  27.                       textAlign: TextAlign.center,
  28.                     ),
  29.                   ],
  30.                 );
  31.               },
  32.             ),
  33.           ),
  34.           Expanded(
  35.             flex: 3,
  36.             child: LayoutBuilder(
  37.               builder: (BuildContext context, BoxConstraints constraints) {
  38.                 return Container(
  39.                   color: Colors.white,
  40.                   child: Column(
  41.                     mainAxisAlignment: MainAxisAlignment.center,
  42.                     crossAxisAlignment: CrossAxisAlignment.stretch,
  43.                     children: [
  44.                       Text(
  45.                         'MediaQuery: ${screenSize.width.toStringAsFixed(2)}',
  46.                         style: const TextStyle(color: Colors.blueGrey, fontSize: 18),
  47.                         textAlign: TextAlign.center,
  48.                       ),
  49.                       Text(
  50.                         'LayoutBuilder: ${constraints.maxWidth}',
  51.                         style: const TextStyle(color: Colors.blueGrey, fontSize: 18),
  52.                         textAlign: TextAlign.center,
  53.                       ),
  54.                     ],
  55.                   ),
  56.                 );
  57.               },
  58.             ),
  59.           ),
  60.         ],
  61.       ),
  62.     );
  63.   }
  64. }

Hasil ketika dijalankan pada browser akan seperti ini:

20210425210552b66b987a61408699450be54573c3dc0b.png

Ubahlah ukuran jendela browser untuk melihat perubahan ukuran layar atau media yang digunakan.

Dengan mendapatkan ukuran lebar dan tinggi layar seperti di atas, kita bisa menentukan tampilan konten berdasarkan ukuran layar yang digunakan. Dalam responsive design, terdapat breakpoint yang merupakan “titik” di mana layout akan beradaptasi untuk memberikan pengalaman pengguna sebaik mungkin.

Dengan kode di bawah ini berarti akan terdapat tiga model tampilan berdasarkan ukuran layar:

  1. class ResponsivePage extends StatelessWidget {
  2. const ResponsivePage({Key? key}) : super(key: key);
  3.  
  4.   @override
  5.   Widget build(BuildContext context) {
  6.     return Scaffold(
  7.       appBar: AppBar(),
  8.       body: LayoutBuilder(
  9.         builder: (BuildContext context, BoxConstraints constraints) {
  10.           if (constraints.maxWidth < 600) {
  11.             return ListView(
  12.               children: _generateContainers(),
  13.             );
  14.           } else if (constraints.maxWidth < 900) {
  15.             return GridView.count(
  16.               crossAxisCount: 2,
  17.               children: _generateContainers(),
  18.             );
  19.           } else {
  20.             return GridView.count(
  21.               crossAxisCount: 6,
  22.               children: _generateContainers(),
  23.             );
  24.           }
  25.         },
  26.       ),
  27.     );
  28.   }
  29.  
  30.   List<Widget> _generateContainers() {
  31.     return List<Widget>.generate(20, (index) {
  32.       return Container(
  33.         margin: const EdgeInsets.all(8),
  34.         color: Colors.blueGrey,
  35.         height: 200,
  36.       );
  37.     });
  38.   }
  39. }

Berikut adalah tampilan dari kode di atas ketika dijalankan:

20210425211022224c0de6d6751d5c57b5e4b7e39712a3.gif

Popular posts from this blog

Build APK

Generic

Build IPA