为什么我在 Flutter 测试期间使用 rootBundle.load 得到 "Null check operator used on a null value"?

Why am I getting "Null check operator used on a null value" from using rootBundle.load during a Flutter test?

我找了好久,在SO或其他网站上都没有找到解决这个问题的明确方法。

我有一个 Flutter 测试:

test('Create Repo and Read JSON', () {
  Repository repository = CreateRepository();
  ...
}

CreateRepository()最终调用了一个方法,代码如下:

var jsonString = await rootBundle.loadString(vendorDataFilePath);

这会导致错误:Null check operator used on a null value

None 我执行的代码使用了空检查运算符 (!) 那么这个错误是从哪里来的,我该如何修复它?

在调试模式下运行测试后,我发现错误实际上是在Flutter本身的asset_bundle.dart中,而不是来自我的代码。

final ByteData? asset =
    await ServicesBinding.instance!.defaultBinaryMessenger.send('flutter/assets', encoded.buffer.asByteData());

导致错误的是instance!,因为此时instance实际上为空,所以空检查运算符(!)失败。

不幸的是,这不是我们通常从 Flutter 获得的描述性很好的错误消息,而是直接来自 Dart 的更隐蔽的错误描述。在我的案例中,根本原因是测试中需要额外调用以确保 instance 得到初始化。

test('Create Repo and Read JSON', () {
  // Add the following line to the top of the test
  TestWidgetsFlutterBinding.ensureInitialized(); // <--
  Repository repository = CreateRepository();
  ...
}