使用 Flutter 打印到 ESC/POS 时如何防止套接字超时错误
Posted
技术标签:
【中文标题】使用 Flutter 打印到 ESC/POS 时如何防止套接字超时错误【英文标题】:How to prevent socket timeout error when printing to ESC/POS with Flutter 【发布时间】:2020-04-17 10:58:14 【问题描述】:我正在使用Flutter
包esc_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
【问题讨论】:
【参考方案1】:问题是Printer.connect
方法返回一个Future,这意味着工作是异步完成的。
由于await
没有暂停代码执行,因此执行完成方法并返回调用者方法,而不关心.then()
中块内代码的执行。
您可以执行以下操作:
-
您可以使用 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');
);
-
保持 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):尝试调用:错误 这只是一个示例代码,您可以做任何您想要处理的异常。让我更新答案以消除任何混乱。以上是关于使用 Flutter 打印到 ESC/POS 时如何防止套接字超时错误的主要内容,如果未能解决你的问题,请参考以下文章