Showing posts with label Flutter. Show all posts
Showing posts with label Flutter. Show all posts

Cara convert angka romawi ke angka desimal dengan bahasa pemrograman dart

Di tutorial kali ini saya ingin membagi sedikit ilmu bagaimana cara convert angka romawi ke angka desimal menggunakan bahasa pemrograman Dart,




Adapun code nya bisa dilihat dibawah ini:

void main() {
  print(convertRomawiToNumber("III"));
}

String convertRomawiToNumber(String? romawi) {
  Map<String, int> romawiToNumber = {
    "I": 1,
    "V": 5,
    "X": 10,
    "L": 50,
    "C": 100,
    "D": 500,
    "M": 1000
  };
  int total = 0;
  List<int> listRomawiToNumber = [];

  //cek invalid INPUT
  if (romawi == null || romawi.length < 1) {
    return "INVALID INPUT";
  }
  
  //cek invalid ROMAWI
  for (int i = 0; i < romawi.length; i++) {
    if (!(romawiToNumber.keys.toList().contains(romawi.split("")[i]))) {
      return "INVALID ROMAWI";
    }
  }

  //Convert ROMAWI TO NUMBER
  for (int i = 0; i < romawi.length; i++) {
    listRomawiToNumber.add(romawiToNumber[romawi.split("")[i]]!);
  }

  //SET DEFAULT TOTAL WITH LAST VALUE LIST RESULT ROMAWI TO NUMBER
  total += listRomawiToNumber[listRomawiToNumber.length - 1];
  
  //LOGIC CHECK ROMAWI
  for (int i = listRomawiToNumber.length - 1; i >= 0; i--) {
    if (i >= 1) {
      if (listRomawiToNumber[i] <= listRomawiToNumber[i - 1]) {
        total += listRomawiToNumber[i - 1];
      } else {
        total -= listRomawiToNumber[i - 1];
      }
    }
  }
  
  //RETURN TOTAL
  return total.toString();
}

Dari kode diatas jika dijalankan maka akan keluar hasil convert angka romawi III menjadi angka desimal 3 

Tutorial menambahkan 3D models ke dalam aplikasi projek Flutter dengan vectary

Selamat malam semuanya....

Sesuai dengan judul artikel ini,kali ini saya akan bahas bagaimana menambahkan 3D model ke dalam aplikasi Project flutter dengan memanfaatkan fitur dari website vectary...

Untuk menggunakan fitur dari website vectary,hal pertama yang harus kita lakukan adalah mendaftar ke website tersebut atau bisa langsung dengan login menggunakan akun google kita...
Buka website vectary.com. Selanjutnya masuk dengan akun google.



Setelah berhasil login,kita akan di diperlihatkan halaman dashboard dari website vectary. Selanjutnya pilih new project -> Pilih Template yang ingin ditampilkan pada project aplikasi kita.



Setelah proses diatas selesai,selanjutnya kita kembali ke project flutter (disini saya menggunakan Android Studio). Untuk menampilkan template yang kita pilih dari website vectary ke dalam project flutter,disini kita harus menambahkan package webview_flutter.


Setelah package ditambahkan jangan lupa untuk klik pub get. Setelah proses diatas selesai selanjutnya buat file dart baru dengan nama vectary_screen.dart dan ikuti kode nya seperti dibawah.
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

class VectaryScreen extends StatefulWidget {
  const VectaryScreen({Key? key}) : super(key: key);

  @override
  State<VectaryScreen> createState() => _VectaryScreenState();
}

class _VectaryScreenState extends State<VectaryScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        title: const Text('Vectary'),
        elevation: 0,
        actions: const [
          Icon(Icons.shopping_cart),
          SizedBox(
            width: 20,
          ),
          Icon(Icons.share),
          SizedBox(
            width: 20,
          ),
        ],
      ),
      bottomNavigationBar: _buildBottomBarActions(),
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          const Expanded(
            child: WebView(
              initialUrl:
                  'https://app.vectary.com/p/4lepw7bb8QnDkTRO8uRiB7',
              javascriptMode: JavascriptMode.unrestricted,
            ),
          ),
          const SizedBox(
            height: 20,
          ),
          _buildProductTitle(),
        ],
      ),
    );
  }

  Widget _buildBottomBarActions() {
    return Padding(
      padding: const EdgeInsets.symmetric(horizontal: 16.0),
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: [
          Row(
            children: [
              Expanded(
                  child: Container(
                height: 50,
                decoration: BoxDecoration(
                  border: Border.all(color: Colors.black),
                  borderRadius: BorderRadius.circular(4),
                ),
                child: const Center(
                  child: Text(
                    'Buy Now',
                    style: TextStyle(
                      color: Colors.black,
                      fontSize: 16,
                    ),
                  ),
                ),
              )),
              const SizedBox(
                width: 8,
              ),
              Expanded(
                child: Container(
                  height: 50,
                  width: 200,
                  decoration: BoxDecoration(
                    color: Colors.black,
                    border: Border.all(color: Colors.black),
                    borderRadius: BorderRadius.circular(4),
                  ),
                  child: const Center(
                    child: Text(
                      'Add to bag',
                      style: TextStyle(
                        color: Colors.white,
                        fontSize: 16,
                      ),
                    ),
                  ),
                ),
              )
            ],
          ),
          const SizedBox(
            height: 20,
          )
        ],
      ),
    );
  }

  Widget _buildProductTitle() {
    return Column(
      children: const [
        Text(
          'Sneaker',
          style: TextStyle(
            fontWeight: FontWeight.bold,
            fontSize: 20,
          ),
        ),
        SizedBox(
          height: 8,
        ),
        Text(
          'Sneaker X',
          style: TextStyle(
            fontSize: 16,
          ),
        ),
        SizedBox(
          height: 8,
        ),
      ],
    );
  }
}

Setelah itu ubah file main.dart seperti code dibawah
import 'package:flutter/material.dart';
import 'package:tutorials_vectary/vectary_screen.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Tutorial Vactary',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const VectaryScreen(),
    );
  }
}

Jika semua langkah sudah dilakukan,jalankan aplikasinya maka hasilnya seperti ini

Cara menampilkan Progress indicator dengan Image.Network() pada Flutter

Tutorial kali ini saya ingin membagikan cara menampilkan Progress Indicator dengan Image.Network() pada Flutter...

Code penggunaan Widget Image.Network() sebelum menggunakan progress ketika gambar di load dari internet serta hasilnya:

code image network

Agar ketika proses load gambar dari internet menampilkan progress dialog ubah code diatas menjadi seperti ini..

code setelah

Jika dijalankan maka akan Kelihatan perbedaan sebelum dan sesudah kita meletakkan progress dialog ketika load gambar dari internet...

Saya menyarankan jika ingin load gambar dari internet lebih baik menggunakan Plugin cached_network_image link plugin disini.

Cara menampilkan emulator di dalam jendela Android Studio pada project Flutter

Sesuai judul artikel,Hari ini saya akan menulis artikel bagaimana cara mengatasi emulator tidak bisa berjalan didalam jendela Android Studio pada project flutter...

Pada versi terbaru Android Studio terdapat fitur untuk menjalankan emulator didalam jendela Android Studio tetapi pada kasus project Flutter default/bawaan fitur tersebut tidak berfungsi meski fitur sudah diaktifkan. Dari permasalahan diatas setelah melakukan riset dan pencarian akhirnya saya menemukan cara mengatasi masalah diatas...

Adapun caranya:

Pertama pastikan fitur enable to lunch windows emulator diaktifkan dengan cara pilih menu setting->pilih tools->emulator->centang menu Launch in a tool window..


