Trying to build out custom widget for usb_serial https://pub.dev/packages/usb_serial/example and while I'm able to see usb devices with correct productName and manufacturerName; am unable to get change in status or show serialData.
usb_serial not working
Custom Code
am using following code
// Automatic FlutterFlow imports
import '/backend/schema/structs/index.dart';
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/custom_code/widgets/index.dart'; // Imports other custom widgets
import '/custom_code/actions/index.dart'; // Imports custom actions
import '/flutter_flow/custom_functions.dart'; // Imports custom functions
import 'package:flutter/material.dart';
// Begin custom widget code
// DO NOT REMOVE OR MODIFY THE CODE ABOVE!
import 'dart:async';
import 'dart:typed_data';
import 'package:usb_serial/transaction.dart';
import 'package:usb_serial/usb_serial.dart';
////////////
class USBSerialWidget extends StatefulWidget {
const USBSerialWidget({
Key? key,
this.width,
this.height,
required this.rebuildpage,
}) : super(key: key);
final double? width;
final double? height;
final Future<dynamic> Function() rebuildpage;
@override
_USBSerialWidgetState createState() => _USBSerialWidgetState();
}
////////////
class _USBSerialWidgetState extends State<USBSerialWidget> {
UsbPort? _port;
String _status = "Idle";
List<Widget> _ports = [];
List<Widget> _serialData = [];
StreamSubscription<String>? _subscription;
Transaction<String>? _transaction;
UsbDevice? _device;
// TextEditingController _textController = TextEditingController();
////////////
Future<bool> _connectTo(device) async {
_serialData.clear();
if (_subscription != null) {
_subscription!.cancel();
_subscription = null;
}
if (_transaction != null) {
_transaction!.dispose();
_transaction = null;
}
if (_port != null) {
_port!.close();
_port = null;
}
if (device == null) {
_device = null;
setState(() {
_status = "Disconnected";
});
return true;
}
_port = await device.create();
if (await (_port!.open()) != true) {
setState(() {
_status = "Failed to open port";
});
return false;
}
_device = device;
await _port!.setDTR(true);
await _port!.setRTS(true);
await _port!.setPortParameters(
115200,
UsbPort.DATABITS_8,
UsbPort.STOPBITS_1,
UsbPort.PARITY_NONE,
);
_transaction = Transaction.stringTerminated(
_port!.inputStream as Stream<Uint8List>, Uint8List.fromList([13, 10]));
_subscription = _transaction!.stream.listen((String line) {
setState(() {
_serialData.add(Text(line));
if (_serialData.length > 20) {
_serialData.removeAt(0);
}
});
});
setState(() {
_status = "Connected";
});
return true;
}
////////////
void _getPorts() async {
_ports = [];
List<UsbDevice> devices = await UsbSerial.listDevices();
if (!devices.contains(_device)) {
_connectTo(null);
}
print(devices);
devices.forEach((device) {
_ports.add(ListTile(
title: Text(device.productName!),
subtitle: Text(device.manufacturerName!),
trailing: ElevatedButton(
child: Text(_device == device ? "Disconnect" : "Connect"),
onPressed: () {
_connectTo(_device == device ? null : device).then((res) {
_getPorts();
});
},
)));
});
setState(() {
print(_ports);
});
}
////////////
@override
void initState() {
super.initState();
UsbSerial.usbEventStream!.listen((UsbEvent event) {
_getPorts();
});
_getPorts();
}
////////////
@override
void dispose() {
super.dispose();
_connectTo(null);
}
////////////
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
children: <Widget>[
..._ports,
Text('Status: $_status\n'),
..._serialData,
],
),
),
);
}
}
https://pub.dev/packages/usb_serial lists setup instructions that I think relate to permissions.
I also have a custom action set to run on page load for permissions.
// Automatic FlutterFlow imports
import '/backend/schema/structs/index.dart';
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/custom_code/actions/index.dart'; // Imports other custom actions
import '/flutter_flow/custom_functions.dart'; // Imports custom functions
import 'package:flutter/material.dart';
// Begin custom action code
// DO NOT REMOVE OR MODIFY THE CODE ABOVE!
// Set your action name, define your arguments and return parameter,
// and then add the boilerplate code using the green button on the right!
import 'package:permission_handler/permission_handler.dart';
Future<void> requestPermissions() async {
await Permission.location.request();
// await Permission.usb.request();
await Permission.notification.request();
}
Have project settings/permissions set to following:
Location permission is required.
Notifications permission is required.
android.permission.WRITE_EXTERNAL_STORAGE
android.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_COARSE_LOCATION
android.permission.USB_PERMISSION
android.permission..USB_DEVICE_ATTACHED
android.hardware.usb.action.USB_DEVICE_ATTACHED
Yes
1
8 replies