为啥我在 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 使用 codemagic 构建代码时出现“无法为 iOS 构建”?
为啥我在 Flutter 中使用 Firestore 中的 foreach 方法后得到空值?