Selanjutnya agar fitur aktif pada project flutter kita pastikan untuk mengimpor modul android ke dalam project flutter, dengan cara pilih menu project structure->pilih modules->klik tombol tambah/plus->lalu pilih android (pastikan project di select dulu)->klik OK ....




Setelah langkah diatas sudah diikuti maka permasalahan sudah terselesaikan...
Demikian tutorial kali ini,,semoga dapat membantu....








Membuat aplikasi sederhana tebak jenis kelamin dengan flutter

Siang semuanya, hari ini saya ingin membagi tutorial sederhana Membuat aplikasi sederhana tebak jenis kelamin dengan Flutter dengan memanfaatkan API dari website genderize.io .Jadi cara kerja aplikasi ini nantinya dengan hanya memasukkan nama,aplikasi akan menampilkan tebakan atau prediksi jenis kelamin dari nama tersebut...

OK pertama tama kita tambahkan package http ke file pubspec.yaml selanjutnya jangan lupa untuk melakukan perintah flutter pub get agar package di load ke project kita...

Selanjutnya buat kan Directory baru dengan nama screen dan didalam directory tersebut kita buat file dart baru dengan nama home_screen ...maka tampilan struktur project nya seperti ini

Lalu masuk ke file main.dart dan ubah code nya seperti dibawah

import 'package:flutter/material.dart';
import 'package:tebak_jenis_kelamin/screen/home_screen.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: HomeScreen(),
    );
  }
}

Setelah langkah diatas selesai diikuti selanjutnya masuk ke file home_screen.dart di dalam file ini kita akan membuat layout beserta logic untuk tebak jenis kelamin berdasarkan nama, Untuk code nya seperti dibawah :
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

class HomeScreen extends StatefulWidget {
  HomeScreen({Key? key}) : super(key: key);

  @override
  State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  final TextEditingController _namaController = TextEditingController();
  final String faseLoading = "faseLoading";
  final String faseDone = "faseDone";
  String fase = "";

