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
相关产品推荐
相关产品推荐

