You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart中对象先非空后空引发Null检查运算符错误排查

问题原因与解决办法:Null检查运算符报错

核心问题:变量作用域冲突

你代码里的ReadWrite类虽然定义了成员变量img.Image? maptrack;,但在getmap()方法中,你声明了一个同名的局部变量:

img.Image? maptrack = await img.decodePngFile(thepath);

这个局部变量会覆盖类成员变量的作用域——也就是说,你在getmap()里操作的是这个局部创建的maptrack,而非类本身的成员变量。所以#5 maptrack NOT NULL打印的是局部变量的状态,类的成员变量自始至终都是null,回到readwrite()方法调用saveimage时,自然会触发_CastError空检查错误。

修复方案

去掉getmap()里的局部变量声明,直接给类成员变量赋值:

Future<bool> getmap(Time t, String mapid) async {
    t.timestamp("#3 start getmap() ");
    Directory appDir = await path_provider.getApplicationDocumentsDirectory();
    String thepath = path.join(appDir.path, mapid);
    // 直接赋值给类成员变量,不再声明局部变量
    maptrack = await img.decodePngFile(thepath);
    t.timestamp("#4 getmap done. loaded maptrack ");
    maptrack != null
        ? print("#5 maptrack NOT NULL")
        : print('#5 maptrack IS NULL');
    await saveimage(t, 'maptrack.png', maptrack!);
    return true;
}

修改后,getmap()里操作的就是类的成员变量maptrack,回到readwrite()方法时,maptrack会保留加载后的图片对象,后续调用saveimage就不会再报错。

内容的提问来源于stack exchange,提问作者Peter Thompson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 01:47:09