import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:logger/logger.dart'; var logger = Logger(printer: PrettyPrinter()); class DeviceDetailsScreen extends StatefulWidget { final BluetoothDevice btDevice; const DeviceDetailsScreen({super.key, required this.btDevice}); @override State createState() { return DeviceDetailsState(); } } class DeviceDetailsState extends State { String connectStatus = ""; // Just to have a resonable default subscription? StreamSubscription subs = Stream.empty().listen((e) => ()); /// Whether the back button should be active. bool backActive = false; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Theme.of(context).colorScheme.inversePrimary, title: Text("Device details"), ), body: Center( child: Column( spacing: 20, children: [ Text(connectStatus), ElevatedButton( onPressed: backActive ? backClick : null, child: Text("Back"), ), ], ), ), ); } @override void initState() { super.initState(); _doConnect(); } void backClick() { Navigator.pop(context); } void onConnStateChange(BluetoothConnectionState event) { setState(() { connectStatus = event.toString(); }); logger.i("New conn state: ${event.toString()}"); } @override void deactivate() { super.deactivate(); logger.i("Closing state"); subs.cancel().ignore(); widget.btDevice.disconnect().ignore(); } void _doConnect() async { final dev = widget.btDevice; subs.cancel().ignore(); subs = dev.connectionState.listen(onConnStateChange); try { logger.i("Try to connect..."); // connect timeout doesn't work under Linux await dev.connect().timeout(Duration(seconds: 2)); logger.i("Connected!"); connectStatus = "Connected"; } catch (e) { logger.e(e); dev.disconnect().ignore(); connectStatus = e.toString(); } finally { backActive = true; if (mounted) { setState(() {}); } } } }