// the find
PhilipsHue/flutter_reactive_ble
Flutter library that handles BLE operations for multiple devices.
A Flutter plugin for BLE communication that wraps CoreBluetooth (iOS/macOS) and RxAndroidBle (Android) behind a reactive Stream-based Dart API. It's backed by Philips Hue — they built it to drive their own Flutter app, so it's been tested against real hardware in production. Aimed at Flutter devs who need to talk to BLE peripherals without writing platform channel boilerplate themselves.
The Stream-based API is a good fit for BLE's inherently event-driven nature — scan results, connection state, and characteristic notifications all arrive as Dart streams instead of callback soup. The `connectToAdvertisingDevice` helper is a genuine quality-of-life addition that works around a well-known Android BLE bug where `connect()` hangs on out-of-range devices. Protobuf is used for platform channel serialization, which beats JSON for binary data and keeps the iOS/Android contracts typed. The monorepo split (platform interface, mobile implementation, Dart wrapper) follows the federated plugin pattern correctly, so a desktop or web implementation could be slotted in without touching the core.
The Android side hard-depends on RxAndroidBle, which means you inherit its RxJava 2 threading quirks — the 'undeliverable exception' workaround in the README requiring manual RxJava error handler setup in Kotlin/Java is a real footgun for Flutter devs who don't expect to touch native code. No background scanning support: BLE scanning on both platforms has OS-level restrictions when the app is backgrounded, and the library does nothing to help navigate that, leaving it as your problem. The `clearGattCache` operation is documented as using a hidden Android API on the greylist — fine to include but burying that warning at the bottom of the README rather than in the method signature is the wrong call. Activity since mid-2024 has been sparse; the issue tracker has open bugs about Android 14 connection reliability and there's no clear signal the Philips team is still actively maintaining this for Flutter 3.x.