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

Flutter迁移Riverpod 2.0 Notifier Provider时字段访问错误求助

修复Riverpod 2.0 Notifier中fromFirestore构造器的错误

问题根源

你把fromFirestore方法错误定义在了UsersNotifier类里,但该方法本质是用来创建Users实例的构造逻辑,且UsersNotifier本身并没有cellPhone、address1这些字段——这些字段都属于Users类,所以初始化列表会提示字段不存在的错误。同时你调用代码里用的是Users.fromFirestore,说明这个方法应该属于Users类。

解决方案

1. 将fromFirestore改为Users类的工厂构造函数

把构造逻辑移到Users类内部,用工厂构造函数实现从Firestore数据创建Users实例:

class Users {
  String? userId;
  String? fName;
  String? lName;
  String? address1;
  String? address2;
  String? city;
  String? state;
  String? zipCode;
  String? cellPhone;
  String? officePhone;
  String? email;
  String? companyId;
  String? companyName;
  String? mlsId;
  String? mls;

  Users({
    this.userId,
    this.fName,
    this.lName,
    this.address1,
    this.address2,
    this.city,
    this.state,
    this.zipCode,
    this.cellPhone,
    this.officePhone,
    this.email,
    this.companyId,
    this.companyName,
    this.mlsId,
    this.mls,
  });

  // 新增工厂构造函数,实现从Firestore数据生成Users实例
  factory Users.fromFirestore(Map<String, dynamic> firestore) {
    return Users(
      userId: firestore['userId'],
      fName: firestore['fName'],
      lName: firestore['lName'],
      address1: firestore['address1'],
      address2: firestore['address2'],
      city: firestore['city'],
      state: firestore['state'],
      zipCode: firestore['zipCode'],
      cellPhone: firestore['cellPhone'],
      officePhone: firestore['officePhone'],
      email: firestore['email'],
      companyId: firestore['companyId'],
      companyName: firestore['company'], // 匹配原代码中的company字段映射到Users的companyName
      mlsId: firestore['mlsId'],
      mls: firestore['mls'],
    );
  }

  Users copyWith({
    String? userId,
    String? fName,
    String? lName,
    String? address1,
    String? address2,
    String? city,
    String? state,
    String? zipCode,
    String? cellPhone,
    String? officePhone,
    String? email,
    String? companyId,
    String? companyName,
    String? mlsId,
    String? mls,
  }) {
    return Users(
      userId: userId ?? this.userId,
      fName: fName ?? this.fName,
      lName: lName ?? this.lName,
      address1: address1 ?? this.address1,
      address2: address2 ?? this.address2,
      city: city ?? this.city,
      state: state ?? this.state,
      zipCode: zipCode ?? this.zipCode,
      cellPhone: cellPhone ?? this.cellPhone,
      officePhone: officePhone ?? this.officePhone,
      email: email ?? this.email,
      companyId: companyId ?? this.companyId,
      companyName: companyName ?? this.companyName,
      mlsId: mlsId ?? this.mlsId,
      mls: mls ?? this.mls,
    );
  }
}

2. 删除UsersNotifier中的错误方法

移除UsersNotifier里的fromFirestore方法,因为该方法不属于状态管理类的职责:

class UsersNotifier extends Notifier<Users> {
  final firestoreService = FirestoreService();
  final companyRef = FirebaseFirestore.instance.collection('Company');
  final userDB = FirebaseFirestore.instance.collection('users');

  @override
  Users build() {
    return Users(  // 返回初始状态
      userId: '',
      fName: '',
      lName: '',
      address1: '',
      address2: '',
      city: '',
      state: '',
      zipCode: '',
      cellPhone: '',
      officePhone: '',
      email: '',
      companyId: '',
      companyName: '',
      mlsId: '',
      mls: '',
    );
  }

  // 移除原来的fromFirestore方法
}

额外修正点

  • 原代码中zipcode拼写错误,改为zipCode匹配Users类的字段名
  • 原代码中的company字段对应Users类的companyName,在工厂构造中做了正确映射

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:50:10