flutter) 类型“List<dynamic>”不是类型“List<String>”的子类型

Kev*_*ang 6 firebase flutter google-cloud-firestore

我想在使用 firebase 电子邮件身份验证完成注册后获取用户模型。但是,当我尝试从 firestore 获取用户模型时,会打印以下错误:

type 'List<dynamic>' is not a subtype of type 'List<String>'
Run Code Online (Sandbox Code Playgroud)

我的用户模型如下

class UserModel {
  late String userKey;
  late String nickname;
  late String email;
  late List<String> listItem; // error!!
  late GeoFirePoint geoFirePoint; 
  late bool isPostOn; 
  late bool isLogin;
  late DateTime createdDate;

  DocumentReference? reference; 

  UserModel({
   ....
  });

  UserModel.fromJson(Map<String, dynamic> json, this.userKey) // this.reference
      : nickname = json[DOC_NICKNAME],
        ....
        createdDate = json[DOC_CREATEDDATE] == null
            ? DateTime.now().toUtc()
            : (json[DOC_CREATEDDATE] as Timestamp).toDate();

  UserModel.fromSnapshot(DocumentSnapshot<Map<String, dynamic>> snapshot)
      : this.fromJson(snapshot.data()!, snapshot.id);

  Map<String, dynamic> toJson() {
    var map = <String, dynamic>{};
    map[DOC_NICKNAME] = nickname;
    ....
    return map;
  }
}
Run Code Online (Sandbox Code Playgroud)

这是从 Firestore 获取用户模型。// 用户服务类

  Future<UserModel> getUserModel(String userKey) async {
    DocumentReference<Map<String, dynamic>> documentReference =
        FirebaseFirestore.instance.collection(COL_USERS).doc(userKey);

    final DocumentSnapshot<Map<String, dynamic>> documentSnapshot =
        await documentReference.get();

    UserModel userModel = UserModel.fromSnapshot(documentSnapshot);
    return userModel;
  }
Run Code Online (Sandbox Code Playgroud)

// 用户提供者

  Future _setNewUser(User? user) async {
    if (user != null && user.email != null) {
      ....
      // ! Error
      // test 1
      // List<String> subjectList = prefs.getStringList(SHARED_SUBJECTS) ?? [];

      // test 2
      List<String> listItem =
          prefs.getStringList(SHARED_ITEM)?.cast<String>() ??
              [].cast<String>();
   
      String email = user.email!;
      String userKey = user.uid;

      UserModel userModel = UserModel(
        userKey: "",
        listItem: listItem, // error
        ....
      );

      // create model and firestore upload
      await UserService().createNewUser(userModel.toJson(), userKey);

      // get user model, error!!
      try {
        _userModel = await UserService().getUserModel(userKey);
      } catch (e) {
        logger.w("get model error: $e");
      }
     }
    }
Run Code Online (Sandbox Code Playgroud)

我应该如何处理列表数据来解决此问题?谢谢你!

小智 10

您必须转换列表:

listItem = List<String>.from(data['listItem'])
Run Code Online (Sandbox Code Playgroud)