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

Dart报错:初始化器无法访问实例成员'id',如何用传入id初始化Firebase DocumentReference?

报错说明

The instance member 'id' can't be accessed in an initializer.
中文含义:无法在初始化器中访问实例成员 id

报错原因

Dart 类的实例初始化阶段,会先完成类字段的初始化赋值,再执行构造函数的逻辑。你在声明users字段时直接引用id,此时id还没有完成赋值,因此会触发语法报错。

解决方案

有两种常用的修复方式:

方式1:在构造函数初始化列表中赋值(更推荐)

将users的赋值逻辑放到构造函数的初始化列表中,初始化列表执行时id已经完成赋值,可以正常访问:

import 'package:cloud_firestore/cloud_firestore.dart';

class AddUser  {
  final String answer;
  final String id;
  final DocumentReference users;

  AddUser(this.answer, this.id) : 
    users = FirebaseFirestore.instance.collection('Questions').doc("ceb").collection("ceb").doc(id);
}

这种写法是编译时安全的,不会出现运行时空异常风险,适合不需要后续修改users值的场景。

方式2:用late修饰符延迟初始化

如果你的Dart版本在2.12及以上,也可以用late修饰users,告诉编译器这个字段会在使用前完成初始化:

import 'package:cloud_firestore/cloud_firestore.dart';

class AddUser  {
  final String answer;
  final String id;

  AddUser(this.answer,this.id);

  late final DocumentReference users = FirebaseFirestore.instance.collection('Questions').doc("ceb").collection("ceb").doc(id);
}

注意如果声明了late但实际使用前没有完成赋值,运行时会抛出异常。

内容的提问来源于stack exchange,提问作者Vinasirajan Vilakshan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:27:00