Flutter报错:无法在字段初始化器中访问'this'读取属性
解决Dart报错:Error: Can't access 'this' in a field initializer to read
这个报错的核心原因是:Dart中类的字段初始化器会在构造函数执行前运行,此时类的实例还未完全初始化,无法访问this指向的实例成员(比如你的currPatient、titleStyle)。你直接在info列表的初始化代码里调用了currPatient.getName()和titleStyle,这就触发了这个语言限制。
解决方案:
有两种常用的修复方式,任选其一即可:
1. 将info改为Getter方法
把info从直接初始化的字段改成getter,这样每次访问info时才会构建列表,此时实例已经初始化完成,就可以正常访问实例成员了:
class PatientDetails extends StatelessWidget { final Patient currPatient; PatientDetails({Key? key, required this.currPatient}) : super(key: key); final TextStyle titleStyle = const TextStyle( fontSize: 15, color: Color(0xFF1F1F1F), fontWeight: FontWeight.w600, ); final TextStyle infoStyle = const TextStyle( fontSize: 15, color: Color(0xFF222222), fontWeight: FontWeight.w600, ); // 改为Getter方法 List<Widget> get info => [ Opacity( opacity: 0.6, // 注意:Opacity的opacity取值是0-1之间的小数,原代码的60会导致显示异常,这里修正 child: Text("Name", style: titleStyle), ), Opacity( opacity: 0.9, // 同样修正为0-1范围 child: Text(currPatient.getName(), style: infoStyle), ), ]; @override Widget build(BuildContext context) { return SafeArea( child: Scaffold( body: SingleChildScrollView( child: Column( children: [ InfoContainer(list: info, title: "Info") ], ), ), ), ); } }
2. 在build方法内构建info列表
既然build方法是在实例初始化后执行的,你可以直接把info的构建逻辑移到build方法内部:
class PatientDetails extends StatelessWidget { final Patient currPatient; PatientDetails({Key? key, required this.currPatient}) : super(key: key); final TextStyle titleStyle = const TextStyle( fontSize: 15, color: Color(0xFF1F1F1F), fontWeight: FontWeight.w600, ); final TextStyle infoStyle = const TextStyle( fontSize: 15, color: Color(0xFF222222), fontWeight: FontWeight.w600, ); @override Widget build(BuildContext context) { // 在build内构建info列表 final info = [ Opacity( opacity: 0.6, child: Text("Name", style: titleStyle), ), Opacity( opacity: 0.9, child: Text(currPatient.getName(), style: infoStyle), ), ]; return SafeArea( child: Scaffold( body: SingleChildScrollView( child: Column( children: [ InfoContainer(list: info, title: "Info") ], ), ), ), ); } }
额外提示:
原代码中Opacity的opacity参数写了60和90,这是错误的——这个参数要求是0到1之间的小数(0完全透明,1完全不透明),原数值会导致组件显示异常,已经在示例代码中修正。
内容的提问来源于stack exchange,提问作者Ahmed Sobhy
相关产品推荐
相关产品推荐

