dart2js 后异步函数中两个 keyCode 的比较不正确
Posted
技术标签:
【中文标题】dart2js 后异步函数中两个 keyCode 的比较不正确【英文标题】:Incorrect comparison of two keyCodes in async function after dart2js 【发布时间】:2015-06-25 00:50:30 【问题描述】:我不理解 dart2js 代码的这种行为。 我只有在异步函数中才有这个,并且只有在编译为 JS 之后。
e.keyCode is equal 13
KeyCode.ENTER is equal 13
但是
(e.keyCode == KeyCode.ENTER) is false
这是调试我的问题的简单代码。 怎么回事?
import 'dart:html';
main() async
await for(KeyboardEvent e in window.onKeyDown)
print('e.keyCode : $e.keyCode');
print('e.keyCode.hashCode : $e.keyCode.hashCode');
print('KeyCode.ENTER : $KeyCode.ENTER');
print('KeyCode.ENTER.hashCode : $KeyCode.ENTER.hashCode');
print('e.keyCode.runtimeType : $e.keyCode.runtimeType');
print('KeyCode.ENTER.runtimeType : $KeyCode.ENTER.runtimeType');
print('e.keyCode == KeyCode.ENTER $e.keyCode == KeyCode.ENTER');
print('e.keyCode != KeyCode.ENTER $e.keyCode != KeyCode.ENTER');
int a = e.keyCode;
int b = KeyCode.ENTER;
print('a = $a');
print('b = $b');
print('a.hashCode = $a.hashCode');
print('b.hashCode = $b.hashCode');
print('a == b $(a == b).toString()');
print('a == 13 $(a == 13).toString()');
print('b == 13 $(b == 13).toString()');
if(a == b)
print('DART: a == b');
else
print('DART: a != b');
按 Enter 后在 Chrome 上的输出(dart2js - 缩小):
e.keyCode : 13 e.keyCode.hashCode : 13 KeyCode.ENTER : 13 KeyCode.ENTER.hashCode : 13 e.keyCode.runtimeType : int KeyCode.ENTER.runtimeType : int e.keyCode == KeyCode.ENTER false e.keyCode != KeyCode.ENTER true a = 13 b = 13 a.hashCode = 13 b.hashCode = 13 a == b 真 a == 13 对 b == 13 真 飞镖:a != b
在 DartVM (Dartium) 上一切正常:
e.keyCode : 13 e.keyCode.hashCode : 13 KeyCode.ENTER : 13 KeyCode.ENTER.hashCode : 13 e.keyCode.runtimeType : int KeyCode.ENTER.runtimeType : int e.keyCode == KeyCode.ENTER true e.keyCode != KeyCode.ENTER false a = 13 b = 13 a.hashCode = 13 b.hashCode = 13 a == b 真 a == 13 对 b == 13 真 飞镖:a == b
// 编辑 我注意到我使用 keyCode 并不重要。 这是异步问题。 以下代码在编译为 JS 后在 Dartium 上返回“OK”,在 Chrome 上返回“NOPE”。
import 'dart:async';
main() async
var ctrl = new StreamController();
ctrl.add(true);
await for(var e in ctrl.stream)
if(e == e)
print('OK');
else
print('NOPE');
【问题讨论】:
您应该在 www.dartbug.com 提交错误。你使用的是哪个版本的 dart-sdk? 最终的 .js 代码甚至不包含字符串“DART: a == b”。 Dart Editor 版本 1.9.3.release (STABLE) Dart SDK 版本 1.9.3 【参考方案1】:这确实和this bug一样。
为 async for 循环的迭代变量推断了错误的类型。
在 1.10 中已修复。
【讨论】:
这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post。 @Gabriel.Massana 我确实认为这回答了这个问题,因为除了更新之外没有真正的解决方案。我编辑了答案以将链接添加到 bugtracker 以供将来的读者参考。 我也没有看到@0pako0 回答的任何其他信息。 @GünterZöchbauer 嗯,确认这是一个已知的错误,给出它的链接,做一个简短的,以防链接中断,并确保它修复的版本。恕我直言,这是一个更好的答案,因为有事实,而不仅仅是观察。 我更愿意评论 @0pako0 的回答 - 但没有足够的分数。【参考方案2】:这一定是 1.9.3 的 dart2js 错误。
我现在使用 Dart SDK 版本 1.10.0-dev.1.5,一切正常。如果我想使用“等待”,这只是我找到的解决方案。
【讨论】:
以上是关于dart2js 后异步函数中两个 keyCode 的比较不正确的主要内容,如果未能解决你的问题,请参考以下文章