Lewati ke konten utama
Versi: 0.8.0

Enums

STADATA Flutter SDK menyediakan rangkaian enum yang komprehensif yang dirancang untuk menyederhanakan interaksi API, meningkatkan type safety, dan meningkatkan keterbacaan kode. Enum ini berfungsi sebagai konstanta yang terstandardisasi untuk berbagai parameter dan nilai respons di seluruh SDK, memastikan perilaku yang konsisten dan dapat diprediksi di semua operasi data statistik.

Enum ini menghilangkan kebutuhan akan magic string, mengurangi potensi error, dan menyediakan dukungan IntelliSense di IDE Anda, membuat pengembangan lebih efisien dan mengurangi kesalahan saat bekerja dengan data statistik Indonesia dari BPS.

Bahasa Inti dan Lokalisasi

Enum DataLanguage

Enum DataLanguage mengontrol bahasa data yang dikembalikan dari API BPS, mendukung respons dalam bahasa Indonesia dan Inggris yang tersedia.

EnumNilai ParameterDeskripsiStatusKonteks Penggunaan
DataLanguage.idindRespons dalam bahasa IndonesiaDefaultSemua panggilan API, direkomendasikan untuk pengguna Indonesia
DataLanguage.enengRespons dalam bahasa InggrisTersediaPengguna internasional, dokumentasi bahasa Inggris

Contoh Penggunaan

// Menggunakan bahasa Indonesia default
final domains = await StadataFlutter.instance.list.domains();

// Secara eksplisit meminta data Indonesia
final domainsIndonesian = await StadataFlutter.instance.list.domains(
lang: DataLanguage.id,
);

// Meminta data bahasa Inggris jika tersedia
final domainsEnglish = await StadataFlutter.instance.list.domains(
lang: DataLanguage.en,
);

// Pengambilan konten spesifik bahasa
final publication = await StadataFlutter.instance.view.publication(
id: '03220.2301',
domain: '0000',
lang: DataLanguage.id, // Konten Indonesia
);

Best Practices

  • Perilaku Default: Ketika tidak ada bahasa yang ditentukan, DataLanguage.id digunakan secara otomatis
  • Konsistensi: Gunakan bahasa yang sama di seluruh aplikasi untuk pengalaman pengguna yang konsisten
  • Strategi Fallback: Beberapa konten mungkin hanya tersedia dalam bahasa Indonesia; implementasikan logika fallback jika diperlukan
  • Preferensi Pengguna: Izinkan pengguna memilih bahasa pilihan mereka dan pertahankan pengaturan ini
// Implementasi preferensi bahasa dengan fallback
Future<Publication?> getPublicationWithFallback(
String id,
String domain,
DataLanguage preferredLang,
) async {
try {
// Coba bahasa pilihan terlebih dahulu
final publication = await StadataFlutter.instance.view.publication(
id: id,
domain: domain,
lang: preferredLang,
);

if (publication != null) return publication;

// Fallback ke bahasa Indonesia jika bahasa pilihan gagal
if (preferredLang != DataLanguage.id) {
return await StadataFlutter.instance.view.publication(
id: id,
domain: domain,
lang: DataLanguage.id,
);
}

return null;
} catch (e) {
// Tangani error dengan tepat
return null;
}
}

Klasifikasi Administratif dan Geografis

Enum DomainType

Enum DomainType menyederhanakan spesifikasi jenis domain administratif untuk filtering data geografis dan administratif di seluruh struktur pemerintahan Indonesia.

EnumNilai ParameterDeskripsiStatusLevel Administratif
DomainType.allallSemua domain administratif termasuk level nasional, provinsi, dan kabupatenDefaultNasional, Provinsi, Kabupaten
DomainType.provinceprovHanya domain administratif level provinsiTersediaProvinsi
DomainType.regencykabHanya domain administratif level kabupaten dan kotaTersediaKabupaten/Kota
DomainType.regencyByProvincekabbyprovDomain kabupaten yang difilter berdasarkan provinsi tertentuTersediaKabupaten (Difilter Provinsi)

Contoh Penggunaan

// Dapatkan semua domain administratif (nasional, provinsi, kabupaten)
final allDomains = await StadataFlutter.instance.list.domains(
type: DomainType.all,
);

// Dapatkan hanya domain provinsi
final provinces = await StadataFlutter.instance.list.domains(
type: DomainType.province,
);

// Dapatkan hanya domain kabupaten/kota
final regencies = await StadataFlutter.instance.list.domains(
type: DomainType.regency,
);

// Dapatkan kabupaten dalam provinsi tertentu
final westJavaRegencies = await StadataFlutter.instance.list.domains(
type: DomainType.regencyByProvince,
provinceId: '32', // Kode provinsi Jawa Barat
);

Integrasi Hierarki Administratif

// Membangun pemilih administratif hierarkis
class AdministrativeSelector {
static Future<Map<String, List<Domain>>> buildHierarchy() async {
final hierarchy = <String, List<Domain>>{};

// Muat semua level administratif
final [allDomains, provinces, regencies] = await Future.wait([
StadataFlutter.instance.list.domains(type: DomainType.all),
StadataFlutter.instance.list.domains(type: DomainType.province),
StadataFlutter.instance.list.domains(type: DomainType.regency),
]);

hierarchy['all'] = allDomains.data;
hierarchy['provinces'] = provinces.data;
hierarchy['regencies'] = regencies.data;

return hierarchy;
}

static Future<List<Domain>> getRegenciesByProvince(String provinceId) async {
final regencies = await StadataFlutter.instance.list.domains(
type: DomainType.regencyByProvince,
provinceId: provinceId,
);

return regencies.data;
}
}

Ketersediaan Data dan Status

Enum DataAvailability

Enum DataAvailability menyediakan indikator status yang terstandardisasi untuk ketersediaan data di semua resource statistik BPS, memungkinkan error handling yang robust dan mekanisme feedback pengguna.

EnumNilai ParameterDeskripsiKonteks Penggunaan
DataAvailability.availableavailableData tersedia dan dapat diaksesPengambilan data berhasil
DataAvailability.listNotAvailablelist-not-availableData koleksi atau list tidak tersediaKoleksi kosong, hasil terfilter
DataAvailability.notAvailablenot-availableResource data spesifik tidak tersediaResource hilang, akses dibatasi

Contoh Penggunaan

// Memeriksa ketersediaan data dalam respons API
final publicationsResult = await StadataFlutter.instance.list.publications(
domain: '7200',
keyword: 'kata-kunci-langka',
);

// Tangani status ketersediaan yang berbeda
switch (publicationsResult.dataAvailability) {
case DataAvailability.available:
print('Ditemukan ${publicationsResult.data.length} publikasi');
break;
case DataAvailability.listNotAvailable:
print('Tidak ada publikasi yang ditemukan untuk kriteria yang ditentukan');
break;
case DataAvailability.notAvailable:
print('Data publikasi tidak tersedia untuk domain ini');
break;
}

Penanganan Ketersediaan Data yang Robust

// Handler ketersediaan data yang komprehensif
class DataAvailabilityHandler {
static Future<T?> handleDataRetrieval<T>(
Future<ApiResponse<List<T>>> apiCall,
String dataType,
) async {
try {
final result = await apiCall;

switch (result.dataAvailability) {
case DataAvailability.available:
if (result.data.isNotEmpty) {
print('✅ Data $dataType dimuat: ${result.data.length} item');
return result.data.first;
} else {
print('⚠️ Data $dataType tersedia tetapi kosong');
return null;
}

case DataAvailability.listNotAvailable:
print('📭 List $dataType tidak tersedia untuk kriteria saat ini');
return null;

case DataAvailability.notAvailable:
print('🚫 Data $dataType tidak tersedia');
return null;
}
} catch (e) {
print('❌ Error mengambil $dataType: $e');
return null;
}
}

static String getAvailabilityMessage(DataAvailability availability, String dataType) {
switch (availability) {
case DataAvailability.available:
return '$dataType tersedia';
case DataAvailability.listNotAvailable:
return 'List $dataType saat ini tidak tersedia';
case DataAvailability.notAvailable:
return '$dataType tidak tersedia';
}
}
}

Enum Klasifikasi Statistik

Hierarki Enum ClassificationType

SDK menyediakan enum khusus untuk sistem Klasifikasi Baku Lapangan Usaha Indonesia (KBLI) dan Klasifikasi Baku Komoditi Indonesia (KBKI).

Enum KBLIType (Klasifikasi Industri)

Jenis klasifikasi industri dengan manajemen versi untuk kategorisasi aktivitas ekonomi.

