Flutter空安全下命名参数不能以下划线开头报错如何保留私有变量?
问题原因
Dart 语法不允许命名构造参数使用以下划线开头的私有命名,因为命名参数本身是设计给外部调用方显式指定参数使用的,和私有成员的库级访问控制逻辑冲突,所以会触发编译报错。
解决方案
方案1:参数与私有成员分离赋值(最推荐,保留命名参数调用习惯)
不需要修改私有成员的命名,仅调整构造函数的入参命名为公开无下划线格式,通过初始化列表将入参赋值给私有成员即可,私有成员的访问权限不会发生任何变化:
class ContactElement extends StatelessWidget { final IconData _icon; final String _heading; final String _describer; const ContactElement({ Key? key, required IconData icon, required String heading, required String describer, }) : _icon = icon, _heading = heading, _describer = describer, super(key: key); }
调用方式和之前完全一致,外部仍然无法直接访问_icon、_heading、_describer三个成员变量,符合开发规范要求。
方案2:改为位置参数(适合仅内部使用的组件)
如果该组件仅在当前库内部使用,不需要对外暴露命名参数调用方式,可以直接将私有成员作为位置参数传入,不受私有命名限制:
class ContactElement extends StatelessWidget { final IconData _icon; final String _heading; final String _describer; const ContactElement( this._icon, this._heading, this._describer, { Key? key, }) : super(key: key); }
调用时按参数顺序传值即可。
内容的提问来源于stack exchange,提问作者user3697484
相关产品推荐
相关产品推荐

