Dart类赋值报错:Undefined Class与Expected a Class Member
问题分析与修复方案
嘿,我来帮你搞定这个问题!你遇到的两个错误其实都是Dart类的语法规则导致的,咱们一步步拆解:
错误原因
Undefined Class 'root.name':在AppLogic类的顶层(没有包裹在任何方法或构造函数里)直接写root.name = 'root'时,Dart编译器会把root误认为是一个类名,而不是你之前声明的Item实例,自然找不到对应的类,就抛出了这个错误。Expected a Class Member:类的主体部分只能定义成员变量、方法、构造函数这类“类成员”,不能直接放置执行语句(比如赋值操作),这条赋值语句不符合语法规范,所以编译器提示你这里应该是一个合法的类成员。
修复方案
你可以通过两种方式解决这个问题,同时还要注意修复allItems未初始化的潜在问题(不然调用add时会触发空指针异常):
方式一:使用级联操作符初始化变量
在声明root的时候直接通过级联操作符设置name属性,同时初始化allItems:
import 'package:uuid/uuid.dart'; class AppLogic { // 用级联操作符直接初始化root的name属性 Item root = Item()..name = 'root'; // 初始化allItems为空列表 List<Item> allItems = []; void createNewItem(Item parent){ allItems.add(Item()); } } class Item { DateTime created = DateTime.now(); String name; String ID = Uuid().v1(); Item parentID; List<String> childrenIDs = []; // 这里也建议初始化,避免后续操作空指针 Item.fromID(this.ID); Item.fromName(this.name); Item(); }
方式二:在构造函数中完成初始化
把root的赋值逻辑放到AppLogic的构造函数里,这样更适合复杂的初始化场景:
import 'package:uuid/uuid.dart'; class AppLogic { Item root; List<Item> allItems; // 构造函数中完成初始化 AppLogic() { root = Item(); root.name = 'root'; allItems = []; } void createNewItem(Item parent){ allItems.add(Item()); } } class Item { DateTime created = DateTime.now(); String name; String ID = Uuid().v1(); Item parentID; List<String> childrenIDs = []; Item.fromID(this.ID); Item.fromName(this.name); Item(); }
额外提示
我还顺手给Item类的childrenIDs也做了初始化,这样后续你操作这个列表时也不会遇到空指针问题,算是一个小优化~
内容的提问来源于stack exchange,提问作者MikeCoverUps
相关产品推荐
相关产品推荐

