Skip to content

B. Data JSON

1. Data JSON

Pada pertemuan kali ini kita akan membahas mengenai data json. Kita akan membuat data json kita sendiri & memanipulasikan data tersebut.
Yang pertama kita lakukan adalah membuat file baru dengan nama table_user.dart. Sebelum kita mulai install terlebih dahulu package data table 2

Terminal
pub add data_table_2
Selanjutnya kita akan membuat tampilannya

table_user.dart
// ignore_for_file: sized_box_for_whitespace, prefer_const_constructors, prefer_is_empty, prefer_const_literals_to_create_immutables, avoid_print, sort_child_properties_last

import 'package:flutter/material.dart';

class TableUser extends StatefulWidget {
  const TableUser({super.key});

  @override
  State<TableUser> createState() => _TableUserState();
}

class _TableUserState extends State<TableUser> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Data User"),
        centerTitle: true,
        backgroundColor: Colors.green[300],
      ),
      body: Container(
        padding: const EdgeInsets.all(40),
        child: SingleChildScrollView(
          child: Column(children: [
            Container(
                    width: MediaQuery.of(context).size.width,
                    child: DataTable(
                        columns: [
                          DataColumn(label: Text("No")),
                          DataColumn(label: Text("Email")),
                          DataColumn(label: Text("Action")),
                        ],
                        rows: List.generate(
                            10,
                            (index) => DataRow(cells: [
                                  DataCell(Text((index + 1).toString())),
                                  DataCell(Text("Tes@gmail.com")),
                                  DataCell(Row(
                                    children: [
                                      IconButton(
                                          onPressed: () {},
                                          icon: Icon(Icons.edit)),
                                      IconButton(
                                          onPressed: (){},
                                          icon: Icon(Icons.delete))
                                    ],
                                  ))
                                ]))),
                  )
          ]),
        ),
      ),
      floatingActionButtonLocation: FloatingActionButtonLocation.endFloat,
      floatingActionButton: FloatingActionButton(
        onPressed: () {},
        child: Icon(Icons.add),
        backgroundColor: Colors.green,
      ),
    );
  }
}

Selanjutnya kita akan mendaftarkan tampilan yang sudah kita buat di main.dart

main.dart
routes: {
    '/': (context) => MyHomePage(),
    '/hal1': (context) => Page1(),
    '/hal2': (context) => Page2(),
    '/hal3': (context) => Page3(),
    '/user':(context) => TableUser()
}

Lalu di bawah tombol next page kita akan membuat tombol untuk ke tabel user

children: [
    Container(
        margin: EdgeInsets.only(bottom: 20),
        child: ElevatedButton(
            onPressed: () => Navigator.pushNamed(context, "/hal1", arguments: "Hallo Route"),
            child: const Text("Next Page")),
    ),
    ElevatedButton(
            onPressed: () => Navigator.pushNamed(context, "/user"),
            child: const Text("Table User"),
    )
]

jika dijalankan, bentuk tampilannya seperti ini:

Alt text

Keterangan

  • List generate digunakan untuk perulangan didalam children

2. Membuat Model

Selanjutnya kita akan membuat model datanya silahkan pada folder lib buat folder baru dengan nama model > lalu didalam folder model buat folder baru dengan nama user.dart. Ketikan kodenya seperti ini:

user.dart
class User {
  String email;
  String password;

  User(this.email, this.password);
}

List<User> dataUser = [
  User("user123@gmail.com", "abc"),
  User("user456@gmail.com", "def"),
  User("user789@gmail.com", "ghi")
];

untuk pembuatan model hampir mirip dengan interface yang ada di nodejs kalau di nodejs untuk mendeklarasikan tipe dapat menggunakan : sedangkan flutter dapat menggunakan <> seperti tag html.

3. Menampilkan Data JSON

Untuk menampilkan data json kita akan memulai mengedit pada file table_user.dart

table_user.dart
body: Container(
  padding: const EdgeInsets.all(40),
  child: SingleChildScrollView(
    child: Column(children: [
      dataUser.length != 0
          ? Container(
              width: MediaQuery.of(context).size.width,
              child: DataTable(
                  columns: [
                    DataColumn(label: Text("No")),
                    DataColumn(label: Text("Email")),
                    DataColumn(label: Text("Action")),
                  ],
                  rows: List.generate(
                      dataUser.length,
                      (index) => DataRow(cells: [
                            DataCell(Text((index + 1).toString())),
                            DataCell(Text(dataUser[index].email)),
                            DataCell(Row(
                              children: [
                                IconButton(
                                    onPressed: () {},
                                    icon: Icon(Icons.edit)),
                                IconButton(
                                    onPressed: () {},
                                    icon: Icon(Icons.delete))
                              ],
                            ))
                          ]))),
            )
          : Container(
              margin: EdgeInsets.only(top: 50),
              child: Center(child: Text("Data Kosong")),
            ),
    ]),
  ),
)

Keterangan

  • Jika error atau warning silahkan klik saja lampu kuning.
  • Sebelumnya kita menampilkan tabel dengan data langsung sedangkan sekarang kita menampilkan tabel berdasarkan data user yang telah kita buat di model.
  • untuk memberikan validasi disini juga ada kondisi jika datanya tidak ada maka akan menampilkan data kosong.

4. Menambahkan Data JSON

Untuk menambahkan data user di aplikasi yang kita buat, kita harus membuat form / inputnya terlebih dahulu baru nantinya kita dapat memberikan proses add Jsonnya.

Kita akan mulai dari membuat tampilan pop up, taruh kode ini diatas @override Widget build

