7

下面的代码“看起来正确”,它编译,但不运行,失败并显示控制台消息:

无法加载 Dart 脚本 dart:io
加载资源失败

如果我注释掉#import('dart:io');, 我相信是错误的,我会收到一个编译错误,但它会启动,直到我按下按钮,我会收到运行时错误:

内部错误:'http://127.0.0.1:3030/home/david/dart/samples/htmlIO/htmlIO.dart':错误:第 13 行 pos 26:未加载类型 'HttpClient'
var connection = new HttpClient() .get('www.google.com', 80, '/');

......这是预期的。

所以我的问题是:如何在同一个类中导入 dart:html 和 dart:io?

#import('dart:html');
#import('dart:io');

class htmlIO {

  ButtonElement _aButton;

  htmlIO() {
  }

  void handlePress(Event e) {
    var connection = new HttpClient().get('www.google.com', 80, '/');
    write('made it');
  }

  void run() {
    _aButton = document.query("#aButton");
    _aButton.on.click.add(handlePress);
    write("Hello World!");
  }

  void write(String message) {
    // the HTML library defines a global "document" variable
    document.query('#status').innerHTML = message;
  }
}

void main() {
  new htmlIO().run();
}
4

2 回答 2

11

dart:html是客户端库,而是dart:io服务器端库。 dart:html使用浏览器的功能,但dart:io使用受浏览器安全限制的功能(如文件系统访问等)。

也许是时候到了,您可以dart:html在服务器上使用“模拟”浏览器,这可能对单元测试等有用,但您还不能这样做。

于 2012-04-15T19:51:19.327 回答
4

简短的回答,你不能。正如 Chris 所提到的,dart:io 库仅适用于服务器库。

我看到您正在尝试连接到 HTML 应用程序中的 HTTP 服务。您应该查看 HttpRequest 库。这是示例的链接: http: //c.dart-examples.com/api/dart-html/interface/eventtarget/httprequest/asynchronous

import 'dart:html';
import 'dart:convert';

void onSuccess(ProgressEvent event, HttpRequest request) {
  print(event.loaded); // 0
  print(request.statusText); // ok
  print(request.responseText); // "(resource text)"
}

/**
 * test.txt file must be of the same origin
 * Or the response header must contain "Access-Control-Allow-Origin: [*|origin]"
 */
void main() {
  String url = "test.txt";  
  HttpRequest request = new HttpRequest();
  request.open("GET", url, async : true);
  request.onLoadEnd.listen((ProgressEvent e) => onSuccess(e, request));
  request.send();
}

有一个统一来自 dart:html 的 HttpRequest 和来自 dart:io 的 HttpClient 的请求,参见http://code.google.com/p/dart/issues/detail?id=2677

于 2012-08-21T20:41:53.223 回答