5. Register Proses
Setelah tampilan login & register sudah dibuat langkah selanjutnya adalah kita akan membuat proses registernya menggunakan API yang nanti disediakan.
1. Persiapan Proses API
Langkah yang pertama sebelum kita menerapkan proses ke tampilan kita, kita harus mempunyai API terlebih dahulu dalam hal ini untuk API nya sudah disediakan di Github. Silahkan di clone terlebih dahulu dan kalau sudah lakukan beberapa hal berikut ini :
- Buatlah database dengan nama travel pada laptop masing - masing
- Jalankan
npm ipada API yang sudah di clone - Jalankan apinya dengan cara
npm run start:dev -
Jalankan aplikasi postman, import file
travel.postman_collection.jsonyang berada pada project API
-
Buka kembali cmd / terminal dan ketikan
ipconfig. Jika berhasil tampilannya akan muncul seperti ini :
Keterangan
- Setiap laptop akan berbeda ipnya
- Copy ip yang IPv4 address
10.100.200.26 - Jalankan pada browser / postman dengan url
10.100.200.26:457.457: adalah port dari apinya - Jika berhasil akan menampilkan kata
Welcome to API Travel APP! - Kenapa disini kita tidak menggunakan localhost karena localhost yang berada pada laptop / komputer kita tidak terdeteksi di emulator / device pada saat kita menjalankan flutter maka dari itu diperlukannya sebuah IP untuk mengakses API tersebut
- Url ini juga selain dapat dibuka di emulator / device bisa juga dibuka dikomputer / laptop lain (yang mempunyai jaringan wifi yang sama)
- Pada saat menjalankan flutter API jangan di stop jika laptop mengalami lag atau semacamnya bisa menggunakan url dari teman dekat yang mempunyai jaringan yang sama
-
Install
http,flutter_dotenv,awesome_dialogpada package flutter
2. Membuat Model
Sebelum membuat model kita harus menjalankan API nya terlebih dahulu, silahkan buka postman lalu jalankan API yang berada di dalam folder auth > register,metode post, dan masukkan data - datanya seperti nama, email, password, konfimasiPassword gambar dibawah ini:
Dari hasil api tersebut copy hasil response dari api lalu silahkan masuk ke website app.quicktype.io

