dart2js 后异步函数中两个 keyCode 的比较不正确
Incorrect comparison of two keyCodes in async function after dart2js
我不明白 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 true
a == 13 true
b == 13 true
DART: 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 true
a == 13 true
b == 13 true
DART: a == b
// 编辑
我注意到我使用 keyCode 并不重要。
这是异步问题。
returns 'OK' 上的代码在编译为 JS 后 Chrome 上的 'NOPE' 和 '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');
}
}
这一定是 1.9.3 dart2js 的错误。
我现在使用 Dart SDK 版本 1.10.0-dev.1.5,一切正常。这只是我发现的解决方案,如果我想使用 'await for'.
这确实和this bug一样。
为异步for循环的迭代变量推断出错误的类型。
在 1.10 中已修复。
我不明白 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 true
a == 13 true
b == 13 true
DART: 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 true
a == 13 true
b == 13 true
DART: a == b
// 编辑
我注意到我使用 keyCode 并不重要。
这是异步问题。
returns 'OK' 上的代码在编译为 JS 后 Chrome 上的 'NOPE' 和 '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');
}
}
这一定是 1.9.3 dart2js 的错误。
我现在使用 Dart SDK 版本 1.10.0-dev.1.5,一切正常。这只是我发现的解决方案,如果我想使用 'await for'.
这确实和this bug一样。
为异步for循环的迭代变量推断出错误的类型。
在 1.10 中已修复。