我最近想实现一个需要在使用串行端口通信的桌面和网络上运行的解决方案。 由于没有现成的库支持这两个平台。我正在使用
然后我知道我需要根据我正在编译代码的平台有选择地导入库。所以我找到了另一个 Stackoverflow 线程来解释如何做到这一点。 依赖于平台的导入解决方案
我通读了那个答案并实现了同样的事情。对于 Windows,代码编译成功并且行为符合我的预期。但 web 无法编译并在编译过程中抛出错误。
我也会分享下面的代码文件。
抽象类
import 'package:dev_tools/adapters/serial_stub.dart'
if (dart.library.io) 'package:dev_tools/adapters/desktop_serial.dart'
if (dart.library.html) 'package:dev_tools/adapters/web_serial.dart';
abstract class SerialInterface {
factory SerialInterface() => getSerialInterface();
dynamic getPort(String portName);
dynamic getSelectedPort();
List<String> getAvailablePorts();
bool close();
String get name;
bool get isOpen;
}
存根
import 'package:dev_tools/interfaces/Iserial.dart';
SerialInterface getSerialInterface() => throw UnsupportedError(
'Cannot create a keyfinder without the packages dart:html or package:shared_preferences');
桌面_串行
import 'package:dev_tools/interfaces/Iserial.dart';
SerialInterface getSerialInterface() => DesktopSerialInterface();
class DesktopSerialInterface implements SerialInterface {
// Map<String, SerialPort?> portList = {};
// SerialPort? _selectedPort;
// SerialPortReader? _serialPortReader;
// Stream? _incomingDataStream;
// String serialData = "";
DesktopSerialInterface() {
print("DesktopSerial Initialized");
}
@override
List<String> getAvailablePorts() {
List<String> serialNameList = [];
return serialNameList;
}
@override
dynamic getPort(String portName) {
return null;
}
@override
dynamic getSelectedPort() {
return null;
}
@override
bool close() {
return false;
}
String get name => throw UnimplementedError("name getter not implemented");
bool get isOpen => throw UnimplementedError("isOpen getter not implemented");
}
网络_串行
import 'package:dev_tools/interfaces/Iserial.dart';
SerialInterface getSerialAdapter() => WebSerialInterface();
class WebSerialInterface implements SerialInterface {
// Map<String, SerialPort?> portList = {};
// SerialPort? _selectedPort;
WebSerialInterface() {
print("WebSerial Initialized");
// window.navigator.serial.requestPort().then((port) => _selectedPort = port);
// _selectedPort!.readable.reader.read().asStream()
}
@override
List<String> getAvailablePorts() {
List<String> serialNameList = [];
return serialNameList;
}
@override
dynamic getPort(String portName) {
// window.navigator.serial.requestPort().then((port) => _selectedPort = port);
return null;
}
@override
dynamic getSelectedPort() {
return null;
}
@override
bool close() {
return false;
}
String get name => throw UnimplementedError("name getter not implemented");
bool get isOpen => throw UnimplementedError("isOpen getter not implemented");
}
我不确定我做错了什么。 由于桌面构建正在工作,只有 Web 构建不起作用,我觉得选择性导入不起作用。
那么 dart.library.html 是否已被弃用或其他什么?因为这是我们为 Web 构建导入 getSerialInterface 函数的地方
我有一段时间不再研究这个问题,因为我无法弄清楚这一点。但当我重新思考这个问题时,我发现了问题所在,我觉得这很愚蠢。但对于那些想知道可能是什么问题的人来说。
SerialInterface getSerialAdapter() => WebSerialInterface();
需要更改为
SerialInterface getSerialInterface() => WebSerialInterface();