【问题标题】:unclear error from dart2js checked mode来自 dart2js 检查模式的不清楚的错误
【发布时间】:2023-04-10 19:48:01
【问题描述】:

我原来的错误是An attempt was made to use an object that is not, or is no longer, usable。在 dart2js 以默认设置运行后,它很难阅读,而且我在调试输出时遇到了麻烦,所以我将这些选项添加到我的 pubspec.yaml:

- $dart2js:
    checked: true
    sourceMaps: true
    verbose: true
    minify: false

我原以为会出现问题,但我希望错误消息足够清晰,我可以解决它,但我理解我遇到的错误。

我得到的新错误是:

Error: 
  dart<.wrapException()
  dart<._rootHandleUncaughtError_closure.call$0()
  dart<._microtaskLoop()
  dart<._startMicrotaskLoop<()
  dart<._AsyncRun__initializeScheduleImmediate_internalCallback.call$1<()
  dart<.invokeClosure_closure0.call$0()
  dart<._IsolateContext.eval$1()
  dart<._callInIsolate()
  dart<.invokeClosure<()
  dart<.convertDartClosureToJS/$function</<()

看起来 dart 在将闭包转换为 js 函数时遇到了一些问题。我原以为这会在dart2js 运行时完成,而不是在应用程序在浏览器中运行时完成。

我的代码没有任何明确的闭包,但我确实使用了async await。我是否正确地假设这些将被转换为闭包?

以防万一,我也在使用 Angular2。

更新

看来我的问题是由我使用来自dart:htmlHttpRequest.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 错误。

【问题讨论】:

  • 您可以尝试pub build --mode=debug 禁用摇树和缩小。用于将 dart 脚本添加到 index.html 的脚本标签看起来如何?可能是一些时间问题。
  • 我会给--mode=debug 一个机会,让你知道我得到了什么。我正在使用这些脚本标签:&lt;script async src="main.dart" type="application/dart"&gt;&lt;/script&gt;&lt;script async src="packages/browser/dart.js"&gt;&lt;/script&gt;
  • 你能把项目发布到 GitHub 仓库吗?
  • 据我所知,只是 HttpRequest.request() 函数导致了问题。我要把它改成new HttpRequest()..open(...) 看看是否有帮助。如果没有,我会尝试将 github 存储库放在一起。
  • 如果只是这个调用,你可以试试看能否重现dartpad.dartlang.org中的错误

标签: dart dart2js


【解决方案1】:

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();

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

【讨论】:

  • 您可以编辑现有答案而不是创建新答案。
  • 谢谢。这个现在正在工作,但我下次会记住这一点:)
【解决方案2】:

看来我已经通过更改 HttpRequest 类的用法解决了这个问题。

发件人:

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$0()
  dart<._microtaskLoop()
  dart<._startMicrotaskLoop<()
  dart<._AsyncRun__initializeScheduleImmediate_internalCallback.call$1<()
  dart<.invokeClosure_closure0.call$0()
  dart<._IsolateContext.eval$1()
  dart<._callInIsolate()
  dart<.invokeClosure<()
  dart<.convertDartClosureToJS/$function</<()

我的猜测是 dart2js 在使用 async await“隐式”闭包时遇到了一些问题,并且当我使用“显式这里是一个关闭其环境的函数”闭包时会更开心。

感谢 Günter Zöchbauer 的帮助。

【讨论】:

    【解决方案3】:

    【讨论】:

    • 为什么? dart 的内置功能有什么作用?
    猜你喜欢
    • 2011-11-07
    • 1970-01-01
    • 2017-05-28
    • 2013-12-23
    • 2011-08-14
    • 2016-03-30
    • 2018-09-26
    • 1970-01-01
    • 2015-08-23
    相关资源
    最近更新 更多