你可以使用镜子(反射)来解决这个问题。pub 包路径使用反射dart:io
在独立 VM 或dart:html
浏览器中访问。
源位于此处。好消息是,他们使用@MirrorsUsed
,因此镜像 api 只包含所需的类。在我看来,代码记录得很好,应该很容易为您的代码采用解决方案。
从 getter 开始_io
(_html
在第 72 行说明),它们表明您可以加载库,而无需它们在您的 VM 类型上可用。如果库不可用,加载只会返回 false。
/// If we're running in the server-side Dart VM, this will return a
/// [LibraryMirror] that gives access to the `dart:io` library.
///
/// If `dart:io` is not available, this returns null.
LibraryMirror get _io => currentMirrorSystem().libraries[Uri.parse('dart:io')];
// TODO(nweiz): when issue 6490 or 6943 are fixed, make this work under dart2js.
/// If we're running in Dartium, this will return a [LibraryMirror] that gives
/// access to the `dart:html` library.
///
/// If `dart:html` is not available, this returns null.
LibraryMirror get _html =>
currentMirrorSystem().libraries[Uri.parse('dart:html')];
稍后您可以使用镜像来调用方法或 getter。current
有关示例实现,请参见 getter (从第 86 行开始)。
/// Gets the path to the current working directory.
///
/// In the browser, this means the current URL. When using dart2js, this
/// currently returns `.` due to technical constraints. In the future, it will
/// return the current URL.
String get current {
if (_io != null) {
return _io.classes[#Directory].getField(#current).reflectee.path;
} else if (_html != null) {
return _html.getField(#window).reflectee.location.href;
} else {
return '.';
}
}
正如您在评论中看到的,目前这只适用于 Dart VM。问题6490解决后,它也应该在 Dart2Js 中工作。这可能意味着此解决方案目前不适用于您,但稍后会成为解决方案。
问题6943也可能有所帮助,但描述了另一种尚未实施的解决方案。