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()); // Is this even needed? I have no idea... class Device extends StatelessWidget { const Device({super.key}); @override Widget build(BuildContext context) { return MaterialApp(); } } class DeviceScreen extends StatefulWidget { final BluetoothDevice btDevice; const DeviceScreen({super.key, required this.btDevice}); @override State createState() { return DeviceState(); } } class DeviceState extends State { String connectStatus = ""; // ??? StreamSubscription subs = Stream.empty().listen((e) => ()); bool backActive = false; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(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: 1)); logger.i("Connected!"); connectStatus = "Connected"; } catch (e) { dev.disconnect().ignore(); connectStatus = e.toString(); } finally { backActive = true; if (mounted) { setState(() {}); } } } }