table_user.dart
TextEditingController email = TextEditingController();
TextEditingController pw = TextEditingController();

showModal(User? data, int? index) {
  AlertDialog alert = AlertDialog(
    title: Text("Add Data"),
    content: Container(
      height: 150,
      child: Column(
        children: [
          Container(
            margin: EdgeInsets.only(bottom: 20),
            child: TextField(
              controller: email,
              decoration: InputDecoration(hintText: "example@email.com"),
            ),
          ),
          Container(
            margin: EdgeInsets.only(bottom: 20),
            child: TextField(
                controller: pw,
                obscureText: true,
                decoration: InputDecoration(hintText: "***********")),
          ),
        ],
      ),
    ),
    actions: [
      ElevatedButton(
          onPressed: () {},
          child: Text(
            "Save",
            style: TextStyle(color: Colors.white),
          ),
          style: ElevatedButton.styleFrom(backgroundColor: Colors.blue)),
      ElevatedButton(
        onPressed: () => Navigator.pop(context),
        child: Text(
          "Cancel",
          style: TextStyle(color: Colors.white),
        ),
        style: ElevatedButton.styleFrom(backgroundColor: Colors.red),
      ),
    ],
  );

  return showDialog(context: context, builder: (context) => alert);
}

Keterangan

  • Untuk membuat form tentunya kita harus membutuhkan controller agar kita bisa mendapatkan datanya
  • Show modal ada 2 parameter yang sifatnya ? yakni null safety yang sifatnya boleh diisi atau di null (kosong) kan
  • Terdapat 3 area pada showDialog yakni title, content, action

Selanjutnya kita akan membuat prosesnya

table_user.dart
saveData() {
  dataUser.add(User(email.text, pw.text));
  Navigator.pushReplacementNamed(context, "/user");
}

Lalu taruh pada onpressed

ElevatedButton(
  onPressed: () => saveData(),
  child: Text(
    "Save",
    style: TextStyle(color: Colors.white),
  ),
  style: ElevatedButton.styleFrom(backgroundColor: Colors.blue)),

Keterangan

  • Untuk menambahkan data didalam list/array kita dapat menggunakan add
  • Setelah data disimpan kita refresh halaman kita agar data yang baru bisa ditampilkan

5. Mengedit Data JSON

Untuk mengedit data list kita akan menampilkan data user 1annya terlebih dahulu baru kita dapat merubahnya. Kita akan buat ketika icon pencilnya di klik akan memunculkan pop up yang sudah ada datanya caranya :

table_user.dart
IconButton(
  onPressed: () => showModal(dataUser[index], index),
  icon: Icon(Icons.edit)
),

Pada tombol edit kita harus mengirimkan data user berserta indexnya agar nantinya kita bisa menampilkan data yang kita pilih & kita dapat merubahnya

Agar showmodal bisa untuk merubah data kita harus ubah sedikit:

table_user.dart
showModal(User? data, int? index) {
  if (data != null) {
    email.text = data.email;
    pw.text = data.password;
  }else{
    email.text = "";
    pw.text = "";
  }

  AlertDialog alert = AlertDialog(
    title: Text(data == null ? "Add Data" : "Edit Data"),
    content: Container(
      height: 150,
      child: Column(
        children: [
          Container(
            margin: EdgeInsets.only(bottom: 20),
            child: TextField(
              controller: email,
              decoration: InputDecoration(hintText: "example@email.com"),
            ),
          ),
          Container(
            margin: EdgeInsets.only(bottom: 20),
            child: TextField(
                controller: pw,
                obscureText: true,
                decoration: InputDecoration(hintText: "***********")),
          ),
        ],
      ),
    ),
    actions: [
      ElevatedButton(
          onPressed: () => data != null 
          ? editData(index!) 
          : email.text != "" && pw.text != "" 
            ? saveData() 
            : null,
          child: Text(
            "Save",
            style: TextStyle(color: Colors.white),
          ),
          style: ElevatedButton.styleFrom(backgroundColor: Colors.blue)),
      ElevatedButton(
        onPressed: () => Navigator.pop(context),
        child: Text(
          "Cancel",
          style: TextStyle(color: Colors.white),
        ),
        style: ElevatedButton.styleFrom(backgroundColor: Colors.red),
      ),
    ],
  );

  return showDialog(context: context, builder: (context) => alert);
}

Jika dicopy maka akan error karena fungsi edit belum dibuat oleh karena itu masukkan kode ini:

editData(int index) {
  dataUser[index].email = email.text;
  dataUser[index].password = pw.text;
  Navigator.pushReplacementNamed(context, "/user");
}

Keterangan

  • Pada showmodal kita memberikan kondisi dimana ketika parameter data terdeteksi mempunyai value maka controller pada input kita perbaharui agar datanya dapat ditampilkan, dan memberikan beberapa kondisi yang lain seperti judul modal & onpressed pada tombol
  • Untuk merubah data pada list kita tinggal memberikan indexnya dan data apa yang mau dirubah
  • Sama seperti add setelah proses edit kita dapat melakukan refresh

6. Menghapus Data JSON

Untuk menghapus data list kita akan membuat tombol delete ketika di klik akan menghapus data yang berada di dalam list. Masukkan kode ini di bawah editData

table_user.dart
deleteData(int index){
  dataUser.removeAt(index);
  Navigator.pushReplacementNamed(context, "/user");
}

Lalu berikan proses untuk menghapus datanya tersebut

IconButton(
  onPressed: () => deleteData(index),
  icon: Icon(Icons.delete))

Keterangan

  • removeAt digunakan untuk menghapus data berdasarkan index nya
  • jangan lupa untuk merefresh nya