运行测试时出现“未找到:'dart:js'导出'dart:js'显示allowInterop,allowInteropCaptureThis”错误

Era*_*han 3 dart flutter flutter-test flutter-web

在我的 Flutter 应用程序中,我有一个名为 的文件web.dart,其中有一个webSaveAs函数可以将文件保存到 web 中的本地计算机上。

\n
@JS()\nlibrary main;\n\nimport \'package:js/js.dart\';\nimport \'package:universal_html/html.dart\';\n\n/// Annotate `webSaveAs` to invoke JavaScript `window.webSaveAs`\n@JS(\'webSaveAs\')\nexternal void webSaveAs(Blob blob, String fileName);\n
Run Code Online (Sandbox Code Playgroud)\n

但是,当我运行任何导入flutter test我使用过webSaveAs功能的小部件的测试(使用命令)时,出现以下错误:

\n
./../../../development/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3-nullsafety.3/lib/js.dart:8:1: Error: Not found: \'dart:js\'\nexport \'dart:js\' show allowInterop, allowInteropCaptureThis;\n^\n
Run Code Online (Sandbox Code Playgroud)\n

我正在使用js: ^0.6.2https://pub.dev/packages/js 这是命令的结果flutter doctor

\n
\xe2\x95\xb0>>> flutter doctor\nDoctor summary (to see all details, run flutter doctor -v):\n[\xe2\x9c\x93] Flutter (Channel beta, 1.25.0-8.3.pre, on macOS 11.2.1 20D74 darwin-x64, locale en-SG)\n[\xe2\x9c\x93] Android toolchain - develop for Android devices (Android SDK version 29.0.3)\n[\xe2\x9c\x93] Xcode - develop for iOS and macOS\n[\xe2\x9c\x93] Chrome - develop for the web\n[\xe2\x9c\x93] Android Studio (version 3.5)\n[\xe2\x9c\x93] IntelliJ IDEA Ultimate Edition (version 2019.3.1)\n[\xe2\x9c\x93] VS Code (version 1.53.2)\n[\xe2\x9c\x93] Connected device (1 available)\n\n\xe2\x80\xa2 No issues found!\n
Run Code Online (Sandbox Code Playgroud)\n

有人可以帮我解决这个问题吗?提前致谢!

\n

Era*_*han 10

问题:

当您执行flutter test命令时,Flutter 会将测试文件中的代码编译为原生 Dart,并在不支持 Javascript 的 Dart VM 中运行。因此,它不会包含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();
}
Run Code Online (Sandbox Code Playgroud)

然后创建一个新文件(比方说shared.dart),如下所示。

shared.dart

export 'web.dart' if (dart.library.io) 'web.test.dart';
Run Code Online (Sandbox Code Playgroud)

当你需要使用webSaveAs函数时,web.dart你应该导入shared.dart.


解释:

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

在网络中,if (dart.library.io)false. 因此,它将导入web.dart我们想要的内容。

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


参考: