Episode ini membuka akses ke kemampuan native: menggunakan platform channels untuk berkomunikasi dengan kode Android dan iOS, mengintegrasikan device API seperti camera, location, dan sensors, mengembangkan custom plugin, serta mengelola kompatibilitas plugin dan kode spesifik platform.

Flutter menggambar UInya sendiri, tetapi kadang aplikasi harus memakai kemampuan platform: kamera, GPS, fingerprint, atau API yang hanya ada di native. Episode 12 menjelaskan jembatan antara Flutter dan platform: platform channels, integrasi device API lewat plugin, pengembangan plugin custom, dan manajemen kompatibilitas.
Platform channel adalah saluran komunikasi antara kode Dart dan kode Android (Kotlin) atau iOS (Swift). Ketika sebuah plugin memanggil MethodChannel, framework meneruskan pesan ke native dan mengembalikan hasilnya.
const platform = MethodChannel('com.example.myapp/battery');
Future<int> ambilBaterai() async {
final level = await platform.invokeMethod<int>('getBatteryLevel');
return level!;
}MethodChannel di sisi Dart memanggil nama method getBatteryLevel yang diimplementasikan di sisi native. Nama channel harus unik — ikuti pola com.perusahaan/aplikasi — dan method sign di kedua sisi harus identik.
Di sisi Android (MainActivity.kt), implementasi channel dipasang di configureFlutterEngine:
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(
flutterEngine.dartExecutor.binaryMessenger,
"com.example.myapp/battery",
).setMethodCallHandler { call, result ->
if (call.method == "getBatteryLevel") {
result.success(42)
} else {
result.notImplemented()
}
}
}setMethodCallHandler menerima call.method dan menjawab lewat result.success. Kontrak nama channel dan method harus sama persis dengan sisi Dart, atau pemanggilan gagal dengan MissingPluginException.
Plugin sudah menangani platform channel untuk API umum. Beberapa yang paling sering dipakai:
camera — mengakses kamera untuk preview dan capture.geolocator — lokasi dengan permission handling.sensors_plus — accelerometer dan gyroscope.flutter pub add camera geolocatorPlugin device membutuhkan izin platform. Untuk lokasi di Android, tambahkan di android/app/src/main/AndroidManifest.xml:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />Izin lokasi ditulis sebagai <uses-permission android:name="...ACCESS_FINE_LOCATION"/> di dalam manifest. Ingat: izin statis ditulis di manifest, tetapi permission runtime untuk lokasi tetap perlu diminta dari kode — plugin geolocator menyediakan helper untuk itu.
Jangan langsung memanggil GPS tanpa meminta izin:
final layananAktif = await Geolocator.isLocationServiceEnabled();
if (!layananAktif) {
return;
}
LocationPermission izin = await Geolocator.checkPermission();
if (izin == LocationPermission.denied) {
izin = await Geolocator.requestPermission();
}Alur isLocationServiceEnabled → checkPermission → requestPermission adalah pola yang benar: periksa layanan, periksa izin, baru minta. Melompati langkah ini adalah penyebab paling umum crash dan penolakan di app review.
Ketika fitur native terlalu spesifik untuk plugin publik, buat plugin sendiri:
flutter create --template=plugin my_device_plugin
cd my_device_pluginflutter create --template=plugin menghasilkan struktur plugin lengkap dengan folder android, ios, dan example/. Sisi Dart berisi API publik, sisi native berisi implementasi channel.
lib/ — API Dart yang dipakai aplikasi.android/ — implementasi Kotlin.ios/ — implementasi Swift.example/ — aplikasi demo untuk menguji plugin.Mulailah dengan satu method channel sederhana, lalu perluas. Plugin yang baik mendokumentasikan platform yang didukung dan menangani notImplemented dengan benar.
Tidak semua plugin mendukung semua platform. Sebelum memakai, periksa label platform pada halaman pub.dev, dan verifikasi di project kalian:
flutter pub depsflutter pub deps menampilkan daftar dependency. Untuk detail kompatibilitas per platform, periksa dokumentasi plugin atau file pubspec.yaml plugin tersebut.
Saat butuh perilaku berbeda per platform, gunakan conditional import atau defaultTargetPlatform:
import 'package:flutter/foundation.dart';
if (defaultTargetPlatform == TargetPlatform.android) {
return const AndroidLayout();
} else if (defaultTargetPlatform == TargetPlatform.iOS) {
return const IOSLayout();
}defaultTargetPlatform memberi tahu platform saat runtime tanpa mengimpor kode native. Untuk perbedaan kecil ini cukup; untuk perbedaan besar, pakai conditional import — teknik yang akan kita dalami di episode 18.
Inti yang harus dibawa pulang:
flutter create --template=plugin untuk plugin custom.Di episode 13 selanjutnya kita membahas testing dan quality assurance — unit testing logika Dart, widget testing dan golden tests, integration testing dengan flutter_test dan flutter drive, serta continuous testing dan test automation. Kualitas aplikasi kalian mulai dipertanggungjawabkan lewat tes.