使用Flutter打印到ESC / POS时如何防止套接字超时错误

时间:2019-12-27 13:11:55

标签: flutter dart

我正在使用Flutter软件包esc_pos_printer 1.5.0打印到热敏票据打印机。如果打印机在线,它可以正常工作,但是当打印机不在线时,即使我将代码嵌套在try / catch块中,我也会收到套接字超时。

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

软件包作者建议使用andrey-ushakov/ping_discover_network  但是该软件包在README

中说
  

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

     

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

这是错误:

  

ERROR: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
    }  
  }

1 个答案:

答案 0 :(得分: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. 保持尝试捕获,并为方法调用添加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
  }  

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

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