Web Programming 2: Laravel & Flutter
Web Programming 2: Laravel & Flutter
Pertemuan 1 ............................................................................................................................................... 4
1.1. Framework Web ......................................................................................................................... 4
1.2. Mengapa Laravel ........................................................................................................................ 5
1.3. Paket Aplikasi Pengembangan PHP ........................................................................................... 5
3.2. Mendaftarkan Direktori PHP ...................................................................................................... 8
3.3. Pemasangan Composer ............................................................................................................ 10
3.4. Pemasangan Laravel ................................................................................................................. 13
3.5. IDE Pengembangan Aplikasi Web ............................................................................................ 14
3.6. Aplikasi Presensi ....................................................................................................................... 17
3.7. Rancangan Database Presensi.................................................................................................. 18
3.8. Membuat Database Menggunakan Migration ........................................................................ 19
Tugas Rumah ........................................................................................................................................ 26
Pertemuan 2 ............................................................................................................................................. 28
2.1. Konsep MVC ............................................................................................................................. 28
2.2. Jenis-Jenis MVC ........................................................................................................................ 28
2.3. Model di Laravel ....................................................................................................................... 29
2.4. Membuat Model di Laravel ...................................................................................................... 29
2.5. Controller di Laravel ................................................................................................................. 35
2.6. Membuat Controller di Laravel ................................................................................................ 35
2.7. Mengatur Routing .................................................................................................................... 41
2.8. Pengujian .................................................................................................................................. 42
Latihan .................................................................................................................................................. 45
Tugas Rumah ........................................................................................................................................ 47
Pertemuan 3 ............................................................................................................................................. 49
3.1. Pengenalan Flutter ................................................................................................................... 49
3.2. Pemasangan Flutter SDK .......................................................................................................... 49
Pertemuan 1
Target:
Biasanya dalam suatu framework web telah menyediakan pengelolaan library untuk
pengelolaan session, pengelolaa data, cache dan lain sebagainya. Pada umumnya
framework web menggunakan pola sistem / pattern MVC (Model View Controller) untuk
memisahkan kode antara pengelolaan basis data (Model), kode tampilan / User
Interface (View) dan pengendali request dan response (Controller).
Ada banyak framework web yang ada berdasarakan bahasa pemrograman yang
digunakan. Pada umumnya bahasa pemrograman yang dapat digunakan untuk
membuat aplikasi website seperti: Python, PHP, Java, NodeJS, Dart, dan lain sebagainya,
Contoh framework web untuk bahasa pemrograman PHP seperti: Laravel, CakePHP,
CodeIgniter, Symfony, Yii, ZendFramework dan lain sebagainya. Untuk framework web
bahasa pemrograman tersedia seperti: Apache Struts, Apache Wicket, Javaserver Faces,
JT Design Pattern Framework dan lain sebagainya. Sedangkan Framework untuk Bahasa
pemrograman dari Microsoft ada .NET.
Untuk penggunakan paket aplikasi pada praktik ini menggunakan paket aplikasi dari
XAMPP. Pada aplikasi XAMPP semua aplikasi Webserver, PHP dan database MariaDB
telah dibundle jadi satu sehingga memudahkan instalasi dan penggunaannya.
Untuk menggunakan Laravel pastikan menggunakan PHP 7 untuk hasil yang lebih
optimal. Langkah persiapan aplikasi XAMPP:
[Link]
2. Pilih file installer sesuai dengan sistem operasi dan teknologi komputer yang
dimiliki.
a. Windows 64-bit : [Link]
[Link]
b. Linux 64-bit: [Link]
[Link]
c. OS X : [Link]
[Link]
- Cari service dengan nama “apache php7”, jalankan service ini dengan klik
tombol “Start”
b. MySQL Service
Untuk menjadikan service persisten saat Windows boot jalankan:
run as administrator command prompt.
<direktori xampp>\mysql\bin\[Link] –install “MySQL Services”
- Cari service dengan nama “MySQL Services”, jalankan service ini dengan klik
tombol “Start”
Bila berhasil langkah diatas cukup dilakukan sekali, maka setiap komputer boot
mulai maka kedua services diatas (apache dan MySQL sudah berjalan)
4. Pada bagian User Variables, pilih varible “Path” dan klik tombol “Edit…”
5. Tambahkan dengan klik “New” dan isikan alamat direktori php berada, yaitu seperti
berikut: c:\xampp\php.
Setelah itu klik OK.
5. Composer yang telah sukses di pasang akan menjadi file [Link]. bila
berhasil, maka hapus saja file [Link], karena tidak diperlukan lagi.
Del [Link]
Untuk melihat hasil unduhan project Laravel dapat kita lihat pada direktori presensi.
Untuk memudahkan pengembangan baiknya menggunakan IDE yang memiliki fitur fitur
Snippets / intellisense, yaitu fitur menampilkan cuplikan saran kode yang dapat
dilanjutkan setiap kode perintah Laravel yang hendak dituliskan, sehingga memudahkan
penulisan kode secara guidelines. Contoh IDE yang dapat digunakan untuk memudahkan
pengkodean adalah Visual Studio Code (VSCode) di
[Link] Pilih sesuai Sistem operasi dan arsitektur
prosesor komputer yang digunakan. IDE ini dikembangkan oleh komunitas dari
Microsoft, dapat dijadikan menjadi IDE yang bermacam-macam sesuai plugins yang
dipasang. IDE ini termasuk dapat dikatakan powerful dan yang terpenting gratis.
Pilihan lain IDE yang pintar adalah PHPStorm dari JetBrains yang dapat di unduh di
[Link] Namun karena
sifatnya berbayar, kita tidak dapat menggunakannya secara bebas, tapi dapat
menggunakan fitur Trial 30 hari atau mendaftar sebagai Pelajar untuk dapat
menggunakannya secara gratis selama 1 tahun.
Agar VSCode lebih optimal digunakan penulisan kode menggunakan framework Laravel,
maka harus memasang extension tambahan dari marketplace VSCode. Untuk
pemasangan diperlukan koneksi daring Internet.
Untuk pemasangan ekstensi, klik menu Extension pada bagian sisi panel sebelah
kanan IDE. Contoh seperti gambar berikut:
Ketikkan kata kunci “Laravel” pada bagian pencarian seperti di gambar 1.14. Install
ekstension seperti:
1. Laravel Blade Snippets : ini untuk membantu penulisan kode blade pada pembuatan
view (user interface) di Laravel.
2. Laravel 5 Snippets : Ekstensi ini untuk membantu menampilkan cuplikan bantuan
penulisan kode perintah Laravel 5.
3. PHP Intellisense : membantu memberi saran penulisan kode program PHP.
Bila semua kebutuhan diatas telah disiapkan, maka kita mulai siap ke medan tempur.
1. Kebutuhan fungsional
a. Setiap tigkatan pengguna untuk akses ke aplikasi harus melakukan login sebagai
bentuk identifikasi sistem kepada pengguna.
b. Tingkat Administrasi memiliki kewenangan mengelola data karyawan (Tambah,
ubah, hapus, cari). Serta dapat melihat rekapitulasi kehadiran tiap karyawan
dalam 1 periode, yaitu dihitung setiap tanggal 24 pada bulan n-1 sampai dengan
tanggal 23 bulan n. Menampilkan kesimpulan status kehadiran tiap harinya,
apakah datang tepat waktu, telat atau tidak masuk.
c. Administrasi mencetak resume rekapitulasi kehadiran semua karyawan pada
periode bulan yang diinginkan. Menampilkan jumlah kehadiran, jumlah tidak
hadir dan jumlah keterlambatan.
d. Karyawan dapat melakukan presensi masuk dan pulang.
e. Karyawan dapat melihat rekap kehadirannya dalam periode yang dinginkan.
2. Kebutuhan non-fungsional
a. Aplikasi harus terhubung secara intranet
b. Setiap data harus tersimpan di server basis data.
Untuk menggunakan fitur ini, pastikan bahwa pengaturan koneksi basis data telah
ditentukan. Untuk mengatur konfigurasi koneksi basis data edit file .env seperti contoh
berikut:
Setelah itu masuk ke Terminal pada VSCode seperti pada gambar berikut:
Perintah ini akan menghasilkan sebuah file yang berada di folder /database/migrations.
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop($this->table);
}
}
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
Jalankan langkah yang sama pula untuk membuat Migration PresensiHarian melalui
artisan di terminal:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
Sebelum menjalankan file migration diatas, pastikan di MySQL telah di ciptakan database
dengan nama : db_presensi.
Membuat database dapat melalui aplikasi MySQL Editor seperti: SQLYog, PHPMyAdmin,
MySQLWorkBrench maupun MySQL CLI.
Tugas Rumah
1. Buatlah Database : db_tokobangunan
2. Buatlah table melalui Migration dari Laravel, sebagai berikut:
a. “karyawan”
b. “produk”
c. “penjualan”
d. “penjualan_has_produk”
Catatan:
Relasikan tabel “penjualan_has_produk” dengan tabel “penjualan” dan tabel “produk”
Relasikan tabel “penjualan” dengan tabel “pengguna”
Pertemuan 2
Target:
Perintah diatas harus dijalankan di satu path di project Laravel yang memiliki file
Artisan. Perintah ini akan menciptakan sebuah File yang berada di Folder:
app\Model dengan nama [Link].
<?php
namespace App\Model;
use Illuminate\Database\Eloquent\Model;
Bawaan dari Laravel, memiliki field CREATED_AT dan UPDATED_AT sebagai Log
setiap transaksi data yang terjadi pada tabel. Apabila tabel yang dibuat tidak
menggunakan nama-nama field tersebut, maka konstanta CREATED_AT
maupun UPDATED_AT harus di set null, untuk menghindari terjadinya
kesalahan transaksi CREATE dan UPDATE. Contoh sebagai bierkut:
<?php
namespace App\Model;
use Illuminate\Database\Eloquent\Model;
Kondisi diatas tidak perlu dilakukan apabila setiap tabel yang dibuat memang
diperlukan Log atau catatan setiap adanya transaksi CREATE dan UPDATE.
<?php
namespace App\Model;
use Illuminate\Database\Eloquent\Model;
Lakukan langkah yang sama seperti pada poin a. diatas pembuatan Model
Pengguna.
1) Jalankan perintah berikut di terminal:
php artisan make:model Model\PetaKehadiran
Operasi perintah diatas akan menghasilkan file baru yang berada di folder:
app\Model dengan nama file [Link], seperti pada gambar berikut:
<?php
namespace App\Model;
use Illuminate\Database\Eloquent\Model;
namespace App\Model;
use Illuminate\Database\Eloquent\Model;
<?php
namespace App\Model;
use Illuminate\Database\Eloquent\Model;
<?php
namespace App\Model;
use Illuminate\Database\Eloquent\Model;
Folder Auth dan beserta file tersebut boleh saja dihapus, bila kita mengingnkan
pembuatan controller yang custom.
Pada langkah ini, akan dibuatkan sebuah file Controller [Link] yang berada di
folder app\http\Controllers.
Sampai disini langkah selanjutnya adalah membuat method / blok kode program
yang bertugas sebagai pengendali komunikasi antara model mapun pada class
lainnya.
<?php
namespace App\Http\Controllers;
Pada kode blok method lihatdata diatas logik yang berjalan adalah:
- Dapatkan semua record dari model Pengguna dan disimpan ke variabel $r
$r = PenggunaModel::get()
- Return (kembalikan) nilai :
‘count’ => $r->count : total data
‘data’ => $r : data dalam bentuk array / larik
Bila diamati pada bagian atas dokumen controller Pengguna, terdapat baris:
ini merupakan baris kode untuk memuat file model Pengguna yang ada di folder
app\Model. Sedangkan as PenggunaModel adalah cara untuk memberikan alias
nama Class Model Pengguna sebagai PenggunaModel. Hal ini perlu dilakukan
mengingat nama class Model dan Controller memiliki kesamaan nama, yaitu
sama-sama “Pengguna”.
<?php
namespace App\Http\Controllers;
use App\Model\Pengguna as PenggunaModel;
Keterangan:
parameter $nip,
digunakan sebagai parameter nilai NIP sebagai nilai kunci data pengguna yang
ingin di baca.
Logik Program
<?php
namespace App\Http\Controllers;
use App\Model\Pengguna as PenggunaModel;
Method hapusData digunakan untuk menghapus data pengguna dari tabel. Data
yang dihapus berdasarkan kunci data, yaitu nip yang dikirimkan dari client
menggunakan method delete. Modifikasi controller Pengguna dengan
menambahkan method hapusData seperti berikut:
<?php
namespace App\Http\Controllers;
use App\Model\Pengguna as PenggunaModel;
Routing merupakan cara Laravel untuk menentukan arah Request dari client akan
diteruskan. Routing pada Laravel berada di folder /routes dan di dalam file [Link].
File /route/[Link] berisikan jenis method permintaan dari client dan kemana arah
jalur selanjutnya. Untuk menguji apakah controller yang telah dibuat pada langkah
sebelumnya bekerja, lakukan modifikasi isi file [Link] menjadi sebagai berikut:
Route::get('/pengguna/list-data', 'Pengguna@lihatData');
Route::get('/pengguna/ambil-data/{nip}', 'Pengguna@ambilData');
Route::post('pengguna/simpan', 'Pengguna@simpanData');
Route::delete('pengguna/hapus/{nip}', 'Pengguna@hapusData');
Parameter request
2.8. Pengujian
Pengujian request dan response dari aplikasi yang telah dituliskan diatas dapat
menggunakan tools seperti aplikasi Postman, yang dapat unduh di :
[Link]
Pengujian yang dilakukan pada tahapan ini yaitu balckbox testing. Yaitu menguji fitur /
unit yang ada berdasarkan masukan (input) dan luaran (output), apakah sesuai dengan
harapan atau tidak. Berikut item list pengujian yang akan dilakukan:
[Link]
a/simpan
TC03 Request GET ke Meminta data Mengirimkan data method GET Tampil
‘/pengguna/am dengan nip: ke url: format json
bil/2019010101’ ‘2019010101’ [Link] data
a/ambil-data/2019010101 pengguna
dengan nip
2019010101
TC04 Request DELETE Menghapus data Mengirimkan data method {result:true]
ke dari tabel DELETE ke url:
‘/pengguna/hap pengguna dengan [Link]
us/2019010101 nip ‘2019010101’ a/hapus/2019010101
1. Klik baru
Latihan
Setelah melihat contoh langkah-langkah pembuatan controller dan method diatas, buatlah
Controller sebagai berikut di terminal menggunakan artisan:
a. PetaKehadiran
b. PresensiHarian
Buatlah method pada controller PetaKehadiran sebagai berikut:
a. lihatData() : untuk mendapatkan semua data pada tabel peta_kehadiran
b. ambilData($id) : untuk mendapatkan 1 record (baris) data pada tabel peta_kehadiran
berdasarkan $id datanya.
c. simpanData() : untuk menyimpan data ke tabel peta_kehadiran. Gunakan kunci field
sebagai pembeda data baru dan data lama. Bila kunci adalah data lama maka sifatnya
update, namun bila nilai kunci baru maka sifatnya create.
d. hapusData($id) : untuk menghapus data di tabel peta_kehadiran. Nilai parameter $id
sebagai nilai kunci data record yang akan di hapus.
Buatlah method pada controller PresensiHarian dengan ketentuan sebagai berikut:
a. lihatData() : untuk mendapatkan semua data pada tabel presensi_harian.
b. ambilData($id) : untuk mendapatkan 1 record (baris) data pada tabel presensi_harian
berdasarkan $id datanya.
e. simpanData() : untuk menyimpan data ke tabel peta_kehadiran. Gunakan kunci field
sebagai pembeda data baru dan data lama. Bila kunci adalah data lama maka sifatnya
update, namun bila nilai kunci baru maka sifatnya create.
c. hapusData($id) : untuk menghapus data di tabel presensi_harian. Nilai parameter $id
sebagai nilai kunci data record yang akan di hapus.
Tugas Rumah
3. Buatlah Model di Laravel yang memiliki fungsi CRUD dan View dengan ketentuan sebagai
berikut :
a. Karyawan,
b. Produk ,
c. Penjualan dan
d. DetailPenjualan
4. Buatlah Controller di Laravel beserta method nya dengan ketentuan sebagai berikut:
a. Karyawan
1. Method lihatData()
2. Method simpanData()
3. Method hapusData()
b. Produk
1. Method lihatData()
2. Method simpanData()
3. Method hapusData()
c. Penjualan
1. Method lihatData()
2. Method simpanData()
3. Method hapusData()
4. Method lihatDetail ()
5. Method simpanDetail()
6. Method hapusDetail()
4. Buatlah blackbox testing dengan menggunakan data dummy untuk pengujian sebagai
berikut:
a. POST pada routing ‘karyawan/simpan’
b. GET pada routing ‘karyawan/list-data’
c. DELETE pada routing ‘karyawan/hapus’
d. POST pada routing ‘produk/simpan’
e. GET pada routing ‘produk /list-data’
f. DELETE pada routing ‘produk /hapus’
g. POST pada routing ‘penjualan/simpan’
h. GET pada routing ‘penjualan /list-data’
i. DELETE pada routing ‘penjualan /hapus’
j. POST pada routing ‘penjualan/simpan-detail’
k. GET pada routing ‘penjualan /list-detail
l. DELETE pada routing ‘penjualan /hapus-detail’
Pertemuan 3
Target:
Yang harus dilakukan adalah mengunduh Flutter SDK yang diperlukan di:
a. Windows: [Link]
b. Mac Os : [Link]
c. Linux : [Link]
Setelah file Flutter SDK telah di unduh, ekstrak paket file ke direktori yang diinginkan.
Misalkan disini contohnya ekstrak di D:\Flutter_sdk\. atau sesuaikan saja direktori yang
anda sukai.
Setelah flutter SDK telah terpasang di komputer, lakukan pendaftaran direktori /bin ke
Environment Variables.
Tunggu hingga upgrade flutter selesai mengunduh pemutahiran SDK flutter. Biasanya
membutuhkan waktu yang cukup lama. Pastikan internet yang tekoneksi dan stabil
pada kecepatan yang baik.
Apabila tahapan diatas telah dilakukan dengan baik, maka pengembangan aplikasi web di
Flutter sudah dapat dilakukan.
Happy coding
Pada contoh diatas, project dibuat dengan nama “ui_presensi”. Bila sudah selesai dapat
membuka aplikasi VisualStudio Code untuk melakukan penulisan naskah program.
Pilih folder yang berisikan project flutter, kemudian klik tombol [Select Folder].
Apabila project berhasil dibuka maka struktur direktorinya terdiri dari sebagai berikut:
Pastikan folder /web ada disini, untuk memastikan bahwa Flutter yang digunakan bisa
menjalankannya menjadi aplikasi web.
[Link] : ini merupakan pengendali kebutuhan library dari luar yang ingin
digunakan pada aplikasi yang sedang akan dikembangkan. Untuk menggunakannya
pastinkan komputer dalam keadaan dalam jaringan internet untuk mengunduh setiap
library dari luar.
Bukalah file [Link] yang ada di folder /lib. Kosongkan semua isinya, dan tuliskan kode
program sebagai berikut:
[Link]
import 'package:flutter/[Link]';
main()=>runApp(AppPresensi());
);
}
}
- Class Widget menggunakan override method build(), yaitu method yang akan
dijalankan untuk merender tampilan di antar muka.
Konsepnya adalah, segala Widget yang ingin ditampilkan harus dituliskan pada method build() ini,
walaupun perintah pembuatan Widget kita pisahkan menjadi kode blok-blok yang terpisah satu
dengan lainnya.
Untuk membuat title program dituliskan pada bagian parameter title di MaterialApp,
contoh sebagai berikut:
import 'package:flutter/[Link]';
main()=>runApp(AppPresensi());
Jalankan program diatas dengan menekan tombol F5, atau menu Debug->Start
Debugging.
Konsep penulisan program di Flutter untuk membuat tampilan yaitu dapat berupa setiap
tampilan dibuatkan sebuah file class baik StatelessWidget ataupun StatefulWidget.
Perbedaan keduanya adalah sebagai berikut:
main()=>runApp(new AppPresensi());
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Presensi Online',
theme: ThemeData(
primaryColor: [Link]
),
home: Beranda()
);
}
Penjelasan Kode:
- Kode program diatas akan memulai aplikasi dengan menampilkan Widget
AppPresensi.
- Widget AppPresensi membuat Widget berupa MaterialApp dengan konfigurasi warna
utama tema adalah warna hijau, serta Widget yang digunakan adalah Beranda
- Widget Beranda() belum dibuat, maka harus dibuat selanjutnya.
import 'package:flutter/[Link]';
Widget konten(){
Widget menuKiri(){
@override
Widget build(BuildContext context) {
return Scaffold();
}
Penjelasan kode:
Siapkan method:
a. Widget konten()
b. Widget itemMenu(String label, VoidCallback onTap):
i. String label : untuk nama menu
ii. VoidCallback onTap : untuk event saat menu di-klik
c. Widget menuKiri()
D. Widget Konten
Sebagai bidang konten isi tiap menu. Isinya dinamis (berubah-ubah) sesuai menu yang
diklik, maka diperlukan variabel Widget sebagai peubah isi dari konten.
import 'package:flutter/[Link]';
Penjelasan:
Widget isiKonten : merupakan variabel Global yang digunakan nantinya sebagai peubah
isi konten.
E. Widget itemMenu
Buat item menu yang digunakan pada bagian bidang menu kiri dengan menggunakan
Widget Card dan ListTile. Isikan blok kode Widget itemMenu menjadi sebagai berikut:
Widget itemMenu(String label, VoidCallback onTap ){
return new Card(
elevation: 0,
margin: [Link](0),
child: ListTile(
onTap:onTap,
leading: new Icon( [Link] ),
title: new Text('$label')
)
);
}
Penjelasan:
itemMenu akan memproduksi Widget Card().
- Isi / child dari Card adalah : Widget ListTile()
- ListTile parameter yang digunakan yaitu:
o onTap : merupakan callback sebagai event untuk meneripa response ketika widget
di klik. Bagian ini diisikan dari parameter onTap agar penggunaannya dapat
menjadi luas.
o Leading : merupakan bidang bagian kiri widget ListTile(), yang pada umumnya
digunaakn utnuk menampilkan Widget gambar / icon.
o Title : merupakan bidang judul / isi teks dari widget ListTile().
F. Widget menuKiri
Sebagai bagian kiri tampilan yang menampilkan menu dengan menggunakan Widget
itemMenu. Isikan Widget menuKiri() menjadi sebagai berikut:
Widget menuKiri(){
return new Container(
width: 200,
child: ListView(
children: <Widget>[
itemMenu('Karyawan', (){
isiKonten = Text('Karyawan Screen');
setState(() {});
}),
itemMenu('Peta Presensi', (){
isiKonten = Text(Peta Presensi Screen');
setState(() {});
}),
itemMenu('Presensi Harian', (){
isiKonten = Text(Presensi Harian Screen');
setState(() {});
})
],
)
);
}
Penjelasan:
Widget menuKiri akan memproduksi Widget Container() dengan lebar 200, isi dari
Container adalah Widget ListView(). Di ListView menampilkan widget-widget itemMenu
diantaranya untuk menu: Karyawan. Peta Presensi dan Presensi Harian.
Widget ListView() merupakan widget untuk menampilkan widget-widget yang tersusun baik secara
horizontal atau vertical. Widget ini akan membuat tampilan dapat di Scroll bila widget yang harus
ditampilkan melebihi dari ukuran layar.
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
leading: IconButton(
icon: Icon([Link],),
onPressed: (){
}
),
elevation: 0,
title: Text('Sistem Informasi Presensi')
),
body:Row(
crossAxisAlignment: [Link],
children: <Widget>[
menuKiri(),
konten()
],
)
);
}
import 'package:flutter/[Link]';
@override
void initState() {
[Link]();
isiKonten = Text('Selamat datang');
Widget menuKiri(){
return new Container(
width: 200,
decoration: new BoxDecoration(
color: [Link],
boxShadow: <BoxShadow>[
///buat bayangan di meru kiri
BoxShadow(
color: [Link][300],
offset: Offset(3,2),
blurRadius: 10
)
]
),
child: ListView(
children: <Widget>[
itemMenu('Karyawan', (){
isiKonten = Text('Karyawan Screen');
setState(() {});
}),
itemMenu('Peta Presensi', (){
isiKonten = Text(Peta Presensi Screen');
setState(() {});
}),
itemMenu('Presensi Harian', (){
isiKonten = Text(Presensi Harian Screen');
setState(() {});
})
],
)
);
}
Widget konten(){
return Flexible(
child: isiKonten
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
leading: IconButton(
icon: Icon([Link],),
onPressed: (){
}
),
elevation: 0,
title: Text('Sistem Informasi Presensi')
),
body:Row(
crossAxisAlignment: [Link],
children: <Widget>[
menuKiri(),
konten()
],
)
);
}
Agar aplikasi dapat berjalan, maka gunakan Widget beranda di main dengan import file
[Link] ke file [Link]. Seperti code berikut:
main()=>runApp(new AppPresensi());
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Presensi Online',
theme: ThemeData(
primaryColor: [Link]
),
home: Beranda()
);
}
I. Menjalankan Program
Untuk menjalankan program, pilih menu [Debug] -> [Start Debugging] atau dengan
menekan tombol [F5]. Apabila muncul “select a device to use” pilih saja HeadLess Server.
Hingga tulisan ini dibuat, device Chrome masih memiliki kendala, walaupun mendukung
realtime hot restart namun masih banyak kendala. Maka anjuran saat ini gunakan Headless
Server, walaupun sedikit report, namun setidaknya lebih stabil.
Kemudian tunggu hingga Flutter melakukan compile selesai, maka selanjutnya akan
menampilkan alamat URL yang tampil untuk melihat hasil jalannya aplikasi pada bagian
DEBUG CONSOLE.
Gunakan alamat sesuai yang muncul seperti diatas, tiap kali compile bisa saja berbeda
port alamatnya. Contoh hasil menjalankan program diatas yaitu seperti berikut:
A. Widget KaryawanScreen
Halaman Karyawan yang akan dibuat nantinya memiliki ListView untuk menampilkan
item data, serta FloatActionButton untuk membuka form pengisian data.
Buat file di /lib dengan nama [Link], isikan naskah sebagai berikut:
import 'package:flutter/[Link]';
@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton:FloatingActionButton(),
body: Container()
);
}
}
Berikut Struktur desain tampilannya yang akan dibuat contoh sebagai berikut:
B. Widget [Link]()
Widget ini digunakan untuk menampilkan data di listview. Isikan blok Widget item(int x)
sebagai berikut:
} ,
title: Text('isi daftar karyawan ke $x'),
subtitle: Text('subtitle isi $x'),
leading: Icon(Icons.supervised_user_circle)
)
),
],
);
}
Penjelasan:
- Widget item(int x):
o Parameter : int x = sebagai masukan berupa informasi index data.
o Widget item akan memproduksi Widget Column yang isinya berupa Widget
Card dengan isi berupa Listtile().
C. Widget [Link]()
Modifikasi isi Widget build menjadi sebagai berikut:
@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: FloatingActionButton(
onPressed: (){
},
backgroundColor: [Link],
child: Icon(Icons.add_box)
),
body: Card(
margin: [Link](20),
child: Container(
padding: [Link](20),
child: Column(
mainAxisAlignment: [Link],
crossAxisAlignment: [Link],
children: <Widget>[
Text('Data Karyawan', style: TextStyle(fontSize: 20,
fontWeight: [Link])),
SizedBox(height: 10),
Expanded(
child: ListView(
children: [Link](100, (x){
return item(x);
})
)
)
],
)
)
)
);
}
import 'package:app_presensi/form_karyawan.dart';
import 'package:flutter/[Link]';
} ,
title: Text('isi daftar karyawan ke $x'),
subtitle: Text('subtitle isi $x'),
leading: Icon(Icons.supervised_user_circle)
)
),
],
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: Container(
padding: [Link](50),
child: FloatingActionButton(
onPressed: (){
},
backgroundColor: [Link],
child: Icon(Icons.add_box)
),
),
body: Card(
margin: [Link](20),
child: Container(
padding: [Link](20),
child: Column(
mainAxisAlignment: [Link],
crossAxisAlignment: [Link],
children: <Widget>[
Text('Data Karyawan', style: TextStyle(fontSize: 20,
fontWeight: [Link])),
SizedBox(height: 10),
Expanded(
child: ListView(
children: [Link](100, (x){
return item(x);
})
)
)
],
)
)
)
);
}
}
),
child: ListView(
children: <Widget>[
itemMenu('Karyawan', (){
isiKonten = Text('Karyawan Screen'); /// ubah ini
setState(() {});
}),
Ubah perintah
isiKonten = Text(‘Karyawan Screen’);
menjadi perintah:
isiKonten = KaryawanScreen();
Contoh sebagai berikut:
itemMenu('Karyawan', (){
isiKonten = KaryawanScreen(); /// menjadi seperti ini
setState(() {});
}),
Tujuannya adalah agar ketika menu Karyawan di klik, maka isi koten menggunakan
Widget KaryawanScreen(). Setelah dituliskan, jangan lupa menambahkan import file
[Link] di header dokumen [Link], seperti contoh berikut:
import 'package:app_presensi/[Link]'; ///tambahkan import ini
import 'package:flutter/[Link]';
Untuk melihat hasilnya jalankan program, gunakan alamat URL yang diproduksi dari hasil
compile Flutter web, dan refresh pada browser. Setelah aplikasi tampil, lihat hasilnya
dengan klik menu Karyawan. Apa hasilnya? Harusnya seperti gambar berikut:
Latihan
Buatlah Widget PetaKehadiranScreen dan PresensiScreen desain mirip seperti Widget
KaryawanScreen. Serta sambungkan ke halaman beranda, bila menu Peta Kehadiran di
klik maka muncul halaman Peta Kehadiran. Bila menu Presensi di klik maka muncul
halaman Presensi.
Tugas Rumah
5. Buatlah View FlutterWeb, sebagai berikut:
a. Tampilan Dashboard yang memiliki menu sisi kiri diantaranya:
- Karyawan
- Produk
- Penjualan
- Laporan Penjualan
b. Menu Karyawan:
- Menampilkan konten di sebelah kanan menu berupa tulisan secara vertikal:
o Nama
o Gender
o Sandi
c. Menu Produk:
- Menampilkan konten di sebelah kanan menu berupa tulisan secara vertikal
o Produk
o Harga
o stok
d. Menu Penjualan
- Menampilkan konten di sebelah kanan menu berupa tulisan secara vertikal
o Tgl
o Produk
o Harga
o total
-
Pertemuan 4
Target Pencapaian:
Dart memiliki fitur untuk menjalankan suatu proses yang dianggap dapat menjadi
hambatan untuk dipisah dari proses utama, yaitu namanya asynchronous (tidak singkron)
atau disingkat dengan async. Untuk menggunakan Async, seringkali dipandankan dengan
Future, karena hasil proses secara async tidak boleh ditunggu di proses utama, dan
diterima pada waktu yang tidak terduga melalui Future. Contoh proses yang memiliki
hambatan adalah menunggu kiriman data dari server, atau mengirimkan data ke server.
Maka proses-proses seperti ini harus dilakukan di luar proses utama dengan menggunakan
Async.
Berikut contoh pembuatan method async:
Future loadData() async{
///perintah load data dari server disini…
return hasil;
}
akan dijalankan tanpa menunggu proses didalamnya selesai, dikarenakan dilakukan secara
tidak singkron. Namun nilai baliknya di kirimkan melalui then pada waktu yang tidak dapat
ditentukan.
Namun perintah async boleh ditunggu didalam proses async dengan menggunakan
perintah await, contoh seperti berikut:
Future loadData()async{
///perintah ambil data dari server
return hasil;
}
Future proses()async{
final h = await loadData();
}
Contoh daitas proses adalah method async yang menjalankan loadData async, sehingga
boleh ditunggu dengan menggunakan await, dan hasilnya dapat langsung didapatkan oleh
variabel assignment yaitu pada contoh diatas adalah variabel h. Dengan cara seperti ini
penulisan kode menjadi lebih ringkas karena tidak perlu menggunakan then.
Framework Laravel tersedia plugin middleware untuk CORS. Plugins ini bisa didapatkan di
[Link] Atau menggunakan composer di project laravel
untuk mengunduhnya.
Untuk pembuatan CORS di Laravel, dapat menggunakan Middleware agar aplikasi Laravel
melayani request dari Client dengan memberikan header ‘Access-Control-Allow-Origin’.
Langkah pembuatannya, siapkan Middleware di Laravel yang kita beri nama ‘Cors’.
Jalankan perintah pembuatan aritsan make:middleware di Terminal seperti contoh berikut:
Lakukan modifikasi pada isi file [Link] tersebut, ditambahkan perintah header(‘Access-
control-Allow-Origin, ‘*’), seperti contoh berikut:
Setelah ditambahkan header seperti contoh diatas, simpan dan gunakan middleware Cors
di project Laravel. Untuk menggunakan middleware, lakukan modifikasi di file
/app/Http/[Link].
Pastikan komputer sedang dalam jaringan internet, karena perintah diatas bertujuan untuk
melakukan pengunduhan dari server dart plugins.
import 'package:app_presensi/form_karyawan.dart';
import 'package:flutter/[Link]';
import 'package:http/[Link]' as http; tambahkan ini
Penjelasan:
- [Link] adalah perintah untuk request data ke alamat yang dituju, method yang
digunakan adalah get. Perintah ini adalah perintah hambatan yang menghasilkan
nilai balik untuk waktu yang tidak dapat dipastikan, sehingga gunakan await untuk
menunggu hasilnya yang kemudian di berikan kepada variabel r.
Web Programming 2 - Pertemuan 1 | Universitas Bina Sarana Informatika 81
Agung Sasongko, [Link] | Sistem Informasi
- [Link] : perintah untuk konversi json string ke type List / Map. Nilai yang di
konversi adalah [Link], yang merupakan nilai balik dari hasil permintaan dari
server.
- setState((){}); : perintah ini digunakan untuk membuat tampilan di render ulang.
e. Panggil refresh
Panggil method refresh di bagian initState(). Tujuannya agar perintah refresh berjalan
setiap kali widget KaryawanScreen ditampilkan.
Future refresh()async{
final r = await [Link]('[Link]
data = [Link]([Link]);
setState(() {});
}
@override
void initState() {
[Link]();
refresh(); tambahkan ini
}
f. Widget item()
Widget item sebelumnya dibuat untuk menampilkan test tampilan, contoh berikut
Widget item untuk menampilkan data berupa isi dari “nip” dan “nama”. Contoh seperti
berikut:
Widget listViewKaryawan(){
//Expanded digunakan pada Listview yang ingin diletakkan di dalam column / r
ow
return Expanded(
child: ListView(
children: [Link]((s){
return item(s);
}).toList()
),
);
}
h. Widget build()
Pada pertemuan 3, widget build dibuat untuk menampilkan item listview yang dibuat
secara generate. Para praktikum kali ini, sekenario program yang akan dibuat adalah
selain menampilkan data karyawan di listview, juga kita berikan aksi pada tombol
@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: FloatingActionButton(
onPressed: (){
showDialog( context: context,
builder: (c)=>Dialog(
child: FormKaryawanScreen()
)
);
},
backgroundColor: [Link],
child: Icon(Icons.add_box)
),
body:Card(
margin: [Link](20),
child: Container(
padding: [Link](20),
child: Column(
mainAxisAlignment: [Link],
crossAxisAlignment: [Link],
children: <Widget>[
Text('Data Karyawan',
style: TextStyle(fontSize: 20, fontWeight: [Link])
),
SizedBox(height: 10),
listViewKaryawan() gunakan widget listview di sini
],
)
)
)
);
}
Berikut kode lengkap dari file [Link]
import 'dart:convert';
import 'package:app_presensi/form_karyawan.dart';
import 'package:flutter/[Link]';
import 'package:http/[Link]' as http;
@override
void initState() {
[Link]();
refresh();
}
Future refresh()async{
final r = await [Link]('[Link]
data = [Link]([Link]);
setState(() {});
}
Widget listViewKaryawan(){
//Expanded digunakan pada Listview yang ingin diletakkan di dalam column / row
return Expanded(
child: ListView(
children: [Link]((s){
return item(s);
}).toList()
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: Container(
padding: [Link](50),
child: FloatingActionButton(
onPressed: (){
showDialog(
context: context,
builder: (c)=>Dialog(
child: FormKaryawanScreen()
)
);
},
backgroundColor: [Link],
child: Icon(Icons.add_box)
),
),
body: Card(
margin: [Link](20),
child: Container(
padding: [Link](20),
child: Column(
mainAxisAlignment: [Link],
crossAxisAlignment: [Link],
children: <Widget>[
Text('Data Karyawan',
style: TextStyle(
fontSize: 20,
fontWeight: [Link]
)
),
SizedBox(height: 10),
listViewKaryawan()
],
)
)
)
);
}
}
import 'package:flutter/[Link]';
a. Widget inputText.
Widget ini dibuat sebagai template untuk bidang input data teks, contoh seperti
berikut:
b. Buat TextEditController
Controller TextField diperlukan untuk mengendalikan isi dari Widget TextField.
Controller yang dibutuhkan pada inputan data yaitu : NIP, Nama dan Sandi.
class _FormKaryawanScreenState extends State<FormKaryawanScreen> {
///Tambahkan seperti berikut:
TextEditingController txtNama = TextEditingController(),
txtNIP = TextEditingController(),
txtSandi = TextEditingController();
@override
Widget build(BuildContext context) {
return Container(
padding: [Link](20),
child: Column(
crossAxisAlignment: [Link],
children: <Widget>[
Text('Form Karyawan', style: TextStyle(fontSize: 20),),
Divider(),
inputText('NIP', txtNIP),
inputText('Nama', txtNama),
inputText('Sandi', txtSandi),
],
),
);
}
child: Column(
crossAxisAlignment: [Link],
children: <Widget>[
Text('Form Karyawan', style: TextStyle(fontSize: 20),),
Divider(),
inputText('NIP', txtNIP),
inputText('Nama', txtNama),
dropDownLevel('', (s){ /// digunakan seperti ini
}),
inputText('Sandi', txtSandi),
],
),
);
}
Untuk mendapatkan nilai perubahan pada Widget dropDownLevel maka diperlukan sebuah
variable global. Misalkan namanya adalah String level, seperti contoh beirkut:
},
),
);
}
children: <Widget>[
Text('Form Karyawan', style: TextStyle(fontSize: 20),),
Divider(),
inputText('NIP', txtNIP),
inputText('Nama', txtNama),
dropDownLevel('$level', (s){
setState(() {
level = s;
});
}),
inputText('Sandi', txtSandi),
SizedBox(height: 30,), ///<-- sebagai jarak textfield dengan button
btnKirim() tambahakn widget ini disini
],
),
);
}
Future kirimData()async{
Future kirimData()async{
final r = await [Link]('[Link] body: {
'nip' : [Link],
'nama' : [Link],
'sandi' : [Link],
'level' : level
});
//tampilkan debug untuk melihat hasil nilai balik yang diterim final r
print('isi dari r ${[Link]}');
}
d. Gunakan method kirimData()
Untuk menggunakan method kirimData() maka letakkan perintah pemanggilan di
onPressed Widget btnKirim seperti contoh berikut:
Widget btnKirim(){
return Center(
child: RaisedButton(
color: [Link],
shape: RoundedRectangleBorder(borderRadius: [Link](10)),
child: Text('Kirim', style: TextStyle(color: [Link]),),
onPressed: (){
kirimData(); tambahkan ini disini
},
),
);
}
import 'package:flutter/[Link]';
import 'package:http/[Link]' as http;
Future kirimData()async{
final r = await [Link]('[Link] body: {
'nip' : [Link],
'nama' : [Link],
'sandi' : [Link],
'level' : level
});
//debug untuk melihat hasil nilai balik yang diterim final r
print('isi dari r ${[Link]}');
}
Widget btnKirim(){
return Center(
child: RaisedButton(
color: [Link],
shape: RoundedRectangleBorder(borderRadius: [Link](10)),
child: Text('Kirim', style: TextStyle(color: [Link]),),
onPressed: (){
kirimData();
},
),
);
}
@override
Widget build(BuildContext context) {
return Container(
padding: [Link](20),
child: Column(
crossAxisAlignment: [Link],
children: <Widget>[
Text('Form Karyawan', style: TextStyle(fontSize: 20),),
Divider(),
inputText('NIP', txtNIP),
inputText('Nama', txtNama),
dropDownLevel('$level', (s){
setState(() {
level = s;
});
}),
inputText('Sandi', txtSandi),
SizedBox(height: 30,), ///<-- sebagai jarak textfield dengan button
btnKirim()
],
),
);
}
}
Simpan dan coba jalankan program diatas. Lakukan langkah percobaan berikut:
Tugas Rumah
6. Buatlah tampilan program (View) sebagai berikut:
a. Tampilan Daftar data Karyawan:
- Data berasal dari server yang diambil dari karyawan/list-data
- Ditampilkan dalam bentuk GridView
- Item pada GridView menampilkan Foto dan Nama karyawan dibawahnya, berikut
contoh desainnya:
- Bagian more : menampilkan popUpMenu dengan item:
o Sunting data
Bila dipilih akan menampilkan Form berisi data Karyawan yang ingin
di sunting.
o Hapus data
Pertemuan 5
Target Pencapaian:
Agar server selalu mengenali klien setiap kali meminta layanan data, maka baik di sisi
server maupun di sisi klien harus sama-sama menyimpan kunci. Pada kebanyakan
aplikasi web biasanya menggunakan Session sebagai kuncinya. Session ini akan
disediakan oleh sisi server dan harus disimpan di sisi klien. Setiap kali klien meminta
data ke server, maka klien harus selalu menyertakan kunci session ini di header
pengiriman data. Dengan begitu server akan selalu dapat mengenali klien yang
melakukan komunikasi dengannya.
Token yang dihasilkan diharapkan harus uniq, dan tidak boleh sama satu dengan
lainnya. Hal ini bertujuan agar server tidak salah mengenali kliennya.
Sama halnya seperti session, token juga harus disimpan baik di sisi server dan di sisi
klien. Karena mekanisme penyimpanan session berupa file pada arsitektur server
klastering penggunaan session menjadi tidak efektif karena mesin server yang melayani
bisa bergantian, sehingga apabila session telah direkam pada mesin server A dan
kemudian klien meminta layanan di waktu selanjutnya mendapatkan giliran di mesin
server B maka sessionnya menjadi tidak valid. Namun apabila informasi berupa token
yang direkam di basis data, maka apabila menggunakan klastering maka semua mesin
server akan mengakses data yang sama, sehingga informasi token yang diakses akan
selalu sama nilainya.
5.3. LocalStorage
Untuk penyimpanan token di sisi klien (Flutter web) maka dapat memanfaatkan
localstorage. Fitur ini dapat digunakan dengan menambahkan library import ‘dart:html’.
Contoh Deklarasi library:
import 'dart:html' as html;
Contoh Penggunaan:
[Link]['token'] = nilai;
Praktikum kali ini akan membuat form login, yang akan digunakan untuk pengisian NIP
dan sandi untuk di cek di server. Siapkan TextEditController untuk nip dan sandi. Berikut
kerangka Class nya.
import 'package:flutter/[Link]';
Widget tombolLogin(){ }
Widget formLogin(){ }
@override
Widget build(BuildContext context) {
return Scaffold();
}
}
Widget formLogin(){
return Card(
margin: [Link](30),
child: Container(
padding: [Link](20),
child: Column(
children: <Widget>[
TextField(),
TextField(),
tombolLogin()
],
),
)
);
}
Berikan dekorasi pada textfield berupa label dan hintText, menjadi seperti berikut:
Widget formLogin(){
return Card(
margin: [Link](30),
child: Container(
padding: [Link](20),
child: Column(
children: <Widget>[
TextField(
controller: txtNIP,
decoration: InputDecoration(
labelText: 'NIP',
hintText: 'Isikan Nomor Induk Pengguna'
),
),
TextField(
controller: txtSandi,
obscureText: true,
decoration: InputDecoration(
labelText: 'Sandi',
hintText: 'Isikan Nomor Induk Pengguna'
),
),
tombolLogin()
],
),
)
);
}
Agar txtNIP maupun txtSandi dapat digunakan sebagai controller di TextField, maka
pastikan txtNIP dan txtSandi di instance object. Perintah instance object dapat
dilakukan baik di constructor ataupun di initState(). Berikut contoh instanceObject
TextEditcontroller untuk txtNIP dan txtSandi di initState().
@override
void initState() {
[Link]();
txtNIP = new TextEditingController();
txtSandi = new TextEditingController();
}
b. Buat Tombol Login
Tombol login yang akan didesain berupa bentuk sedikut oval di sudutnya, dan
berwarna biru. Berikut contoh isi tombolLogin()
Widget tombolLogin(){
return RaisedButton(
child: Text('Login', style: TextStyle(color: [Link]),),
color: [Link],
shape: RoundedRectangleBorder(borderRadius: [Link](30)),
onPressed: (){
login();
},
);
}
c. Susun di Widget build()
Setelah semua widget diatas telah dibuat, sekarang susunlah widget di bagian
Widget build() seperti contoh berikut:
@override
Widget build(BuildContext context) {
return Scaffold(
body: SingleChildScrollView(
child: Container(
child: Center(
child: Column(
children: <Widget>[
formLogin()
],
),
),
),
),
);
}
Future login()async{
final hasil = await [Link]('[Link] body:{
'nip' : [Link],
'sandi' : [Link]
});
final js = [Link]([Link]);
if(js['result'] == true){
//perintah lakukan sesuatu berhasil login
}else{
//perintah lakukan sesuatu gagal login
}
}
Modifikasi pada bagian home diatas, ubah dari Beranda menjadi LoginScreen(),
seperti pada contoh berikut:
import 'package:app_presensi/[Link]';
import 'package:flutter/[Link]';
main()=>runApp(new AppPresensi());
@override
Widget build(BuildContext context) {
return new MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Presensi Online',
theme: ThemeData(
primaryColor: [Link]
),
home: LoginScreen()
);
}
g. Tabel Session
Buat tabel beri nama session, sebagai tabel yang menyimpan segala informasi
aktifitas login dari setiap pengguna yang masuk ke sistem.
Berikut spesifikasinya:
Tabel 1.1. Tabel Session
Nama Type Ukuran Keterangan
Token Varchar 32 Primary Key not null
Nilai Text
h. Model Session
Tambahkan model Session di Laravel untuk menghandle table Session yang telah
dibuat diatas, seperti contoh berikut:
i. Method buatToken
Method buatToken melakukan generate nilai secara acak untuk token yang akan di
simpan di tabel session, serta untuk dikirimkan ke klien.
j. Tambahkan Route
Untuk dapat di akses di klien, jangan lupa untuk menambahkan route login() di
route/[Link]:
Setelah melakukan tahapan diatas, lakukan pengujian terhadap login. Jangan lupa
menambahkan printah print untuk melihat hasil luaran dari [Link]
pengguna/login. Seperti contoh berikut
Future login()async{
final hasil = await [Link]('[Link]
body:{
'nip' : [Link],
'sandi' : [Link]
});
print('hasil login ${[Link]}'); //<--untuk melihat response dari server
final js = [Link]([Link]);
if(js['result'] == true){
//<-perintah lakukan sesuatu berhasil login
}else{
//<--perintah lakukan sesuatu gagal login
}
}
Amati hasilnya, bila terjadi kesalahan lakukan analisis dan tanyakan kepada tutor di
kelas.
5.5. Pindah ke Halaman Lain
Contoh yang akan digunakan adalah perintah ketika login berhasil pada tahapan diatas.
Kita akan membuat aplikasi berpindah dari LoginScreen ke Beranda(). Untuk berpindah
ke tampilan Widget lain, maka dapat menggunakan perintah
[Link]().Modifikasi method login() serta mencatat token yang
dikirim oleh server. Berikut contohnya :
Future login()async{
final hasil = await [Link]('[Link] body:{
'nip' : [Link],
'sandi' : [Link]
});
print('hasil login ${[Link]}'); //<--untuk melihat response dari server
final js = [Link]([Link]);
if(js['result'] == true){
}else{
//perintah lakukan sesuatu login gagal
}
}
5.6. ShowAlert
Sering kali kita memerlukan tampilan alertDialog untuk sebagai pemberitahuan adanya
terjadi peringatan ataupun pembertahuan kepada pengguna. Untuk pembuatan alert
contohnya sebagai berikut:
Contoh penggunaannya:
Future login()async{
final hasil = await [Link]('[Link] body:{
'nip' : [Link],
'sandi' : [Link]
});
print('hasil login ${[Link]}'); //<--untuk melihat response dari server
final js = [Link]([Link]);
if(js['result'] == true){
[Link]['token'] = js['token'];
[Link]['pengguna'] = [Link](js['pengguna']);
}else{
alert('Maaf, nip dan sandi anda tidak cocok di sistem kami');// alert kesalahan
}
}
Future cekPengguna()async{
final token = [Link]['token'];
final hasil = await [Link]('[Link]
body: { 'token' : token });
final js = [Link]([Link]);
if(js['result'] == true){
[Link](context, new MaterialPageRoute(
builder: (bc)=>Beranda()
));
}
}
@override
void initState() {
[Link]();
txtNIP = new TextEditingController();
txtSandi = new TextEditingController();
Setelah langkah-langkah diatas dilakukan. Coba jalankan server dan Flutter. Lakukan
Login dan lihat hasilnya apakah berhasil masuk ke Beranda? Jika tidak berhasil cek
kembali kode program diatas. Bila sudah berhasil, refresh browser dan lihat kembali
apakah langsung masuk ke beranda atau masih meminta login?. Jika masih meminta
Login maka ada langkah yang belum berhasil dilakukan. Bila langsung masuk ke halaman
Beranda maka anda telah berhasil membuat identifikasi pengguna.
contoh:
Berikut langkah contoh praktik pembuatan konstanta untuk tujuan soft code pada alamat
URL server. Buat sebuah file .dart di project dengan nama url_address.dart. nantinya isi
dari file ini adalah deklarasi nama-nama url yang dapat diresponse oleh server. Berikut
contohnya:
class UrlAddress{
static final String HOST = '[Link]
static final String URL_PENGGUNA = '$HOST/pengguna';
static final String URL_PENGGUNA_SIMPAN = '$URL_PENGGUNA/simpan';
static final String URL_PENGGUNA_HAPUS = '$URL_PENGGUNA/hapus';
static final String URL_PENGGUNA_LOGIN = '$URL_PENGGUNA/login';
static final String URL_PENGGUNA_CEK = '$URL_PENGGUNA/cek-pengguna';
static final String URL_PENGGUNA_LISTDATA = '$URL_PENGGUNA/list-data';
import 'package:app_presensi/helper/url_address.dart';
Sekarang periksalah kembali setiap file pada project yang menggunakan penulisan hard
code kemudian ganti menjadi konstanta.
D. Gunakan Middleware di bagian route web yang mengarah pada operasi CRUD, seperti
contoh berikut:
- /pengguna/list-data
- /pengguna/cari-nip
- /pengguna/hapus
- /pengguna/simpan
- /pengguna/cek-pengguna
Tapi tidak untuk /pengguna/login, karena Login adalah cara untuk klien untuk mendapatkan
token dari server, jadi tidak boleh diberikan middleware untuk otorisasi, sebab bila diberikan
maka klien tidak akan pernah bisa login dan tidak pernah akan bisa mendapatkan token.
Pada sisi kode program di klien untuk akses terhadap jenis API yang memerlukan otorisasi
token maka perlu melakukan modifikasi pada perintah requestnya. Tambahkan informasi token
yang telah diterima dari server ke bagian header setiap transaksi request http. Contoh sebagai
berikut
Future refresh()async{
///ambil informasi token yang tersimpan di localstorage
final token = [Link]['token'];
Setelah melakukan tahapan diatas, lakukan pengujian pada program kalian. Seharusnya
yang dicapai:
1. Login : masukan id dan sandi yang benar maka akan masuk ke halaman beranda, bila
salah maka keluar pesan kesalahan ID san Sandi.
2. Bila login telah berhasil: Refresh browser, harusnya langsung masuk ke halaman
beranda, tidak lagi meminta login.
3. Lihat data, simpan data, hapus data: coba semua menu di aplikasi, lakukan lihat data,
simpan data dan hapus data, harusnya semua berjalan normal. Kemudian lakukan
pengujian melalui postman seperti pada pertemuan 2, yaitu lihat data, simpan data dan
hapus data. Seharusnya bila otorisasi sudah benar operasi tersebut tidak bisa lagi
dijalankan.
Project flutterweb yang dibuat pada tahap debug masih berjalan sangat berat dan lama,
hal ini disebabkan adanya modul / library monitoring proses yang disertakan pada saat
menjalankannya. Untuk menjadikannya mode Release, maka project flutter-web harus di build
release terlebih dahulu agar aplikasi dapat running lebih ringan dan cepat.
Untuk build aplikasi, jalankan perintah berikut melalui terminal dalam keadaan online:
Bila sudah selesai file dapat ditemukan di dalam project flutter di direktori /build/web.
Seperti contoh berikut:
C. Salin file /web/assets yang ada di project Flutter-web ke direktori /public pada Laravel,
seperti berikut:
Langkah diatas bertujuan agar asset gambar yang telah dibuat di project Flutter terikut
serta nantinya bila aplikasi dijalankan.
Nb*: Cukup ketikkan nama ‘index’ saja, tidak perlu ada [Link].
Bila telah dilakukan langkah-langkah diatas, kemudian jalankan dan jangan lupa analisis
pesan yang muncul di console web yang ada di browser. Lakukan login dan analisa buila terjadi
kesalahan, cobalah melakukan perbaikan dengan mendiskusikannya ke tutor.
Tugas Rumah
1. Buatlah form Login untuk mengenali pengguna berdasarkan ID pengguna dan kata
sandinya.
2. Buatlah middleware untuk memvalidasi token yang dikirimkan oleh klien masih valid
sebagai mekanisme keamanan akses data. Pastikan setiap operasi CRUD di server hanya
dapat berjalan pada klien aplikasi yang telah melakukan Login dengan benar, tidak akan
melayani data pada postman ataupun permintaan dari klien yang tidak melakukan login
dengan benar.
3. Buatlah konstanta di dile url_address.dart dengan nama class UrlAddress:
a. URL_HOST = ‘[Link]
b. URL_KARYAWAN_LIST_DATA = ULR_HOST + ‘karyawan/list-data’
c. URL_KARYAWAN_SIMPAN= ULR_HOST + ‘karyawan/simpan’
d. URL_KARYAWAN_HAPUS= ULR_HOST + ‘karyawan/hapus’
e. URL_PRODUK_LIST_DATA = ULR_HOST + ‘produk/list-data’
f. URL_ PRODUK _SIMPAN= ULR_HOST + ‘produk /simpan’
g. URL_ PRODUK _HAPUS= ULR_HOST + ‘produk /hapus’
h. URL_PENJUALAN_LIST_DATA = ULR_HOST + ‘penjualan/list-data’
i. URL_ PENJUALAN _SIMPAN= ULR_HOST + ‘penjualan /simpan’
j. URL_ PENJUALAN _HAPUS= ULR_HOST + ‘penjualan /hapus’
k. URL_DETAIL_PENJUALAN_LIST_DATA = ULR_HOST + ‘penjualan/list-detail
l. URL_ DETAIL_PENJUALAN _SIMPAN= ULR_HOST + ‘penjualan /simpan-detail’
m. URL_ DETAIL_PENJUALAN _HAPUS= ULR_HOST + ‘penjualan /hapus-detail’
4. Modifikasi kode program anda untuk menggunakan soft-coded dengan cara merubah
semua hard-coded URL transaksi simpan, list-data dan hapus menggunakan konstanta yang
telah dibuat pada project anda.
5. Release aplikasi anda dan integrasikan aplikasi flutter ke project laravel pada route root:
(‘ / ‘), yaitu akan diakses sebagai muka halaman di project anda.