You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 05:55:42