为啥我在 Flutter 测试期间使用 rootBundle.load 得到“对空值使用空检查运算符”?

Posted

技术标签:

【中文标题】为啥我在 Flutter 测试期间使用 rootBundle.load 得到“对空值使用空检查运算符”?【英文标题】:Why am I getting "Null check operator used on a null value" from using rootBundle.load during a Flutter test?为什么我在 Flutter 测试期间使用 rootBundle.load 得到“对空值使用空检查运算符”? 【发布时间】:2021-12-17 08:12:57 【问题描述】:

我搜索了很长一段时间,并没有在 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

我执行的代码都没有使用空检查运算符 (!),那么这个错误来自哪里,我该如何解决?

【问题讨论】:

【参考方案1】:

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

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

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

不幸的是,这不是像我们通常从 Flutter 获得的漂亮的描述性错误消息,而是直接来自 Dart 的更神秘的错误描述。就我而言,根本原因是在测试中需要额外调用以确保 instance 被初始化。

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

【讨论】:

以上是关于为啥我在 Flutter 测试期间使用 rootBundle.load 得到“对空值使用空检查运算符”?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter `showModalBottomSheet` Ticker 在测试期间未处理

Flutter:测试期间的计时器问题

为啥我在为 Flutter 使用 codemagic 构建代码时出现“无法为 iOS 构建”?

为啥我在 Flutter 中使用 Firestore 中的 foreach 方法后得到空值?

Flutter 错误 - 在构建期间调用了 setState() 或 markNeedsBuild()

为啥我在 Xcode 中的 pod init 期间收到加载错误?