Flutter中修改final对象属性未报错的原因咨询
为什么final修饰的对象能修改内部属性?
首先明确Dart里final的核心规则:final修饰的变量是「引用不可变」,不是「对象本身不可变」。
具体来说:
- 当你用
final声明widget.userModel时,只是规定了这个变量不能再指向另一个UserModel实例——比如你不能写widget.userModel = UserModel(...),这会直接报错。 - 但如果
UserModel类里的fullname、profilepic这些属性本身没有被final修饰,那你完全可以修改这个已有实例的内部属性值,这和widget.userModel是final的规则不冲突。
回到你的代码:
你修改的是widget.userModel这个实例的fullname和profilepic属性,并没有把widget.userModel换成另一个新的UserModel对象,所以完全符合Dart的final语法规则,代码自然能正常运行。
举个更直白的例子:
class Person { String name; Person({required this.name}); } final Person p = Person(name: "张三"); p.name = "李四"; // 合法,只是修改对象内部属性 p = Person(name: "王五"); // 非法,试图改变final变量的引用指向
如果想让UserModel的属性也不能被修改,那需要把UserModel里的fullname、profilepic也声明为final,同时提供构造方法初始化,这样后续就无法修改这些属性了。
内容的提问来源于stack exchange,提问作者Irfan Ganatra
相关产品推荐
相关产品推荐

