Flutter Web平台相关导入未按预期工作问题排查
跨平台串口通信方案的Web编译问题
我需要实现同时支持桌面(Windows、Mac)和Web平台的串口通信方案,由于没有开箱即用的跨平台库,因此分别使用flutter_libserialport(桌面)和serial(Web)库。
为实现平台针对性导入,我参考相关方案进行了实现,但Windows编译正常,Web编译时却报错。我不确定问题出在哪里,怀疑平台选择性导入未生效,想确认dart.library.html是否已被废弃?
相关代码文件
抽象类(Iserial.dart)
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; }
Stub文件(serial_stub.dart)
import 'package:dev_tools/interfaces/Iserial.dart'; SerialInterface getSerialInterface() => throw UnsupportedError( 'Cannot create a keyfinder without the packages dart:html or package:shared_preferences');
桌面端实现(desktop_serial.dart)
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"); }
Web端实现(web_serial.dart)
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"); }
内容的提问来源于stack exchange,提问作者Chameera Subasinghe
相关产品推荐
相关产品推荐

