遇到Instance member 'items' can't be accessed using static access报错如何解决?
问题解决与原理说明
报错原因
你当前的写法属于用类名直接访问实例成员:代码中定义的items没有加static修饰,属于Dashboard类的实例成员,但你调用时用了Dashboard.items的静态访问方式,触发了Dart的语法校验报错。
快速修复方案
两种方案选其一即可,根据你的业务场景判断:
- 方案1:将
items改为静态成员(适合所有Dashboard实例共用同一份日期列表的场景)
在items的定义代码前添加static关键字:
原有调用代码无需修改。static final items = List<DateTime>.generate(60, (i) => DateTime.utc( DateTime.now().year, DateTime.now().month, DateTime.now().day, ).add(Duration(days: i) ) ); - 方案2:调用时先实例化
Dashboard类(适合不同Dashboard实例需要单独维护items的场景)
修改调用处代码,先创建实例再访问成员:items: Dashboard().items.map((i) { return Builder( (...)
底层运行原理
Dart中类的成员分为两类,访问规则完全不同:
- 静态成员:用
static关键字声明,属于类本身,仅在类首次加载时初始化一次,全局仅存一份副本,无需创建实例即可通过类名.成员名直接访问。 - 实例成员:无
static修饰,属于类的单个实例对象,每创建一个新的类实例就会单独生成一份副本,必须先实例化类得到对象后,才能通过对象访问,不允许直接用类名调用。
注意:如果选择方案1添加
static修饰,items中的DateTime.now()只会在类首次加载时计算一次,如果App长期后台运行跨天,生成的日期会是旧值,需要实时更新日期的场景不建议用静态声明。
内容的提问来源于stack exchange,提问作者gugapl
相关产品推荐
相关产品推荐

