Dart定义setter调用时提示setAnimal方法未定义报错
Dart定义setter后提示方法未定义的问题解决
问题原因
你的setter语法本身没有错误,报错的核心原因是setter的调用方式不符合Dart语法规则:
- 用
set关键字声明的是类的setter属性,不是普通实例方法,不能通过方法名(参数)的形式调用 - Dart中setter必须通过赋值运算符
=触发,你写的ac1.setAnimal(a1)会被编译器识别为「调用AnimalCage类下名为setAnimal的普通实例方法」,但你根本没定义这个方法,自然会抛出找不到方法的错误。
修正方式
把调用setter的代码从方法调用形式改成赋值形式即可:
void main(){ Animal a1 = Animal(); Cat c1 = Cat(); AnimalCage ac1 = AnimalCage(); // 原错误写法:ac1.setAnimal(a1); // 正确setter调用写法 ac1.setAnimal = a1; // 运行后会正常打印'animals setter' } class AnimalCage{ Animal? _animal; set setAnimal(Animal animal){ print('animals setter'); _animal = animal; } } class Animal { } class Cat extends Animal{} // 补全原代码缺失的Cat类定义,避免其他无关报错
额外编码规范提示
Dart生态中不建议给setter加set前缀,setter本身就是赋值语义,直接用属性名命名更符合使用习惯,通常会和同名getter配对使用:
class AnimalCage{ Animal? _animal; // 规范命名的setter set animal(Animal animal){ print('animals setter'); _animal = animal; } // 配对的getter Animal? get animal => _animal; } // 调用时更符合直觉 ac1.animal = a1; // 赋值触发setter var cagedAnimal = ac1.animal; // 取值触发getter
你提到的「把setAnimal改成普通实例方法后报错消失」的现象也很好解释:普通实例方法本身就是通过方法名(参数)的形式调用,和你写的调用语法完全匹配,编译器自然能找到对应的成员。
内容的提问来源于stack exchange,提问作者森口万太郎
相关产品推荐
相关产品推荐

