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 中已修复。