Memahami Stack Widget pada Flutter

widget stack class flutter

Hallo sobat belajar flutter, pada kesempatan ini kita akan coba memahami lebih dalam salah satu widget fundamental yang akan sering digunakan khususnya dalam membuat layout flutter yaitu Stack widget.

Stack widget adalah widget yang memungkinkan kita untuk membuat widget-widget saling bertumpuk. Terdapat dua tipe stack widget yaitu:

  1. Stack
  2. IndexedStack

Stack Widget

Stack widget memungkinkan kita untuk menampilkan beberapa lapis widget ke layar. Stack widget juga merupakan multiple children widget yang artinya memiliki properti children sehingga dapat menampung lebih dr satu widget. Urutan dari lapisan widget pada stack dari bawah ke atas, jadi widget yang pertama di dalam stack akan berada di posisi paling bawah dan begitu juga sebaliknya, widget yang terakhir di stack widget akan berada di posisi paling atas stack.

Stack ( 
  children: <Widget> [ 
    BawahWidget(), 
    TengahWidget(), 
    AtasWidget(), 
  ], 
),
Stack Widget pada Flutter

Ukuran dari stack widget diambil dari ukuran item widget terbesarnya. Misal dalam stack widget terdapat 4 widget dimana ukuran widget A (100×100), B (150×200), C (200×200) dan D (50×50), maka ukuran Stack adalah 200×200.

Setiap item dalam stack juga harus di tentukan posisi dan align nya atau akan berada di pojok kiri atas sebagai posisi defaultnya.

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    home: BelajarStackWidget(),
  ));
}

class BelajarStackWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: Text("Belajar Stack Widget"),
        ),
        body: Stack(
          children: <Widget>[
            Container(
              color: Colors.green,
            ),
            Container(
              color: Colors.red,
              height: 400.0,
              width: 300.0,
            ),
            Container(
              color: Colors.deepPurple,
              height: 200.0,
              width: 200.0,
            ),
          ],
        ),
      ),
    );
  }
}
contoh tampilan stack widget

Untuk mengubah posisi item dari stack widget, kita bisa menggunakan Align widget

Align(
  alignment: Alignment.topRight,
  child: Container(
    color: Colors.deepPurple,
    height: 200.0,
    width: 200.0,
  ),
)

atau jika ingin lebih leluasa dalam memposisikan widget kita juga dapat menggunakan Positioned widget.

Positioned(
  right: 40.0,
  top: 100.0,
  child: Container(
    color: Colors.deepPurple,
    height: 200.0,
    width: 200.0,
  ),
)
contoh posisi stack widget

IndexedStack Widget

Berbeda dengan stack widget yang menampilkan semua elemen child widgetnya, IndexedStack hanya menampilkan SATU elemen saja berdasarkan indeksnya. Jadi kita harus menentukan elemen widget mana yang akan tampil dari stack tersebut berdasarkan nilai index. Nilai index sendiri mulai dari 0 nol

Sebagai contoh kita akan menggunakan indexedStack dan menampilkan elemen atau widget ketiga, maka potongan kodenya seperti dibawah ini

IndexedStack(
  index: 2,
  children: <Widget>[
    Container(
      color: Colors.green,
    ),
    Container(
      color: Colors.red,
      height: 400.0,
      width: 300.0,
    ),
    Positioned(
      right: 40.0,
      top: 100.0,
      child: Container(
        color: Colors.deepPurple,
        height: 200.0,
        width: 200.0,
      ),
    )
  ],
),

Dan tampilannya akan menjadi seperti ini

contoh indexedstack di flutter

Seperti yang dapat kita lihat pada gambar diatas bahwa elemen index 0 dan 1 tidak muncul, dan hanya widget ke tiga saja yang tampil. Namun untuk ukuran stack nya sendiri masih menggunakan elemen widget terbesarnya sekalipun elemen tersebut tidak ditampilkan di layar.


Contoh Penggunaan Stack Widget

Kita akan coba membuat sebuah tampilan sederhana seperti gambar di bawah ini menggunakan stack widget.

contoh stack widget pada flutter

Caranya juga sangat mudah yaitu :

1. Gunakan stack widget

