65 lines
1.6 KiB
Dart
65 lines
1.6 KiB
Dart
|
|
import 'dart:async';
|
||
|
|
|
||
|
|
import 'package:flutter/material.dart';
|
||
|
|
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
|
||
|
|
|
||
|
|
class ScanResultTile extends StatefulWidget {
|
||
|
|
const ScanResultTile({super.key, required this.result, this.onTap});
|
||
|
|
|
||
|
|
final ScanResult result;
|
||
|
|
final VoidCallback? onTap;
|
||
|
|
|
||
|
|
@override
|
||
|
|
State<ScanResultTile> createState() => _ScanResultTileState();
|
||
|
|
}
|
||
|
|
|
||
|
|
class _ScanResultTileState extends State<ScanResultTile> {
|
||
|
|
BluetoothConnectionState _connectionState = BluetoothConnectionState.disconnected;
|
||
|
|
|
||
|
|
late StreamSubscription<BluetoothConnectionState> _connectionStateSubscription;
|
||
|
|
|
||
|
|
@override
|
||
|
|
void initState() {
|
||
|
|
super.initState();
|
||
|
|
|
||
|
|
_connectionStateSubscription = widget.result.device.connectionState.listen((state) {
|
||
|
|
_connectionState = state;
|
||
|
|
if (mounted) {
|
||
|
|
setState(() {});
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
@override
|
||
|
|
void dispose() {
|
||
|
|
_connectionStateSubscription.cancel();
|
||
|
|
super.dispose();
|
||
|
|
}
|
||
|
|
|
||
|
|
bool get isConnected {
|
||
|
|
return _connectionState == BluetoothConnectionState.connected;
|
||
|
|
}
|
||
|
|
|
||
|
|
Widget _buildTitle(BuildContext context) {
|
||
|
|
return Text(
|
||
|
|
widget.result.advertisementData.advName,
|
||
|
|
overflow: TextOverflow.ellipsis,
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
@override
|
||
|
|
Widget build(BuildContext context) {
|
||
|
|
return Card(
|
||
|
|
child: ListTile(
|
||
|
|
title: _buildTitle(context),
|
||
|
|
subtitle: Text(
|
||
|
|
"Signal Strength (Less = farther): ${widget.result.rssi}",
|
||
|
|
overflow: TextOverflow.ellipsis,
|
||
|
|
),
|
||
|
|
trailing: Icon(Icons.arrow_forward_ios_rounded),
|
||
|
|
onTap: widget.result.advertisementData.connectable ? widget.onTap : null,
|
||
|
|
)
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|