1. Pastekan response API di point ke 1 pada gambar
2. Ubah nama model sesuai dengan API tersebut
3. Ubah Language menjadi dart
4. Copy Code
5. Pada folder model buat 2 buah file baru dengan nama model.dart & register.dart
6. Pastekan kode yang sudah di copy pada register.dart
Setelah itu kita akan membuat file model.dart ini sebagai file induk dari file model - model yang lainnya.
Lalu selanjutnya pada register.dart ubah import dart convertnya menjadi part:
part of "model.dart";
Register registerFromJson(String str) => Register.fromJson(json.decode(str));
String registerToJson(Register data) => json.encode(data.toJson());
Keterangan
quicktype: website yang digunakan untuk menggenerate json menjadi modelpart: digunakan untuk file yang ditunjuk sebagai induk dari file - file lainpart of: digunakan untuk file yang ditunjuk sebagai anak- Keuntungan menggunakan part adalah pada saat kita ingin memanggil model yang diingikan kita tidak perlu repot - repot lagi memanggil file modelnya cukup mengimport induknya maka anak - anaknya bisa terpanggil juga. Lalu juga dengan menggunakan part kita tidak perlu lagi menggunakan import pada anak - anaknya cukup pada induknya saja
quicktype memang akan menggenerate data API kita cuman ada beberapa hal yang harus kita pahami contohnya adalah penamaan class yang bisa membuat Ambigu (sama seperti widget / nama yang lainnya) maka dari itu kita harus merubah class tersebut jika kita melihatnya :
Ubahlah menjadi seperti ini :
part of "model.dart";
Register registerFromJson(String str) => Register.fromJson(json.decode(str));
String registerToJson(Register data) => json.encode(data.toJson());
class Register {
String status;
String message;
DataRegister data;
Register({
required this.status,
required this.message,
required this.data,
});
factory Register.fromJson(Map<String, dynamic> json) => Register(
status: json["status"],
message: json["message"],
data: DataRegister.fromJson(json["data"]),
);
Map<String, dynamic> toJson() => {
"status": status,
"message": message,
"data": data.toJson(),
};
}
class DataRegister {
DataRegister();
factory DataRegister.fromJson(Map<String, dynamic> json) => DataRegister(
);
Map<String, dynamic> toJson() => {
};
}
3. Membuat Proses
Setelah kita membuat model selanjutnya kita akan membuat prosesnya untuk membaca APInya. Buat file baru pada folder controller dengan nama authController.dart
Kita akan mulai mengatur flutter_dotenv terlebih dahulu.
1. Buat file baru dengan nama .env(pada folder project masing - masing BUKAN di folder lib)
pubspec.yaml atur agar .env bisa dibaca3. Pada
main.dart ubah bagian runApp nya untuk jalankan flutter_dotenv
Lalu pada bagian authControllernya masukkan kode ini:
import "dart:convert";
import "package:flutter_dotenv/flutter_dotenv.dart";
import "package:http/http.dart" as http;
import "package:travel_app/model/model.dart";
class AuthController {
Future registerProses(
String nama, String email, String password, String konfirmasi) async {
String url = "${dotenv.env['IP']}/auth/register";
Uri urlData = Uri.parse(url);
Map data = {
"nama": nama,
"email": email,
"password": password,
"konfirmasiPassword": konfirmasi
};
var body = json.encode(data);
final respon = await http.post(urlData,
headers: {"Content-Type": "application/json"}, body: body);
if (respon.statusCode == 201) {
Register dataRes = registerFromJson(respon.body.toString());
return dataRes;
} else {
return null;
}
}
}
Keterangan
- Import beberapa kebutuhan untuk proses seperti flutter_dotenv, http, dan kita panggil modelnya
- Agar terstruktur kita dapat membuat buat class AuthController
Futurehampir mirip dengan function sama dengan apa yang kita gunakan dimain.dart- Pada registerProses membutuhkan data nama, email, password, konfimasiPassword
dotenv.env['IP']: memanggil variabel env IPUri urlData = Uri.parse(url): karena http tidak bisa membaca string jadi kita harus ubah url (string) menjadi Urijson.encode: membuat data map menjadi json agar bisa dikirim menggunakan httpawait http.post: karena proses http membutuhkan waktu maka disini harus diberikan await / proses menunggu prosesnya selesai. http.post proses pengiriman data ke api dengan metode post yang membutuhkan beberapa parameter seperti url yang berbentuk Uri, body (data yang akan dikirim), dan header (jenis data yang dikirim)respon.statusCode == 201: mengecek apabila data response yang didapat status codenya adalah 201 maka dia akan menjalakan prosesnya. 201 ini bisa dilihat pada postmanRegister dataRes = registerFromJson(respon.body.toString()): membuat variabel yang bertipe register yang isinya adalah mengubah data response yang berupa json (mentah / belum bisa diproses) menjadi data Register yang sudah kita buatkan modelnya
4. Implementasi Proses Pada Tampilan
Pada tampilan register.dart kita akan menjalankan proses registernya. Masukkan kode ini diatas widget build
TextEditingController name = TextEditingController(),
email = TextEditingController(),
password = TextEditingController(),
konfirmasiPassword = TextEditingController();
bool loading = false;
saveRegis() {
setState(() {
loading = true;
});
var dt = AuthController()
.registerProses(
name.text, email.text, password.text, konfirmasiPassword.text)
.then((value) {
if (value != null) {
setState(() {
loading = false;
});
AwesomeDialog(
context: context,
title: "Success",
desc: "Register Berhasil",
dialogType: DialogType.success,
btnOkOnPress: () => Navigator.pushNamedAndRemoveUntil(
context, "/login", (route) => false),
).show();
} else {
setState(() {
loading = false;
});
AwesomeDialog(
context: context,
title: "Failed",
desc: "Register Gagal",
dialogType: DialogType.error,
).show();
}
});
}
Container(
margin: EdgeInsets.only(bottom: tinggi * 0.04),
child: TextField(
controller: name,
decoration: InputDecoration(
label: Text("Name"),
hintText: "Jhon Doe",
focusedBorder: const OutlineInputBorder(
borderSide: BorderSide(
color: Color.fromARGB(255, 252, 211, 64)),
borderRadius: BorderRadius.all(Radius.circular(15))),
border: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(15)))),
),
),
Lalu lakukan hal yang sama pada password. Pada tombol jalankan function yang sudah dibuat :
ElevatedButton(
style: ButtonStyle(
shape: MaterialStateProperty.all<RoundedRectangleBorder>(
RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10))),
backgroundColor: MaterialStateProperty.resolveWith(
(states) => Color.fromARGB(255, 252, 211, 64))),
onPressed: () => saveRegis(),
child: loading
? Center(child: CircularProgressIndicator())
: Text("Submit",
style: GoogleFonts.poppins(
textStyle: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
color: Colors.black))))
Keterangan
AuthController().registerProses(): memanggil proses register yang berada di authcontrollerthen: adalah sebuah proses jika prosesnya selesai dan mempunyai nilai kembali maka akan di simpan kedalam value. valuenya disini kita cek kalau mengirimkan data akan menampilkan proses berhasil & apabila tidak mengirimkan data akan menampilkan error- Pada tombol submit disini diberikan kondisi dimana jika loading false akan menampilkan text submit dan jika loading true (sedang menjalankan proses) maka akan menampilkan loading