  String? nama;
  String? jenisKelamin;

  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        appBar: AppBar(
          elevation: 0,
          title: const Text(
            "Tebak Jenis Kelamin",
            style: TextStyle(fontSize: 20),
          ),
        ),
        body: SingleChildScrollView(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              _search(context),
              fase == ""
                  ? Container()
                  : fase == faseLoading
                      ? Container(
                          margin: const EdgeInsets.only(top: 20),
                          child: const CircularProgressIndicator())
                      : _jenisKelamin()
            ],
          ),
        ),
      ),
    );
  }

  Widget _search(BuildContext context) {
    return Container(
      padding: const EdgeInsets.symmetric(horizontal: 1),
      color: const Color(0xFFEEEEEE),
      child: Card(
        shape: const RoundedRectangleBorder(
            borderRadius: BorderRadius.all(Radius.circular(3))),
        clipBehavior: Clip.antiAliasWithSaveLayer,
        child: Row(
          children: <Widget>[
            Expanded(
              child: Container(
                padding: const EdgeInsets.only(left: 10, right: 5),
                decoration: const BoxDecoration(
                  borderRadius: BorderRadius.only(
                      topLeft: Radius.circular(5),
                      bottomLeft: Radius.circular(5)),
                ),
                child: TextFormField(
                    controller: _namaController,
                    focusNode: FocusNode(canRequestFocus: false),
                    onSaved: (val) {},
                    cursorColor: Theme.of(context).colorScheme.primary,
                    decoration: const InputDecoration(
                      hintText: 'Masukkan nama',
                      hintStyle:
                          TextStyle(fontSize: 16.0, color: Color(0xFFcccccc)),
                      errorStyle: TextStyle(height: 0),
                      enabledBorder: UnderlineInputBorder(
                        borderSide: BorderSide(color: Colors.transparent),
                      ),
                      focusedBorder: UnderlineInputBorder(
                        borderSide: BorderSide(color: Colors.transparent),
                      ),
                      border: UnderlineInputBorder(
                        borderSide: BorderSide(color: Colors.transparent),
                      ),
                    ),
                    style:
                        const TextStyle(color: Colors.black, fontSize: 16.0)),
              ),
            ),
            GestureDetector(
              onTap: () {
                if (_namaController.text != "") {
                  tebakJenisKelamin();
                  FocusScope.of(context).requestFocus(FocusNode());
                } else {
                  setFase("");
                  ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
                    content: Text("Nama belum diisi"),
                  ));
                }
              },
              child: Wrap(
                children: [
                  Container(
                    padding: const EdgeInsets.symmetric(
                        vertical: 12, horizontal: 10),
                    decoration: BoxDecoration(
                        color: Theme.of(context).colorScheme.primary,
                        borderRadius: const BorderRadius.only(
                            bottomRight: Radius.circular(3),
                            topRight: Radius.circular(3))),
                    child: const Icon(
                      Icons.search,
                      color: Colors.white,
                    ),
                  ),
                ],
              ),
            )
          ],
        ),
      ),
    );
  }

  Widget _jenisKelamin() {
    if (jenisKelamin != null) {
      return Container(
        margin: const EdgeInsets.only(top: 20),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            Text(
              jenisKelamin == "male" ? "Laki-laki" : "Perempuan",
              style: const TextStyle(fontSize: 25, fontWeight: FontWeight.bold),
            ),
            Icon(
              jenisKelamin == "male" ? Icons.male : Icons.female,
              color: jenisKelamin == "male" ? Colors.blue : Colors.pink,
              size: 100,
            ),
          ],
        ),
      );
    }

    return Container();
  }

  tebakJenisKelamin() async {
    setFase(faseLoading);
    var url =
        Uri.parse('https://api.genderize.io/?name=${_namaController.text}');
    var response = await http.get(url);
    var body = json.decode(response.body);
    setState(() {
      jenisKelamin = '${body['gender']}';
      setFase(faseDone);
    });
  }

  setFase(String fase) {
    setState(() {
      this.fase = fase;
    });
  }
}

Demikian tutorial kali ini..semoga tulisan ini bermanfaat untuk yang membaca tulisan ini serta untuk penulis pribadi....

Demo aplikasi silahkan klik disini

Terima kasih!!!!

Tutorial Ambil Gambar dari Galeri dan Kamera di Flutter

    Tutorial kali ini kita akan membahas bagaimana implementasi package image_picker pada project flutter kita agar bisa mengambil gambar dari galeri atau kamera,disini saya menggunakan package image_picker dengan versi ^0.8.4+4, untuk melihat versi terbaru silahkan kunjungi link disini. Project ini sudah mendukung null safety sehingga jika teman-teman ingin ikuti tutorial ini saya sarankan agar upgrade versi flutter anda agar mendukung null safety...


Pertama kita tambahkan package image_picker pada file pubspec.yaml, selanjutnya jangan lupa untuk melakukan perintah pub get agar package di load ke project kita...

Berikutnya jika langkah di atas sudah dilakukan kita akan memulai membuat design halaman awal dengan tampilan gambar seperti di bawah


untuk code nya seperti ini:

    return Scaffold(
        appBar: AppBar(
          elevation: 0,
          leadingWidth: 35,
          iconTheme: const IconThemeData(color: Colors.white),
          title: Container(
            padding: const EdgeInsets.only(top: 10, bottom: 10),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: const <Widget>[
                Text(
                  "Image Picker",
                  style: TextStyle(color: Colors.white, fontSize: 18),
                ),
              ],
            ),
          ),
          actions: [
            GestureDetector(
                onTap: () {
                  showModalBottomSheet(
                    context: context,
                    backgroundColor: Colors.transparent,
                    builder: ((builder) => _ambilGambar()),
                  );
                },
                child: Container(
                    padding: const EdgeInsets.only(right: 8),
                    child: const Icon(Icons.image_search)))
          ],
        ),
        body: Container(
          color: const Color(0xFFf2f2f2),
          child: _image == null
              ? const Center(
                  child: Icon(
                  Icons.image_aspect_ratio,
                  color: Color(0xFFE0E0E0),
                  size: 100,
                ))
              : Image(
                  width: double.infinity,
                  height: double.infinity,
                  image: FileImage(File(_image!.path))),
        ));

