“未找到:'dart:js' export 'dart:js' show allowInterop, allowInteropCaptureThis”运行测试时出错

Posted

技术标签:

【中文标题】“未找到:\'dart:js\' export \'dart:js\' show allowInterop, allowInteropCaptureThis”运行测试时出错【英文标题】:"Not found: 'dart:js' export 'dart:js' show allowInterop, allowInteropCaptureThis" error when running tests“未找到:'dart:js' export 'dart:js' show allowInterop, allowInteropCaptureThis”运行测试时出错 【发布时间】:2021-05-27 21:36:53 【问题描述】:

在我的 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/js 的js: ^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】:

问题:

当您执行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();

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

shared.dart

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

当需要使用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


参考资料:

https://github.com/dart-lang/sdk/issues/36557 https://medium.com/@dvargahali/dart-2-conditional-imports-update-16147a776aa8

【讨论】:

以上是关于“未找到:'dart:js' export 'dart:js' show allowInterop, allowInteropCaptureThis”运行测试时出错的主要内容,如果未能解决你的问题,请参考以下文章