EnumNilai ParameterTahunDeskripsi
KBLIType.y2009kbli20092009Versi KBLI asli berdasarkan ISIC Rev. 4
KBLIType.y2015kbli20152015Versi yang diperbarui dengan kategori ekonomi yang disempurnakan
KBLIType.y2017kbli20172017Versi yang ditingkatkan dengan aktivitas ekonomi tambahan
KBLIType.y2020kbli20202020Versi terbaru yang menggabungkan aktivitas ekonomi baru

Enum KBKIType (Klasifikasi Komoditas)

Jenis klasifikasi komoditas untuk kategorisasi produk dan perdagangan.

EnumNilai ParameterTahunDeskripsi
KBKIType.y2015kbki20152015Standar klasifikasi komoditas saat ini

Contoh Penggunaan

// Bekerja dengan klasifikasi KBLI
const kbliType = KBLIType.y2020;

// Generate ID klasifikasi yang tepat
final classificationId = kbliType.urlParamGenerator('A'); // Hasil: kbli_2020_A

// Ambil data klasifikasi
final classifications = await StadataFlutter.instance.view.statisticClassifications(
id: classificationId,
type: kbliType,
);

// Workflow perbandingan versi
final comparisonResults = await Future.wait([
StadataFlutter.instance.view.statisticClassifications(
id: KBLIType.y2015.urlParamGenerator('C'),
type: KBLIType.y2015,
),
StadataFlutter.instance.view.statisticClassifications(
id: KBLIType.y2020.urlParamGenerator('C'),
type: KBLIType.y2020,
),
]);

Enum ClassificationLevel

Spesifikasi level hierarkis untuk sistem klasifikasi.

Enum KBLILevel (Level Industri)

EnumNilai ParameterDeskripsiFormat Kode
KBLILevel.categorycategorySektor ekonomi utama (A-U)Huruf tunggal
KBLILevel.primaryGroupprimary groupDivisi ekonomi detailDua digit
KBLILevel.groupgroupKlasifikasi industri spesifikTiga digit
KBLILevel.subGroupsubgroupAktivitas bisnis detailEmpat digit
KBLILevel.clusterclusterAktivitas ekonomi paling spesifikLima digit

Enum KBKILevel (Level Komoditas)

EnumNilai ParameterDeskripsiFormat Kode
KBKILevel.sectionsectionKategori produk utama (0-4)Digit tunggal
KBKILevel.divisiondivisionDivisi kategori produkDua digit
KBKILevel.groupgroupKlasifikasi grup produkTiga digit
KBKILevel.classesclassesKelas produk spesifikEmpat digit
KBKILevel.subClasssubclassSpesifikasi produk detailLima digit
KBKILevel.commodityGroupcommodity groupKlasifikasi grup komoditasTujuh digit
KBKILevel.commoditycommodityIdentifikasi komoditas individualSepuluh digit

Contoh Validasi Kode

// Validasi kode KBLI
final categoryValid = KBLILevel.category.validateCode('A'); // true
final groupValid = KBLILevel.group.validateCode('123'); // true
final invalidCode = KBLILevel.category.validateCode('123'); // false

// Validasi kode KBKI
final sectionValid = KBKILevel.section.validateCode('0'); // true
final commodityValid = KBKILevel.commodity.validateCode('1234567890'); // true

Pola Integrasi Praktis

Konfigurasi Berbasis Enum

// Kelas konfigurasi menggunakan enum untuk type safety
class StatisticalDataConfig {
final DataLanguage language;
final DomainType domainType;
final ClassificationType classificationType;

const StatisticalDataConfig({
this.language = DataLanguage.id,
this.domainType = DomainType.all,
required this.classificationType,
});

// Factory constructor untuk konfigurasi umum
factory StatisticalDataConfig.indonesian() => const StatisticalDataConfig(
language: DataLanguage.id,
domainType: DomainType.all,
classificationType: KBLIType.y2020,
);

factory StatisticalDataConfig.english() => const StatisticalDataConfig(
language: DataLanguage.en,
domainType: DomainType.all,
classificationType: KBLIType.y2020,
);
}

Error Handling dengan Enum

// Kategorisasi error berbasis enum
enum DataRetrievalError {
networkError,
authenticationError,
dataNotAvailable,
invalidParameters,
serviceUnavailable,
}

