Commit ff63abb
Changed files (2)
app
lib
components
ble_input
app/lib/components/ble_input/ble_input.dart
@@ -7,22 +7,37 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
/// An interactive way to add measurements over bluetooth.
-class BleInput extends StatelessWidget{
+class BleInput extends StatefulWidget {
/// Create an interactive bluetooth measurement adder.
- BleInput({super.key});
+ const BleInput({super.key, this.bloc});
- final _bloc = BleInputBloc();
+ /// Logic implementation of this input form.
+ final BleInputBloc? bloc; // Configurable for testing.
+
+ @override
+ State<BleInput> createState() => _BleInputState();
+}
+
+class _BleInputState extends State<BleInput> {
+
+ late final BleInputBloc bloc;
+
+ @override
+ void initState() {
+ super.initState();
+ bloc = widget.bloc ?? BleInputBloc();
+ }
@override
Widget build(BuildContext context) => SizeChangedLayoutNotifier(
child: BlocBuilder<BleInputBloc, BleInputState>(
- bloc: _bloc,
+ bloc: bloc,
builder: (BuildContext context, BleInputState state) {
final localizations = AppLocalizations.of(context)!;
return switch (state) {
BleInputClosed() => IconButton(
icon: const Icon(Icons.bluetooth),
- onPressed: () => _bloc.add(OpenBleInput()),
+ onPressed: () => bloc.add(OpenBleInput()),
),
BleInputLoadInProgress() => _buildTwoElementCard(context,
const CircularProgressIndicator(),
@@ -31,13 +46,13 @@ class BleInput extends StatelessWidget{
BleInputLoadFailure() => _buildTwoElementCard(context,
const Icon(Icons.bluetooth_disabled),
Text(localizations.errBleCantOpen),
- onTap: () => _bloc.add(OpenBleInput()),
+ onTap: () => bloc.add(OpenBleInput()),
),
BleInputLoadSuccess() => state.availableDevices.isEmpty
? _buildTwoElementCard(context,
const Icon(Icons.info),
Text(localizations.errBleNoDev),
- onTap: () => _bloc.add(OpenBleInput()),
+ onTap: () => bloc.add(OpenBleInput()),
) : _buildMainCard(context, ListView.builder(
itemCount: state.availableDevices.length,
itemBuilder: (context, idx) => ListTile(
@@ -45,13 +60,13 @@ class BleInput extends StatelessWidget{
trailing: state.availableDevices[idx].connectable == Connectable.available
? const Icon(Icons.bluetooth_audio)
: const Icon(Icons.bluetooth_disabled),
- onTap: () => _bloc.add(BleInputDeviceSelected(state.availableDevices[idx])),
+ onTap: () => bloc.add(BleInputDeviceSelected(state.availableDevices[idx])),
),
),),
BleInputPermissionFailure() => _buildTwoElementCard(context,
const Icon(Icons.bluetooth_disabled),
Text(localizations.errBleNoPerms),
- onTap: () => _bloc.add(OpenBleInput()),
+ onTap: () => bloc.add(OpenBleInput()),
),
BleConnectInProgress() => _buildTwoElementCard(context,
const CircularProgressIndicator(),
@@ -60,7 +75,7 @@ class BleInput extends StatelessWidget{
BleConnectFailed() => _buildTwoElementCard(context,
const Icon(Icons.bluetooth_disabled),
Text(localizations.errBleCouldNotConnect),
- onTap: () => _bloc.add(OpenBleInput()),
+ onTap: () => bloc.add(OpenBleInput()),
),
BleConnectSuccess() => _buildTwoElementCard(context,
const Icon(Icons.bluetooth_connected),
@@ -104,7 +119,7 @@ class BleInput extends StatelessWidget{
alignment: Alignment.topRight,
child: IconButton(
icon: const Icon(Icons.close),
- onPressed: () => _bloc.add(CloseBleInput()),
+ onPressed: () => bloc.add(CloseBleInput()),
),
),
],
@@ -126,4 +141,4 @@ class BleInput extends StatelessWidget{
),
),),
);
-}
\ No newline at end of file
+}
app/lib/components/ble_input/ble_input_bloc.dart
@@ -8,29 +8,11 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
import 'package:permission_handler/permission_handler.dart';
-// TODO: docs
+/// Logic for bluetooth measurement input.
class BleInputBloc extends Bloc<BleInputEvent, BleInputState> {
- final _ble = FlutterReactiveBle();
- final Set<DiscoveredDevice> _availableDevices = {};
-
- final _requiredServices = [
- Uuid.parse('1810'),
- ];
- // TODO: use repo
-
+ /// Create logic component for bluetooth measurement input.
BleInputBloc(): super(BleInputClosed()) {
- on<BleInputOpened>((event, emit) async {
- /* testing widget
- emit(BleMeasurementSuccess(BloodPressureRecord(DateTime.now(), 123, 456, 578, 'test'),
- bodyMoved: null,
- cuffLoose: false,
- irregularPulse: true,
- improperMeasurementPosition: true,
- measurementStatus: MeasurementStatus.ok,
- ),);
- return;
- */
-
+ on<OpenBleInput>((event, emit) async {
emit(BleInputLoadInProgress());
if (await Permission.bluetoothConnect.isDenied) {
emit(BleInputPermissionFailure());
@@ -54,8 +36,6 @@ class BleInputBloc extends Bloc<BleInputEvent, BleInputState> {
return BleInputLoadSuccess(_availableDevices.toList());
},);
} catch (e) {
- // TODO: check its really this type of exception
- print(e);
emit(BleInputLoadFailure());
}
});
@@ -120,8 +100,6 @@ class BleInputBloc extends Bloc<BleInputEvent, BleInputState> {
),);
});
- // TODO: use _ble.statusStream ?
-
// TODO: show capabilities during testing:
// _ble.getDiscoveredServices()
@@ -134,4 +112,12 @@ class BleInputBloc extends Bloc<BleInputEvent, BleInputState> {
}
+ final _ble = FlutterReactiveBle();
+
+ final Set<DiscoveredDevice> _availableDevices = {};
+
+ final _requiredServices = [
+ Uuid.parse('1810'),
+ ];
+
}