import 'dart:async';
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter_blue_plus_ohos/flutter_blue_plus_ohos.dart';
import "../utils/snackbar.dart";
class DescriptorTile extends StatefulWidget {
final BluetoothDescriptor descriptor;
const DescriptorTile({Key? key, required this.descriptor}) : super(key: key);
@override
State<DescriptorTile> createState() => _DescriptorTileState();
}
class _DescriptorTileState extends State<DescriptorTile> {
List<int> _value = [];
late StreamSubscription<List<int>> _lastValueSubscription;
@override
void initState() {
super.initState();
_lastValueSubscription = widget.descriptor.lastValueStream.listen((value) {
_value = value;
if (mounted) {
setState(() {});
}
});
}
@override
void dispose() {
_lastValueSubscription.cancel();
super.dispose();
}
BluetoothDescriptor get d => widget.descriptor;
List<int> _getRandomBytes() {
final math = Random();
return [math.nextInt(255), math.nextInt(255), math.nextInt(255), math.nextInt(255)];
}
Future onReadPressed() async {
try {
await d.read();
Snackbar.show(ABC.c, "Descriptor Read : Success", success: true);
} catch (e) {
Snackbar.show(ABC.c, prettyException("Descriptor Read Error:", e), success: false);
}
}
Future onWritePressed() async {
try {
await d.write(_getRandomBytes());
Snackbar.show(ABC.c, "Descriptor Write : Success", success: true);
} catch (e) {
Snackbar.show(ABC.c, prettyException("Descriptor Write Error:", e), success: false);
}
}
Widget buildUuid(BuildContext context) {
String uuid = '0x${widget.descriptor.uuid.str.toUpperCase()}';
return Text(uuid, style: TextStyle(fontSize: 13));
}
Widget buildValue(BuildContext context) {
String data = _value.toString();
return Text(data, style: TextStyle(fontSize: 13, color: Colors.grey));
}
Widget buildReadButton(BuildContext context) {
return TextButton(
child: Text("Read"),
onPressed: onReadPressed,
);
}
Widget buildWriteButton(BuildContext context) {
return TextButton(
child: Text("Write"),
onPressed: onWritePressed,
);
}
Widget buildButtonRow(BuildContext context) {
return Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
buildReadButton(context),
buildWriteButton(context),
],
);
}
@override
Widget build(BuildContext context) {
return ListTile(
title: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
const Text('Descriptor'),
buildUuid(context),
buildValue(context),
],
),
subtitle: buildButtonRow(context),
);
}
}