【问题标题】:How to prevent socket timeout error when printing to ESC/POS with Flutter使用 Flutter 打印到 ESC/POS 时如何防止套接字超时错误
【发布时间】:2020-04-17 10:58:14
【问题描述】:

我正在使用Flutteresc_pos_printer 1.5.0 打印到热敏收据打印机。如果打印机在线,它工作正常,但当它不在线时,我得到一个套接字超时,即使我将代码嵌套在 try / catch 块中。

通常我希望打印机将通过以太网连接,但也可以是 WiFi。

包作者推荐使用andrey-ushakov/ping_discover_network 但那个包裹在README

可用于查找打印机(例如,在端口 9100 上)和任何 本地网络中的其他设备和服务。

设备应连接到 Wi-Fi 网络。 wifi包允许 获取本地 IP 地址/网络子网。

这是错误:

错误:flutter/lib/ui/ui_dart_state.cc(157)] 未处理的异常: SocketException:操作系统错误:连接超时,errno = 110

这是我的代码:

  try {    

    Printer.connect('192.168.1.100', port: 9100).then( (printer) {

      printer.println('welcome',
        styles: PosStyles(
          height: PosTextSize.size2,
          width: PosTextSize.size2,
        ));

      printer.cut();
      printer.disconnect();
      }
    );
    }    
    catch (e) {    
      print(e);
      // do stuff
    }  
  }

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    问题是Printer.connect 方法返回一个Future,这意味着工作是异步完成的。

    由于await没有暂停代码执行,因此执行完成方法并返回调用者方法,而不关心.then()中块内代码的执行。

    您可以执行以下操作:

    1. 您可以使用 Future 的 catchError 并捕获异常,而无需等待 .then() 块执行:
        Printer.connect('192.168.1.100', port: 9100).then( (printer) {
          printer.println('welcome',
            styles: PosStyles(
              height: PosTextSize.size2,
              width: PosTextSize.size2,
            ));
    
          printer.cut();
          printer.disconnect();
          }
        ).catchError((e) {
          //handle the exception the way you want, like following
          print('Caught error when processing: $e');
        });
    
    1. 保持 try catch 不变,只需为方法调用添加 await
    
    try{
       final printer = await Printer.connect('192.168.1.100', port: 9100);
       printer.println('welcome',
            styles: PosStyles(
              height: PosTextSize.size2,
              width: PosTextSize.size2,
       ));
    
       printer.cut();
       printer.disconnect();
      } catch (e) {    
          print(e);
          // do stuff
      }  
    

    基于 Future 的错误处理来源:https://dart.dev/guides/libraries/futures-error-handling

    如果您有任何疑问,请告诉我。

    【讨论】:

    • 使用 1. 上面我得到 'E/flutter (9624): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] 未处理异常:NoSuchMethodError: Class 'SocketException' has no instance吸气剂'错误'。 E/flutter(9624):接收者:'SocketException'实例 E/flutter(9624):尝试调用:错误
    • 这只是一个示例代码,您可以做任何您想要处理的异常。让我更新答案以消除任何混乱。
    猜你喜欢
    • 1970-01-01
    • 2014-12-14
    • 2021-03-26
    • 1970-01-01
    • 2014-08-25
    • 2018-09-25
    • 2016-08-25
    • 2020-07-21
    • 2020-02-11
    相关资源
    最近更新 更多