semesterprojekt-bluetooth-p.../lib/screens/bluetooth_device_list_entry...

73 lines
2.3 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_bluetooth_serial/flutter_bluetooth_serial.dart';
class BluetoothDeviceListEntry extends ListTile {
BluetoothDeviceListEntry({super.key,
required BluetoothDevice device,
int? rssi,
GestureTapCallback? onTap,
GestureLongPressCallback? onLongPress,
bool enabled = true,
}) : super(
onTap: onTap,
onLongPress: onLongPress,
enabled: enabled,
leading: Icon(device.isConnected ? Icons.bluetooth_connected : Icons.bluetooth),
title: Text(device.name ?? "~ UNKNOWN_DEVICE ~"),
subtitle: Text(device.address.toString()),
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
rssi != null
? Container(
margin: const EdgeInsets.all(8.0),
child: DefaultTextStyle(
style: _computeTextStyle(rssi),
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Text(rssi.toString()),
const Text('dBm'),
],
),
),
)
: const SizedBox(width: 0, height: 0),
device.isBonded
? const Icon(Icons.link)
: const SizedBox(width: 0, height: 0),
IconButton(
onPressed: () {},
icon: const Icon(Icons.settings)
),
],
),
);
static TextStyle _computeTextStyle(int rssi) {
/**/ if (rssi >= -35) {
return TextStyle(color: Colors.greenAccent[700]);
} else if (rssi >= -45) {
return TextStyle(
color: Color.lerp(
Colors.greenAccent[700], Colors.lightGreen, -(rssi + 35) / 10));
} else if (rssi >= -55) {
return TextStyle(
color: Color.lerp(
Colors.lightGreen, Colors.lime[600], -(rssi + 45) / 10));
} else if (rssi >= -65) {
return TextStyle(
color: Color.lerp(Colors.lime[600], Colors.amber, -(rssi + 55) / 10));
} else if (rssi >= -75) {
return TextStyle(
color: Color.lerp(
Colors.amber, Colors.deepOrangeAccent, -(rssi + 65) / 10));
} else if (rssi >= -85) {
return TextStyle(
color: Color.lerp(
Colors.deepOrangeAccent, Colors.redAccent, -(rssi + 75) / 10));
} else {
return const TextStyle(color: Colors.redAccent);
}
}
}