运行测试时出现错误"Not found: 'dart:js' export 'dart:js' show allowInterop, allowInteropCaptureThis"。

3
在我的Flutter应用程序中,我有一个名为web.dart的文件,其中包含webSaveAs函数,该函数将文件保存到Web上的本地机器。
@JS()
library main;

import 'package:js/js.dart';
import 'package:universal_html/html.dart';

/// Annotate `webSaveAs` to invoke JavaScript `window.webSaveAs`
@JS('webSaveAs')
external void webSaveAs(Blob blob, String fileName);

然而,当我运行任何测试(使用flutter test命令)导入部件时,我使用了webSaveAs函数,在这种情况下我会得到以下错误:

./../../../development/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3-nullsafety.3/lib/js.dart:8:1: Error: Not found: 'dart:js'
export 'dart:js' show allowInterop, allowInteropCaptureThis;
^

我正在使用来自https://pub.dev/packages/jsjs: ^0.6.2,以下是flutter doctor命令的结果。
╰>>> flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel beta, 1.25.0-8.3.pre, on macOS 11.2.1 20D74 darwin-x64, locale en-SG)
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
[✓] Xcode - develop for iOS and macOS
[✓] Chrome - develop for the web
[✓] Android Studio (version 3.5)
[✓] IntelliJ IDEA Ultimate Edition (version 2019.3.1)
[✓] VS Code (version 1.53.2)
[✓] Connected device (1 available)

• No issues found!

能否有人帮我弄清楚这个问题?先感谢你!

1个回答

10

问题:

当你执行 flutter test 命令时,Flutter会将测试文件中的代码编译成本地Dart,并在其中运行,而其中没有Javascript支持,因此它不包含 dart:js


解决方案:

你可以创建一个虚拟文件(比如 web.test.dart),像下面这样模拟使用 package:jsdart:js 包方法的函数。

web.test.dart

import 'package:universal_html/html.dart';

void webSaveAs(Blob blob, String fileName) {
  // You can remove the below line below and include your own implementation if you need
  throw UnimplementedError();
}

接着创建一个新文件(假设命名为shared.dart),如下所示:

shared.dart

export 'web.dart' if (dart.library.io) 'web.test.dart';

当你需要使用webSaveAs函数时,应该导入shared.dart而不是web.dart文件。

解释:

dart.library.io在Dart VM中可用,dart.library.js在Web中可用。

在Web中,if (dart.library.io)的值为false。因此,它将导入web.dart,这正是我们想要的。

运行测试时,if (dart.library.io)的值为true,因为测试在Dart VM中运行。因此,它将导入web.test.dart,由于它没有导入package:jsdart:js,因此不会引发任何错误。


参考资料:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接