Tôi không hiểu hành vi này của mã dart2js.
Tôi chỉ có tính năng này trong chức năng async và chỉ sau khi biên dịch sang JS.So sánh không chính xác hai mã khóa trong chức năng async sau dart2js
e.keyCode is equal 13
KeyCode.ENTER is equal 13
nhưng
(e.keyCode == KeyCode.ENTER) is false
Đây là mã đơn giản để gỡ rối vấn đề của tôi.
Có gì không?
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');
}
}
Output trên Chrome sau khi nhấn Enter (dart2js - minified):
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 đúng
a = 13
b = 13
a.hashCode = 13
b.hashCode = 13
a == b đúng
a == 13 đúng
b == 13 đúng
DART: a = b
On DartVM (Dartium) tất cả mọi thứ là chính xác:
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 đúng
e.keyCode = KeyCode.ENTER sai
a = 13
b = 13
a.hashCode = 13
!b.hashCode = 13
a == b đúng
a == 13 đúng
b == 13 đúng
DART: a == b
// EDIT
tôi nhận thấy rằng nó không quan trọng mà tôi đang sử dụng keyCode.
Đây là vấn đề không đồng bộ.
Mã bên dưới trả về 'OK' trên Dartium và 'NOPE' trên Chrome sau khi biên dịch sang JS.
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');
}
}
Bạn nên gửi một lỗi tại www.dartbug.com. Bạn đang sử dụng phiên bản dart-sdk nào? – Robert
mã .js cuối cùng thậm chí không chứa chuỗi "DART: a == b". – Robert
Dart Editor phiên bản 1.9.3.release (STABLE) Phiên bản SDK phi tiêu 1.9.3 – 0pako0