【问题标题】: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

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

【问题讨论】:

    标签: flutter dart flutter-test dart-null-safety


    【解决方案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();
      ...
    }
    

    【讨论】:

      猜你喜欢
      • 2021-08-11
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 2022-07-04
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2021-08-04
      相关资源
      最近更新 更多