我不了解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-缩小):
在DartVM(Dartium)上,一切正确:
//编辑
我注意到我使用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');
}
}
最佳答案
这确实与this bug相同。
为async for循环的迭代变量推断出错误的类型。
它已在1.10中修复。
关于dart - dart2js之后异步函数中两个keyCodes的不正确比较,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29711573/