You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:23:23