...
  body: Stack(
    children: <Widget>[
      ...
     ],
...

2. Tambahkan background image pada stack

Container(
  decoration: BoxDecoration(
    image: DecorationImage(
      image: NetworkImage(
          'https://cdn.pixabay.com/photo/2020/10/04/18/13/mountains-5627143_1280.jpg'),
      fit: BoxFit.fitHeight,
    ),
  ),
),

3. Tampilkan jam dan text belajar flutter menggunakan Positioned widget

var date = DateTime.now();
...

Positioned(
  right: 40.0,
  top: 100.0,
  child: Text(date.hour.toString() + ':' + date.minute.toString(),
      style: TextStyle(color: Colors.white, fontSize: 45.0)),
),
Positioned(
  right: 40.0,
  top: 150.0,
  child: Text("BelajarFlutter.com",
      style: TextStyle(color: Colors.white, fontSize: 16.0)),
),

4. Terakhir tampilkan box kata mutiara dengan Card widget dan atur posisinya menggunakan Positioned widget

Positioned(
  bottom: 48.0,
  left: 10.0,
  right: 10.0,
  child: Card(
    elevation: 8.0,
    shape: RoundedRectangleBorder(
      borderRadius: BorderRadius.circular(8.0),
    ),
    child: Column(
      children: <Widget>[
        Padding(
          padding: const EdgeInsets.all(16.0),
          child: Text(
            "Kata Mutiara",
            style: TextStyle(
              fontSize: 20.0,
              fontWeight: FontWeight.bold,
            ),
          ),
        ),
        Padding(
          padding: const EdgeInsets.only(
              top: 0, left: 16.0, right: 16.0, bottom: 8.0),
          child: Text(
              "Pendidikan adalah senjata paling ampuh yang bisa kamu gunakan untuk mengubah dunia."),
        ),
        Padding(
          padding: const EdgeInsets.only(
              top: 8.0, left: 16.0, right: 16.0, bottom: 32.0),
          child: Text("Nelson Mandela"),
        ),
      ],
    ),
  ),
),

Selesai..

Contoh kode lengkapnya seperti dibawah ini

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    home: BelajarStackWidget(),
  ));
}

class BelajarStackWidget extends StatefulWidget {
  @override
  _BelajarStackWidgetState createState() => _BelajarStackWidgetState();
}

class _BelajarStackWidgetState extends State<BelajarStackWidget> {
  var date = DateTime.now();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: <Widget>[
          Container(
            decoration: BoxDecoration(
              image: DecorationImage(
                image: NetworkImage(
                    'https://cdn.pixabay.com/photo/2020/10/04/18/13/mountains-5627143_1280.jpg'),
                fit: BoxFit.fitHeight,
              ),
            ),
          ),
          Positioned(
            right: 40.0,
            top: 100.0,
            child: Text(date.hour.toString() + ':' + date.minute.toString(),
                style: TextStyle(color: Colors.white, fontSize: 45.0)),
          ),
          Positioned(
            right: 40.0,
            top: 150.0,
            child: Text("BelajarFlutter.com",
                style: TextStyle(color: Colors.white, fontSize: 16.0)),
          ),
          Positioned(
            bottom: 48.0,
            left: 10.0,
            right: 10.0,
            child: Card(
              elevation: 8.0,
              shape: RoundedRectangleBorder(
                borderRadius: BorderRadius.circular(8.0),
              ),
              child: Column(
                children: <Widget>[
                  Padding(
                    padding: const EdgeInsets.all(16.0),
                    child: Text(
                      "Kata Mutiara",
                      style: TextStyle(
                        fontSize: 20.0,
                        fontWeight: FontWeight.bold,
                      ),
                    ),
                  ),
                  Padding(
                    padding: const EdgeInsets.only(
                        top: 0, left: 16.0, right: 16.0, bottom: 8.0),
                    child: Text(
                        "Pendidikan adalah senjata paling ampuh yang bisa kamu gunakan untuk mengubah dunia."),
                  ),
                  Padding(
                    padding: const EdgeInsets.only(
                        top: 8.0, left: 16.0, right: 16.0, bottom: 32.0),
                    child: Text("Nelson Mandela"),
                  ),
                ],
              ),
            ),
          ),
        ],
      ),
    );
  }
}

Sumber

https://medium.com/flutter-community/a-deep-dive-into-stack-in-flutter-3264619b3a77

Default image
Omadi Jaya
Fullstack developer, Software Engineer @ Depok, Indonesia

Leave a Reply