Selanjutnya kita akan membuat tampilan bottom sheet dialog beserta aksi tombol dimana design nya akan menampilkan dua pilihan untuk memilih mengambil gambar dari camera atau galeri

source code untuk Widget tampilan bottom sheet dialog beserta logicnya :

 Widget _ambilGambar() {
    return Container(
      width: MediaQuery.of(context).size.width,
      decoration: const BoxDecoration(
        color: Colors.white,
        borderRadius: BorderRadius.only(
            topLeft: Radius.circular(10), topRight: Radius.circular(10)),
      ),
      child: Wrap(
        children: <Widget>[
          Container(
            width: double.infinity,
            padding: const EdgeInsets.only(top: 10, bottom: 20),
            child: const Text(
              "Ambil Gambar",
              textAlign: TextAlign.center,
              style: TextStyle(fontSize: 20.0, fontWeight: FontWeight.bold),
            ),
          ),
          Row(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[
            Expanded(
              flex: 1,
              child: GestureDetector(
                onTap: () {
                  Navigator.pop(context);
                  getImage(ImageSource.camera);
                },
                child: Column(
                  children: [
                    const Icon(
                      Icons.camera,
                      size: 40,
                    ),
                    Container(
                        margin: const EdgeInsets.only(top: 5),
                        child: const Text("Ambil dari Kamera"))
                  ],
                ),
              ),
            ),
            Expanded(
              flex: 1,
              child: GestureDetector(
                onTap: () {
                  Navigator.pop(context);
                  getImage(ImageSource.gallery);
                },
                child: Column(
                  children: [
                    const Icon(
                      Icons.image,
                      size: 40,
                    ),
                    Container(
                        margin: const EdgeInsets.only(top: 5),
                        child: const Text("Ambil dari Galeri"))
                  ],
                ),
              ),
            ),
          ]),
          Container(
              width: double.infinity,
              padding: const EdgeInsets.symmetric(vertical: 10),
              margin: const EdgeInsets.only(top: 20),
              color: Theme.of(context).colorScheme.primary,
              child: const Text(
                'TUTUP',
                textAlign: TextAlign.center,
                style: TextStyle(
                    color: Colors.white,
                    fontSize: 20,
                    fontWeight: FontWeight.bold),
              ))
        ],
      ),
    );
  }

  Future getImage(ImageSource src) async {
    var image = await _picker.pickImage(source: src);
    setState(() {
      _image = image;
    });
  }

Tampilan ketika memilih camera atau galeri dan hasilnya:

Untuk source code lengkapnya:
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Image Picker',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.teal,
      ),
      home: const ImagePickerPage(),
    );
  }
}

class ImagePickerPage extends StatefulWidget {
  const ImagePickerPage({Key? key}) : super(key: key);

  @override
  State<ImagePickerPage> createState() => _ImagePickerPageState();
}

