Posts

Menggunakan Transisi Hero pada Flutter

Bismillah pada artikel kali ini, kita akan mencoba menggunakan animasi gambar transisi 2 rute navigasi.

Dengan menggunakan transisi, pengguna akan tahu bahwa ia telah berpindah halaman.

Pada Flutter, untuk membuat animasi transisi 2 gambar, kita dapat menggunakan widget Hero.

Dengan menggunakan widget Hero, transisi perpindahan gambar dari dua halaman yang berbeda akan dibuat secara otomatis.

mari kita buat

Pertama kita download gambar-gambar yang dibutuhkan, lalu daftarkan assetnya di pubspec.yaml

images : https://drive.google.com/drive/u/0/folders/1_MxLWibmcJxLki6xCBVlScgTmqdRPWRw

register gambarnya di pubspec.yaml seperti berikut :

Jika sudah, kita bisa langsung masuk ke codingan

pada halaman awal, kita buat listing daftar buah-buahannya seperti berikut :

class DaftarBuah extends StatelessWidget {

  var buah = ['apple.jpg', 'grapes.jpg', 'orange.jpg', 'pear.jpg', 'strawberry.jpg'];
  var namanya = ['Apel', 'Anggur', 'Jeruk', 'Pir', 'Stroberi'];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Daftar Buah-buahan"),
      ),
      body: Container(
        padding: EdgeInsets.all(16),
        child: ListView.builder(
          itemCount: buah.length,
          itemBuilder: (BuildContext context, int index) {
            return ListTile(
              leading: Hero(tag: namanya[index], child: Image.asset('images/'+buah[index]),),
              title: Text(namanya[index]),
              onTap: () {
                Navigator.push(context, MaterialPageRoute(builder: (context) => DetailBuah('images/'+buah[index], namanya[index])));
              },
            );
          },
        ),
      ),
    );
  }
}

hasilnya seperti ini :

lalu untuk halaman detailnya kita bua seperti berikut :

class DetailBuah extends StatelessWidget {

  String buah;
  String namanya;

  DetailBuah(this.buah, this.namanya);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(namanya),
      ),
      body: ListView(
        children: <Widget>[
          Hero(tag: namanya, child: Image.asset(buah),),
          Text(namanya),
        ],
      ),
    );
  }
}

Jika pada list buah diatas di tap, maka akan muncul halaman seperti berikut dengan gambarbuah yang tampil secara perlahan membesar dari ukuran gambar pada halaman list buah

Penjelasan :
Untuk menggunakan Hero, kita perlu menambahkan tag, pada tag ini berfungsi sebagai id dari tiap gambar, sehingga halaman detail tau bahwa gambar mana yang akan ditransisikan

2 gambar yang akan ditransisikan harus menggunakan tag yang sama pada masing2 halaman.

kode akhir project :

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: DaftarBuah()
    );
  }
}

class DaftarBuah extends StatelessWidget {

  var buah = ['apple.jpg', 'grapes.jpg', 'orange.jpg', 'pear.jpg', 'strawberry.jpg'];
  var namanya = ['Apel', 'Anggur', 'Jeruk', 'Pir', 'Stroberi'];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Daftar Buah-buahan"),
      ),
      body: Container(
        padding: EdgeInsets.all(16),
        child: ListView.builder(
          itemCount: buah.length,
          itemBuilder: (BuildContext context, int index) {
            return ListTile(
              leading: Hero(tag: namanya[index], child: Image.asset('images/'+buah[index]),),
              title: Text(namanya[index]),
              onTap: () {
                Navigator.push(context, MaterialPageRoute(builder: (context) => DetailBuah('images/'+buah[index], namanya[index])));
              },
            );
          },
        ),
      ),
    );
  }
}

class DetailBuah extends StatelessWidget {

  String buah;
  String namanya;

  DetailBuah(this.buah, this.namanya);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(namanya),
      ),
      body: ListView(
        children: <Widget>[
          Hero(tag: namanya, child: Image.asset(buah),),
          Text(namanya),
        ],
      ),
    );
  }
}

Leave a Reply :

* Your email address will not be published.