Membangun aplikasi web di era modern memerlukan pondasi yang kokoh. Framework modern memberikan fleksibilitas luar biasa bagi developer untuk menghadirkan fitur kompleks secara cepat tanpa mengabaikan aspek keamanan dan keandalan sistem.
Tahapan Implementasi & Walkthrough Kode
Berikut adalah langkah demi langkah teknis yang dapat Anda ikuti langsung pada codebase Anda:
Tahap 1: Penulisan Kode & Konfigurasi
php artisan serve --host 192.168.1.6 --port 8080
Tahap 2: Penulisan Kode & Konfigurasi
dependencies:
flutter:
sdk: flutter
http: ^1.2.1
Tahap 3: Penulisan Kode & Konfigurasi
flutter pub add http
Tahap 4: Penulisan Kode & Konfigurasi
dependencies:
flutter:
sdk: flutter
http: ^1.2.1
image_picker: ^1.1.2
Tahap 5: Penulisan Kode & Konfigurasi
flutter pub add image_picker
Tahap 6: Penulisan Kode & Konfigurasi
name: flutter_pemula
description: "A new Flutter project."
publish_to: 'none'
version: 1.0.0+1
environment:
sdk: '>=3.4.0 <4.0.0'
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.6
http: ^1.2.1
image_picker: ^1.1.2
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^3.0.0
flutter:
uses-material-design: true
Tahap 7: Penulisan Kode & Konfigurasi
class Post {
int id;
String image;
String title;
String content;
DateTime createdAt;
DateTime updatedAt;
Post({
required this.id,
required this.image,
required this.title,
required this.content,
required this.createdAt,
required this.updatedAt,
});
factory Post.fromJson(Map<String, dynamic> json) => Post(
id: json["id"],
image: json["image"],
title: json["title"],
content: json["content"],
createdAt: DateTime.parse(json["created_at"]),
updatedAt: DateTime.parse(json["updated_at"]),
);
Map<String, dynamic> toJson() => {
"id": id,
"image": image,
"title": title,
"content": content,
"created_at": createdAt.toIso8601String(),
"updated_at": updatedAt.toIso8601String(),
};
}
Tahap 8: Penulisan Kode & Konfigurasi
import 'dart:convert';
import 'dart:io';
import 'package:flutter_pemula/model/post.dart';
import 'package:http/http.dart' as http;
class Repository {
final baseUrl = 'http://192.168.1.6:8080/api';
//get data with metode async
Future<Map<String, dynamic>> fetchPosts(int page) async {
final response = await http.get(Uri.parse('$baseUrl/posts?page=$page'));
if (response.statusCode == 200) {
final data = json.decode(response.body);
List<Post> posts = (data['data']['data'] as List)
.map((postJson) => Post.fromJson(postJson))
.toList();
return {
'posts': posts,
'nextPageUrl': data['data']['next_page_url'],
};
} else {
throw Exception('Failed to load data');
}
}
//insert posts
Future<bool> insertPost(File? image, String title, String content) async {
final request = http.MultipartRequest('POST', Uri.parse('$baseUrl/posts'));
request.fields['title'] = title;
request.fields['content'] = content;
request.files.add(
await http.MultipartFile.fromPath(
'image',
image!.path,
),
);
final response = await request.send();
if (response.statusCode == 201) {
return true;
} else {
throw false;
}
}
//update post
Future<bool> updatePost(
File? image, String title, String content, int id) async {
final request =
http.MultipartRequest('POST', Uri.parse('$baseUrl/posts/$id'));
request.fields['title'] = title;
request.fields['content'] = content;
request.fields['_method'] = 'PUT';
if (image != null) {
request.files.add(
await http.MultipartFile.fromPath(
'image',
image.path,
),
);
}
final response = await request.send();
if (response.statusCode == 200) {
return true;
} else {
throw false;
}
}
// delete post
Future<bool> deletePost(int id) async {
final response = await http.delete(Uri.parse('$baseUrl/posts/$id'));
if (response.statusCode == 200) {
return true;
} else {
throw false;
}
}
}
Selalu gunakan pendekatan deklaratif, validasi input seawal mungkin di boundary layer, dan lakukan logging terstruktur untuk memudahkan observability ketika sistem dijalankan di lingkungan cloud produksi.
Kesimpulan
Dengan mengikuti langkah-langkah terstruktur di atas, implementasi modul Anda akan jauh lebih rapi, aman dari bug umum, serta siap diskalakan ke lingkungan produksi.
Nantikan artikel tutorial praktis lainnya seputar fullstack development, microservices, dan otomasi AI di Blog Engineering SiHubung. Selamat mencoba!