class _ImagePickerPageState extends State<ImagePickerPage> {
  XFile? _image;
  final ImagePicker _picker = ImagePicker();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          elevation: 0,
          leadingWidth: 35,
          iconTheme: const IconThemeData(color: Colors.white),
          title: Container(
            padding: const EdgeInsets.only(top: 10, bottom: 10),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: const <Widget>[
                Text(
                  "Image Picker",
                  style: TextStyle(color: Colors.white, fontSize: 18),
                ),
              ],
            ),
          ),
          actions: [
            GestureDetector(
                onTap: () {
                  showModalBottomSheet(
                    context: context,
                    backgroundColor: Colors.transparent,
                    builder: ((builder) => _ambilGambar()),
                  );
                },
                child: Container(
                    padding: const EdgeInsets.only(right: 8),
                    child: const Icon(Icons.image_search)))
          ],
        ),
        body: Container(
          color: const Color(0xFFf2f2f2),
          child: _image == null
              ? const Center(
                  child: Icon(
                  Icons.image_aspect_ratio,
                  color: Color(0xFFE0E0E0),
                  size: 100,
                ))
              : Image(
                  width: double.infinity,
                  height: double.infinity,
                  image: FileImage(File(_image!.path))),
        ));
  }

  Widget _ambilGambar() {
    return Container(
      width: MediaQuery.of(context).size.width,
      decoration: const BoxDecoration(
        color: Colors.white,
        borderRadius: BorderRadius.only(
            topLeft: Radius.circular(10), topRight: Radius.circular(10)),
      ),
      child: Wrap(
        children: <Widget>[
          Container(
            width: double.infinity,
            padding: const EdgeInsets.only(top: 10, bottom: 20),
            child: const Text(
              "Ambil Gambar",
              textAlign: TextAlign.center,
              style: TextStyle(fontSize: 20.0, fontWeight: FontWeight.bold),
            ),
          ),
          Row(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[
            Expanded(
              flex: 1,
              child: GestureDetector(
                onTap: () {
                  Navigator.pop(context);
                  getImage(ImageSource.camera);
                },
                child: Column(
                  children: [
                    const Icon(
                      Icons.camera,
                      size: 40,
                    ),
                    Container(
                        margin: const EdgeInsets.only(top: 5),
                        child: const Text("Ambil dari Kamera"))
                  ],
                ),
              ),
            ),
            Expanded(
              flex: 1,
              child: GestureDetector(
                onTap: () {
                  Navigator.pop(context);
                  getImage(ImageSource.gallery);
                },
                child: Column(
                  children: [
                    const Icon(
                      Icons.image,
                      size: 40,
                    ),
                    Container(
                        margin: const EdgeInsets.only(top: 5),
                        child: const Text("Ambil dari Galeri"))
                  ],
                ),
              ),
            ),
          ]),
          Container(
              width: double.infinity,
              padding: const EdgeInsets.symmetric(vertical: 10),
              margin: const EdgeInsets.only(top: 20),
              color: Theme.of(context).colorScheme.primary,
              child: const Text(
                'TUTUP',
                textAlign: TextAlign.center,
                style: TextStyle(
                    color: Colors.white,
                    fontSize: 20,
                    fontWeight: FontWeight.bold),
              ))
        ],
      ),
    );
  }

  Future getImage(ImageSource src) async {
    var image = await _picker.pickImage(source: src);
    setState(() {
      _image = image;
    });
  }
}

Demikian tutorial kali ini..semoga tulisan ini bermanfaat untuk yang membaca tulisan ini serta untuk penulis pribadi....

Demo aplikasi silahkan klik disini

Terima kasih!!!!

Source Code Aplikasi Resep masakan menggunakan Flutter

Hari ini saya ingin membagikan source code aplikasi resep masakan menggunakan Flutter,dimana aplikasi ini menggunakan API dari https://masak-apa-tomorisakura.vercel.app/ dan sudah mendukung null safety.

Aplikasi ini memiliki fitur:
1. Daftar resep terbaru
2. Daftar resep per kategori
3. Daftar kategori
4. Pencarian resep

Beberapa tampilan dari aplikasi ini





Demo aplikasi silahkan klik disini

Untuk mendownload source code nya silahkan klik tombol di bawah
download[4]

Menampilkan Tombol Flutter Hot Restart di Navigation Bar Toolbar pada Android Studio

    Default tampilan actions flutter pada bagian Navigation Bar Toolbar yang ada pada Android Studio tidak ada tombol Flutter Hot Restart namun berada pada bagian bawah di menu Debug seperti gambar dibawah. Dan setelah otak atik Android Studio, saya menemukan cara mengatasi masalah yang saya sebutkan diatas...


