来自 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 包

https://pub.dartlang.org/packages/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();

如果您希望更精确地定义请求,您可能会在参数中看到。