flutter_boilerplate_generator 2.3.0
flutter_boilerplate_generator: ^2.3.0 copied to clipboard
A Dart code generator for Flutter boilerplate: model, entity, hive, and cubit state. Generates JSON serialization, copyWith, value equality, entity/Hive mapping, and pattern-matching extensions.
example/lib/main.dart
import 'package:example/di/api_client.dart';
import 'package:example/di/app_config.dart';
import 'package:example/di/get_user_use_case.dart';
import 'package:example/di/user_data_source.dart';
import 'package:example/inject.config.dart';
import 'package:flutter_boilerplate_annotations/flutter_boilerplate_annotations.dart';
void main() {
final container = ServiceContainer.instance;
// Daftarkan semua dependency dari generated file
configureContainer(container);
_demonstrateSingleton(container);
_demonstrateLazySingleton(container);
_demonstrateFactory(container);
_demonstrateNamed(container);
}
// ── @singleton ───────────────────────────────────────────────────────────────
// Instance dibuat SEKALI saat configureContainer dipanggil.
// Setiap get<T>() mengembalikan objek yang SAMA.
void _demonstrateSingleton(ServiceContainer container) {
final a = container.get<AppConfig>();
final b = container.get<AppConfig>();
print('=== Singleton ===');
print('a == b : ${identical(a, b)}'); // true — objek sama
print('baseUrl: ${a.baseUrl}');
}
// ── @lazySingleton ───────────────────────────────────────────────────────────
// Instance dibuat SEKALI, tapi baru pada saat pertama kali get<T>() dipanggil.
// Pemanggilan berikutnya mengembalikan instance yang SAMA.
void _demonstrateLazySingleton(ServiceContainer container) {
// Pertama kali dipanggil → UserDataSource dibuat di sini
final a = container.get<UserDataSource>();
// Kedua kali → kembalikan instance yang sudah ada
final b = container.get<UserDataSource>();
print('\n=== LazySingleton ===');
print('a == b : ${identical(a, b)}'); // true — objek sama
print('dataSource: $a');
}
// ── @injectable (factory) ────────────────────────────────────────────────────
// Instance BARU dibuat setiap kali get<T>() dipanggil.
// Cocok untuk use case atau presenter yang punya state sendiri per-penggunaan.
void _demonstrateFactory(ServiceContainer container) {
final a = container.get<GetUserUseCase>();
final b = container.get<GetUserUseCase>();
print('\n=== Factory ===');
print('a == b : ${identical(a, b)}'); // false — objek berbeda
a.call(1);
b.call(2);
}
// ── Named registration ───────────────────────────────────────────────────────
// Ketika ada lebih dari satu instance dari tipe yang sama,
// gunakan name: untuk membedakannya.
void _demonstrateNamed(ServiceContainer container) {
// Resolve berdasarkan nama
final authClient = container.get<ApiClient>(name: 'auth');
final publicClient = container.get<ApiClient>(name: 'public');
print('\n=== Named ===');
print('authClient : $authClient');
print('publicClient: $publicClient');
print('sama : ${identical(authClient, publicClient)}'); // false — beda instance
print('auth sama dg dirinya: ${identical(authClient, container.get<ApiClient>(name: "auth"))}'); // true — lazySingleton
}