dart2js后异步函数中两个keyCodes的比较不正确

时间:2015-04-18 00:41:22

标签: dart dart-async dart2js

我不了解dart2js代码的这种行为 我只在async函数中使用它,并且仅在编译为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真实   b == 13真实   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真实   b == 13真实   DART:a == b

//编辑
我注意到我使用keyCode并不重要 这是异步问题 以下代码返回'确定'在Dartium和' NOPE'在编译成JS之后在Chrome上。

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');
  }
}

2 个答案:

答案 0 :(得分:3)

这与this bug确实相同。

为async for循环的迭代变量推断出错误的类型。

它固定在1.10。

答案 1 :(得分:1)

这必须是1.9.3 dart2js bug。

我现在使用Dart SDK版本1.10.0-dev.1.5,一切正常。这只是我找到的解决方案,如果我想使用'等待'。