Commit 1cb9812
Changed files (2)
app
lib
bluetooth
components
app/lib/bluetooth/ble_read_cubit.dart
@@ -36,12 +36,29 @@ class BleReadCubit extends Cubit<BleReadState> {
unawaited(_startRead());
}
+ // TODO: consider using Future for this
+
/// Bluetooth device to connect to.
///
/// Must have an active established connection and support the measurement
/// characteristic.
final BluetoothDevice _device;
+ @override
+ Future<void> close() async {
+ if (_device.isConnected) {
+ try {
+ Log.trace('BleReadCubit close: Attempting disconnect from ${_device.advName}');
+ await _device.disconnect();
+ assert(_device.isDisconnected);
+ } catch (e) {
+ Log.err('unable to disconnect', [e, _device]);
+ }
+ }
+
+ await super.close();
+ }
+
Future<void> _startRead() async {
Log.trace('_startRead');
@@ -53,6 +70,8 @@ class BleReadCubit extends Cubit<BleReadState> {
Log.trace('BleReadCubit _startRead: Device not connected');
emit(BleReadFailure());
return;
+ } else {
+ Log.trace('Connection successful');
}
}
assert(_device.isConnected);
app/lib/components/bluetooth_input.dart
@@ -41,20 +41,24 @@ class _BluetoothInputState extends State<BluetoothInput> {
final BluetoothCubit _bluetoothCubit = BluetoothCubit();
StreamSubscription<BluetoothState>? _bluetoothSubscription;
DeviceScanCubit? _deviceScanCubit;
+ BleReadCubit? _deviceReadCubit;
@override
void dispose() async {
await _bluetoothSubscription?.cancel();
await _bluetoothCubit.close();
await _deviceScanCubit?.close();
+ await _deviceReadCubit?.close();
super.dispose();
}
void _returnToIdle() async {
- await _bluetoothSubscription?.cancel();
+ await _bluetoothSubscription?.cancel();
_bluetoothSubscription = null;
await _deviceScanCubit?.close();
_deviceScanCubit = null;
+ await _deviceReadCubit?.close();
+ _deviceReadCubit = null;
if (_isActive) {
setState(() {
_isActive = false;
@@ -89,12 +93,13 @@ class _BluetoothInputState extends State<BluetoothInput> {
),
// distinction
DeviceSelected() => BlocBuilder<BleReadCubit, BleReadState>(
- bloc: BleReadCubit(state.device),
+ bloc: () { _deviceReadCubit = BleReadCubit(state.device); return _deviceReadCubit; }(),
builder: (BuildContext context, BleReadState state) {
Log.trace('_BluetoothInputState BleReadCubit: $state');
return switch (state) {
BleReadInProgress() => _buildMainCard(context,
child: const CircularProgressIndicator(),
+ // TODO: onTap to retry
),
BleReadFailure() => MeasurementFailure(
onTap: _returnToIdle,