来自 dart2js 检查模式的不清楚错误
unclear error from dart2js checked mode
我原来的错误是 An attempt was made to use an object that is not, or is no longer, usable
。在使用默认设置的 dart2js 运行s 之后,它很难阅读,而且我在调试输出时遇到了麻烦,所以我将这些选项添加到我的 pubspec.yaml
:
- $dart2js:
checked: true
sourceMaps: true
verbose: true
minify: false
我原以为会出现问题,但我希望错误消息足够清楚以便我可以解决问题,但我理解我遇到的错误。
我得到的新错误是:
Error:
dart<.wrapException()
dart<._rootHandleUncaughtError_closure.call[=11=]()
dart<._microtaskLoop()
dart<._startMicrotaskLoop<()
dart<._AsyncRun__initializeScheduleImmediate_internalCallback.call<()
dart<.invokeClosure_closure0.call[=11=]()
dart<._IsolateContext.eval()
dart<._callInIsolate()
dart<.invokeClosure<()
dart<.convertDartClosureToJS/$function</<()
看起来 dart 在将闭包转换为 js 函数时遇到了一些问题。我原以为这会在 dart2js
为 运行 时完成,而不是在应用程序在浏览器中 运行ning 时完成。
我的代码没有任何显式闭包,但我确实使用了 async await
。我假设这些将被转换为闭包是否正确?
为了以防万一,我也在使用 Angular2。
更新
我的问题似乎是由我使用 dart:html
中的 HttpRequest.request()
引起的。
HttpRequest res = await HttpRequest.request( "${API_URL}/login",
method : "POST",
responseType: "json",
mimeType : "application/json",
sendData : JSON.encode( req_data ) );
print( res.status );
如果我删除检查模式并构建它,则会出现 An attempt was made to use an object that is not, or is no longer, usable
错误。
看来我已经通过更改 HttpRequest
class.
的使用解决了这个问题
发件人:
HttpRequest res = await HttpRequest.request( "${API_URL}/login",
method : "POST",
responseType: "json",
mimeType : "application/json",
sendData : JSON.encode( req_data ) );
print( res.status );
收件人:
HttpRequest res = new HttpRequest()
..open( "POST", "${API_URL}/login" );
req
..onLoadEnd.listen( ( ProgressEvent e ) {
print( res.status );
})
..send( JSON.encode( req_data ) );
我不确定实际问题是什么,但这样我就不会得到 InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable
或更长的飞镖错误:
Error:
dart<.wrapException()
dart<._rootHandleUncaughtError_closure.call[=12=]()
dart<._microtaskLoop()
dart<._startMicrotaskLoop<()
dart<._AsyncRun__initializeScheduleImmediate_internalCallback.call<()
dart<.invokeClosure_closure0.call[=12=]()
dart<._IsolateContext.eval()
dart<._callInIsolate()
dart<.invokeClosure<()
dart<.convertDartClosureToJS/$function</<()
我的猜测是 dart2js
在使用 async await
"implicit" 闭包时遇到了一些麻烦,而当我使用 "explicit here's a function that closes over it's environment" 闭包时会更快乐。
感谢 Günter Zöchbauer 的帮助。
你应该改用 http 包
API更好,更直观。
例如您的要求:
var client = new BrowserClient();
var response = await client.post("${API_URL}/login",
body: JSON.encode( req_data ));
var data = JSON.decode(response.body);
client.close();
如果您希望更精确地定义请求,您可能会在参数中看到。
我原来的错误是 An attempt was made to use an object that is not, or is no longer, usable
。在使用默认设置的 dart2js 运行s 之后,它很难阅读,而且我在调试输出时遇到了麻烦,所以我将这些选项添加到我的 pubspec.yaml
:
- $dart2js:
checked: true
sourceMaps: true
verbose: true
minify: false
我原以为会出现问题,但我希望错误消息足够清楚以便我可以解决问题,但我理解我遇到的错误。
我得到的新错误是:
Error:
dart<.wrapException()
dart<._rootHandleUncaughtError_closure.call[=11=]()
dart<._microtaskLoop()
dart<._startMicrotaskLoop<()
dart<._AsyncRun__initializeScheduleImmediate_internalCallback.call<()
dart<.invokeClosure_closure0.call[=11=]()
dart<._IsolateContext.eval()
dart<._callInIsolate()
dart<.invokeClosure<()
dart<.convertDartClosureToJS/$function</<()
看起来 dart 在将闭包转换为 js 函数时遇到了一些问题。我原以为这会在 dart2js
为 运行 时完成,而不是在应用程序在浏览器中 运行ning 时完成。
我的代码没有任何显式闭包,但我确实使用了 async await
。我假设这些将被转换为闭包是否正确?
为了以防万一,我也在使用 Angular2。
更新
我的问题似乎是由我使用 dart:html
中的 HttpRequest.request()
引起的。
HttpRequest res = await HttpRequest.request( "${API_URL}/login",
method : "POST",
responseType: "json",
mimeType : "application/json",
sendData : JSON.encode( req_data ) );
print( res.status );
如果我删除检查模式并构建它,则会出现 An attempt was made to use an object that is not, or is no longer, usable
错误。
看来我已经通过更改 HttpRequest
class.
发件人:
HttpRequest res = await HttpRequest.request( "${API_URL}/login",
method : "POST",
responseType: "json",
mimeType : "application/json",
sendData : JSON.encode( req_data ) );
print( res.status );
收件人:
HttpRequest res = new HttpRequest()
..open( "POST", "${API_URL}/login" );
req
..onLoadEnd.listen( ( ProgressEvent e ) {
print( res.status );
})
..send( JSON.encode( req_data ) );
我不确定实际问题是什么,但这样我就不会得到 InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable
或更长的飞镖错误:
Error:
dart<.wrapException()
dart<._rootHandleUncaughtError_closure.call[=12=]()
dart<._microtaskLoop()
dart<._startMicrotaskLoop<()
dart<._AsyncRun__initializeScheduleImmediate_internalCallback.call<()
dart<.invokeClosure_closure0.call[=12=]()
dart<._IsolateContext.eval()
dart<._callInIsolate()
dart<.invokeClosure<()
dart<.convertDartClosureToJS/$function</<()
我的猜测是 dart2js
在使用 async await
"implicit" 闭包时遇到了一些麻烦,而当我使用 "explicit here's a function that closes over it's environment" 闭包时会更快乐。
感谢 Günter Zöchbauer 的帮助。
你应该改用 http 包
API更好,更直观。 例如您的要求:
var client = new BrowserClient();
var response = await client.post("${API_URL}/login",
body: JSON.encode( req_data ));
var data = JSON.decode(response.body);
client.close();
如果您希望更精确地定义请求,您可能会在参数中看到。