Дарт - Как заставить функции инициализатора класса работать с конструкторами? - PullRequest
0 голосов
/ 16 июня 2020

Функции инициализатора игнорируются, если я создаю экземпляр через конструктор. Как заставить функции инициализатора работать и с конструкторами? Вот как я вызываю класс

User fireBaseUser = new User("12345","Test Name"); // shortenedName exists
var snap = {"uid" : "12345", "displayName" : "Test Name"};
User fireBaseUser = User.fromSnapshot(snap); // shortenedName wont exist

class User {
  final String uid;
  final String fireBaseDisplayName;
  String shortenedName;

  User.fromSnapshot( DocumentSnapshot document)
      : uid = snapshot.documentID,
        fireBaseDisplayName = snapshot['displayName'];

  User(
      {this.uid,
      this.fireBaseDisplayName,
      this.shortenedName,
     }) {
    shortenName(fireBaseDisplayName);
  }

  shortenName(fireBaseDisplayName) {
    shortenedName =
        fireBaseDisplayName.substring(0, fireBaseDisplayName.indexOf(' '));
  }

Конструктор, кажется, работает, только если я дублирую функцию инициализатора, как это

class User {
  final String uid;
  final String fireBaseDisplayName;
  String shortenedName;

  User.fromSnapshot( DocumentSnapshot document)
      : uid = snapshot.documentID,
        fireBaseDisplayName = snapshot['displayName'];
        shortenedName = snapshot['displayName'].substring(0, snapshot['displayName'].indexOf(' '));

  User(
      {this.uid,
      this.fireBaseDisplayName,
      this.shortenedName,
     }) {
    shortenName(fireBaseDisplayName);
  }

  shortenName(fireBaseDisplayName) {
    shortenedName =
        fireBaseDisplayName.substring(0, fireBaseDisplayName.indexOf(' '));
  }

Связанные Как инициализировать поля класса с помощью функция в дротике?

Ответы [ 2 ]

1 голос
/ 16 июня 2020

это generative constructor:

User(
      {this.uid,
      this.fireBaseDisplayName,
      this.shortenedName,
     }) {
    shortenName(fireBaseDisplayName);
  }

и это named constructor:

User.fromSnapshot( DocumentSnapshot document)
      : uid = snapshot.documentID,
        fireBaseDisplayName = snapshot['displayName'];

в инициализации объекта User fireBaseUser = User.fromSnapshot(snap); вы вызываете named constructor поэтому вы должны позвонить веселью shortenName(fireBaseDisplayName); внутри named constructor, которое вы вызываете, например:

User.fromSnapshot( DocumentSnapshot document)
      : uid = snapshot.documentID, // snapshot or document?    :)
        fireBaseDisplayName = snapshot['displayName'] {
          shortenName(fireBaseDisplayName);
      }
0 голосов
/ 16 июня 2020

Вы использовали «именованный параметр {}», поэтому вам следует использовать имя параметра.

1) существует сокращенное имя. Пользователь fireBaseUser = новый пользователь (uid: «12345», fireBaseDisplayName: «Имя теста», сокращенное имя: "TN");

2) сокращенное имя не существует. Пользователь fireBaseUser = новый пользователь (uid: «12345», fireBaseDisplayName: «Имя теста»);

class User {
  final String uid;
  final String fireBaseDisplayName;
  String shortenedName;

  User({
      this.uid, 
      this.fireBaseDisplayName,
      this.shortenedName,
       });
...