The JK Jung Times
TECHNOLOGY

Flutter Platform Channels: When Dart Isn't Enough

Alarm scheduling on iOS and Android requires native code. Here's how I bridged Flutter to the platform layer without losing my mind.

By JK Jung, Staff Developer | Los Angeles Bureau | Thursday, April 16, 2026

Flutter Platform Channels: When Dart Isn't Enough

Flutter's promise is cross-platform development from a single codebase. That promise holds for 90% of features. The other 10% — the features that need to talk to the operating system directly — require platform channels. For Flashcards Alarm, alarm scheduling was firmly in that 10%.

The decision to use platform channels should never be taken lightly. Each channel you create is a contract between three codebases — Dart, Swift, and Kotlin — that must be maintained in sync. Before reaching for platform channels, I exhaust every Dart-only option: community plugins, FFI bindings, and isolate-based workarounds. For Flashcards Alarm, alarm scheduling was genuinely impossible without native code. No Dart plugin could guarantee the exact-time, wake-from-sleep, survives-reboot alarm behavior we needed on both platforms. That clarity of 'this truly can't be done in Dart' is the bar I set before writing any platform channel code.

The problem: iOS and Android handle alarms completely differently. iOS uses UNNotificationRequest for scheduling, with strict limitations on how many alarms can be active. Android uses AlarmManager or the newer ExactAlarmPermission API, with

...

Tags: Flutter, iOS, Android, Native