class EnumBasedErrorHandler {
static DataRetrievalError categorizeError(dynamic error) {
if (error is ApiKeyNotFoundException) {
return DataRetrievalError.authenticationError;
} else if (error is ApiException) {
return DataRetrievalError.serviceUnavailable;
} else if (error is ValidationException) {
return DataRetrievalError.invalidParameters;
} else {
return DataRetrievalError.networkError;
}
}

static String getErrorMessage(DataRetrievalError error) {
switch (error) {
case DataRetrievalError.networkError:
return 'Masalah koneksi jaringan. Silakan periksa koneksi internet Anda.';
case DataRetrievalError.authenticationError:
return 'API key tidak valid. Silakan periksa kredensial Anda.';
case DataRetrievalError.dataNotAvailable:
return 'Data yang diminta tidak tersedia.';
case DataRetrievalError.invalidParameters:
return 'Parameter permintaan tidak valid.';
case DataRetrievalError.serviceUnavailable:
return 'Layanan sementara tidak tersedia.';
}
}
}

Ekstensi Utilitas Enum

Metode Ekstensi Kustom

// Ekstensi berguna untuk fungsionalitas enum
extension DataLanguageExtension on DataLanguage {
String get displayName {
switch (this) {
case DataLanguage.id:
return 'Bahasa Indonesia';
case DataLanguage.en:
return 'English';
}
}

String get flagEmoji {
switch (this) {
case DataLanguage.id:
return '🇮🇩';
case DataLanguage.en:
return '🇺🇸';
}
}
}

extension DomainTypeExtension on DomainType {
String get description {
switch (this) {
case DomainType.all:
return 'Semua level administratif';
case DomainType.province:
return 'Hanya level provinsi';
case DomainType.regency:
return 'Hanya level kabupaten/kota';
case DomainType.regencyByProvince:
return 'Kabupaten dalam provinsi';
}
}

IconData get icon {
switch (this) {
case DomainType.all:
return Icons.public;
case DomainType.province:
return Icons.location_on;
case DomainType.regency:
return Icons.location_city;
case DomainType.regencyByProvince:
return Icons.filter_list;
}
}
}

Performa dan Best Practices

Panduan Penggunaan Enum

  1. Type Safety: Selalu gunakan enum daripada string literal untuk parameter
  2. Nilai Default: Manfaatkan nilai default enum untuk menyederhanakan panggilan API
  3. Validasi: Gunakan metode validasi enum sebelum melakukan panggilan API
  4. Konsistensi: Pertahankan penggunaan enum yang konsisten di seluruh aplikasi
  5. Dokumentasi: Dokumentasikan pilihan enum Anda untuk pemahaman tim

Optimisasi Performa

// Strategi caching berbasis enum
class EnumBasedCache {
static final Map<String, dynamic> _cache = {};

static String _generateCacheKey(
String endpoint,
DataLanguage language,
DomainType domainType,
Map<String, dynamic> params,
) {
return '$endpoint_${language.name}_${domainType.name}_${params.hashCode}';
}

static Future<T?> getCachedOrFetch<T>(
String endpoint,
DataLanguage language,
DomainType domainType,
Map<String, dynamic> params,
Future<T> Function() fetcher,
) async {
final cacheKey = _generateCacheKey(endpoint, language, domainType, params);

if (_cache.containsKey(cacheKey)) {
return _cache[cacheKey] as T;
}

final result = await fetcher();
_cache[cacheKey] = result;
return result;
}
}

Sistem enum yang komprehensif dalam STADATA Flutter SDK menyediakan cara yang type-safe, efisien, dan dapat dipelihara untuk berinteraksi dengan data statistik Indonesia. Dengan memanfaatkan enum ini secara efektif, Anda dapat membangun aplikasi yang robust yang menangani kompleksitas klasifikasi data statistik dan hierarki administratif dengan mudah.

Ringkasan

Enum ini berfungsi sebagai fondasi untuk interaksi type-safe dengan STADATA Flutter SDK:

  • DataLanguage: Mengontrol bahasa respons (Indonesia/Inggris)
  • DomainType: Mengelola filtering domain administratif
  • DataAvailability: Menangani status ketersediaan data
  • Enum Klasifikasi: Menyediakan akses terstruktur ke sistem KBLI/KBKI
  • Enum Level: Memungkinkan navigasi hierarkis klasifikasi

Dengan menggunakan enum ini secara konsisten, Anda memastikan integrasi yang dapat diandalkan, dapat dipelihara, dan bebas error dengan data statistik resmi Indonesia melalui sistem API BPS.