Adapun cara untuk Menampilkan Tombol Flutter Hot Restart di  Navigation Bar Toolbar...
Pertama pilih menu File lalu pilih Settings (atau menggunakan kombinasi tombol Ctrl+Alt+S) maka akan muncul halaman settings. Selanjutnya pada menu Appearance & Behavior pilih sub menu Menus and Toolbars lalu klik folder Run/Debug.


Selanjutnya klik simbol Plus/Tambah maka akan muncul popup lalu pilih Add Action

Maka akan muncul tampilan untuk menambahkan Actions baru, pada kolom search masukkan kata Flutter hot restart selanjutnya pilih action tersebut lalu klik OK. 

Jika berhasil menambahkan action tadi maka akan muncul daftar actions seperti gambar di bawah lalu klik OK

Jika semua langkah berhasil dilakukan maka tampilan Android Studio akan seperti gambar dibawah





Membuat Bottom Navigation Bar dengan Flutter

Selamat siang teman teman hari ini saya akan membagikan tutorial cara membuat Bottom Navigation Bar dengan menggunakan Flutter....

Contoh Bottom Navigation Bar yang akan kita buat seperti gambar di bawah:


Pertama tama kita sediakan 2 file dart dengan nama:
  1. home.dart
  2. bottom_navigation.dart

Adapun code untuk File home.dart sebagai berikut:

import 'package:bottom_navigation_bar/bottom_navigation.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const BottomNavigation(title: 'Bottom Navigation Bar'),
    );
  }
}

Selanjutnya untuk file bottom_navigation.dart masukkan code dibawah:

import 'package:flutter/material.dart';

class BottomNavigation extends StatefulWidget {
  const BottomNavigation({Key? key, required this.title}) : super(key: key);
  final String title;

  @override
  State<BottomNavigation> createState() => _BottomNavigationState();
}

class _BottomNavigationState extends State<BottomNavigation> {
  int currentPage = 0;
  String text = "Home Page";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Text(text),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => setPage(4, "Add Items"),
        child: const Icon(
          Icons.add,
          color: Colors.white,
          size: 30,
        ),
      ),
      floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
      bottomNavigationBar: BottomAppBar(
        color: Colors.blue,
        shape: const CircularNotchedRectangle(),
        child: Container(
          padding: const EdgeInsets.symmetric(vertical: 5),
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              IconButton(
                  onPressed: () => setPage(0, "Home Page"),
                  icon: Icon(
                    Icons.home,
                    color: currentPage == 0 ? Colors.white : Colors.grey,
                    size: 30,
                  )),
              IconButton(
                  onPressed: () => setPage(1, "Search Page"),
                  icon: Icon(
                    Icons.search,
                    color: currentPage == 1 ? Colors.white : Colors.grey,
                    size: 30,
                  )),
              const SizedBox(),
              IconButton(
                  onPressed: () => setPage(2, "Notifications Page"),
                  icon: Icon(
                    Icons.notifications,
                    color: currentPage == 2 ? Colors.white : Colors.grey,
                    size: 30,
                  )),
              IconButton(
                  onPressed: () => setPage(3, "History Page"),
                  icon: Icon(
                    Icons.history,
                    color: currentPage == 3 ? Colors.white : Colors.grey,
                    size: 30,
                  )),
            ],
          ),
        ),
      ),
    );
  }

  void setPage(int index, String text) {
    setState(() {
      currentPage = index;
      this.text = text;
    });
  }
}

Jika cara diatas sudah dilakukan maka selanjutnya jalankan aplikasi, jika tampilan aplikasi sama dengan contoh diatas....SELAMAT anda sudah bisa membuat Bottom Navigation Bar dengan Flutter

Untuk lebih jelasnya silahkan lihat tutorial nya di video berikut
Link Youtube