что дочерний класс Equatable передает супер (Equatable класс)? - PullRequest
0 голосов
/ 27 сентября 2019

привет, я новичок с блоком во флаттере, и я пытаюсь понять таймер блока В документе flutter_bloc и я бы знал, что означает этот класс конструктора


@immutable
abstract class TimerState extends Equatable {
  final int duration;

//and this list props ??
  TimerState(this.duration, [List props = const []])
      : super([duration]..addAll(props));
}

Ответы [ 2 ]

0 голосов
/ 28 сентября 2019

Когда твой отец дарит тебе и твоему брату 2 подарка, и оба подарка - это ноутбуки, но они не относятся к разным типам ноутбуков, ты хочешь знать, равны они или нет!Таким образом, вы сравните все аспекты, которые важны для вас RAM, SSD, CPU.

на бумаге: myLaptop: 16G/256G/i5 | myBrotherLaptop: 8G/512G/i5

Предполагая, что ваш мозг использует язык дартс, ивы рассматривали каждый подарок как объект этого класса:

class LaptopGiftClass {
  int ram;
  int ssd;
  String cpu;

 // Default constructor
 LaptopGiftClass(this.ram, this.ssd, this.cpu);
}

, чтобы сравнить Equailty обоих подарков, созданных с использованием вышеуказанного класса, Dart и другие объектно-ориентированные языки, например Java, C #, ожидают, что вы создадите их.(переопределить) эти функции, чтобы эти языки понимали объекты и могли сравнивать любые два объекта одного и того же класса:

@override
bool operator ==(Object myBrotherLaptop) =>
    identical(myLaptop, myBrotherLaptop) ||
    myBrotherLaptop is LaptopGiftClass &&
    runtimeType == myBrotherLaptop.runtimeType &&
    name == myBrotherLaptop.name;

@override
int get hashCode => name.hashCode;

если эти строки вас пугают, никто вас не винит, поэтому приятнолюди создали равноправный пакет для нас!

равноправный пакет говорит вам «оставьте мне эту страшную работу» Но как передать страшный код на равноправный пакет ??!Сделав две вещи:

  1. Сделайте ваш класс расширяемым: dart class LaptopGiftClass extends Equatable {...}
  2. Передайте все свойства, с которыми вы хотите сравнить внутри массива, в Equatable (супер / родительский класс) с первого момента, поэтому внутри конструктора:
LaptopGiftClass(this.ram, this.ssd, this.cpu) : super([RAM, SSD, CPU]);

Ваш последний класс:

class LaptopGiftClass extends Equatable {
  int ram;
  int ssd;
  String cpu;

 // Default constructor
 LaptopGiftClass(this.ram, this.ssd, this.cpu) : super([RAM, SSD, CPU]);

}

И ВЫ СДЕЛАНЫ!Теперь вы можете проверить равенство двух даров, просто создайте объекты и сравните:

LaptopGiftClass myLaptop = LaptopGiftClass(16,256,'i5');
LaptopGiftClass myBrotherLaptop = LaptopGiftClass(8, 512,'i5');

И ПРОСТО ПЕРЕД НАЧАЛОМ СРАВНЕНИЯ, ваш брат увидел вас, и, поскольку он геймер, он хочет, чтобы вы добавили большесвойства в этом равенстве проверяются: GPU и Screen_Resolution !ваша мама услышала это и попросила вас добавить цену тоже!

Теперь у вас есть список новых реквизитов для сравнения: [GPU, Screen_Resolution, Price].

Итакпоскольку вы следовали принципу чистого кода, вы ожидали этого, и вы позволили конструктору получить больше свойств для сравнения с:

// This only mean combine both lists
[RAM, SSD, CPU]..addAll(myBrotherAndMotherProps) 

, поэтому ваш конечный класс:

class LaptopGiftClass extends Equatable {
  int ram;
  int ssd;
  String cpu;

 // Default constructor
 LaptopGiftClass(
    this.ram, 
    this.ssd, 
    this.cpu, 
    // List of list => because they think clean code 
    // and maybe in the future the will send other data, 
    // NOT only props..
    // one of the sent array is the extra prop that 
    // I need to compare 'myBrotherAndMotherProps', and 
    // as sometime brother and mother will not ask you 
    // to add props to compare, you give it a default value 
    // as empty "const []", why const here, just for better 
    // performance as you are so soooo Professional!!
    [ List myBrotherAndMotherProps = const [] ],
 ) : super([RAM, SSD, CPU]..addAll(myBrotherAndMotherProps));

 // WHY TO PASS FROM INSIDE THE CONSTRUCTOR? 
 // because Equatable needs them (required) 
 // and not at anytime but immediately in the 
 // constructor of itself, so we made this 
 // chaining(constructor pass to another constructor)..
}

Итакочевидно, что essintial свойствами являются [RAM, SSD, CPU], но также будет учитываться и все остальное, поскольку мы сделали реализацию чистой, гибкой и масштабируемой.

перед добавлением этого гибкого кода List<Object> get props => [RAM, SSD, CPU]..addAll(myBrotherAndMotherProps);Раньше это были EQUAL !!:

// Note first 3 are equal [RAM, SSD, CPU]:
LaptopGiftClass myLaptop = LaptopGiftClass(16,256,'i5', 'Nvidia', 1080, '1200$');
LaptopGiftClass myBrotherLaptop = LaptopGiftClass(16, 256,'i5', 'Intel HD', 720, '900$');

myLaptop == myBrotherLaptop; // True without ..addAll(myBrotherAndMotherProps);
myLaptop == myBrotherLaptop; // False with ..addAll(myBrotherAndMotherProps);

То же самое происходит с TimerState:

@immutable
abstract class TimerState extends Equatable {
  final int duration;

  TimerState(this.duration, [List props = const []])
      : super([duration]..addAll(props));
}

TimerState реализовано так же, как LaptopGiftClass выше (последняя реализация).Вы можете отправить props на него с помощью конструктора:

TimerState(this.duration, [List props = const []])
      : super([duration]..addAll(props));

, поэтому TimerState передаст список реквизитов своему родителю (super / Equatable / what extended) в этой строке следующим образом: : super([duration]..addAll(props));

и в этом примере таймера;duration - это базовая опора, как [RAM, SSD, CPU] для LaptopGiftClass.

, и иерархия будет такой:

// Inside class Paused extends TimerState {...}
Paused(int duration) : super(duration); // super is TimerState

// then Inside abstract class TimerState extends Equatable {..}
TimerState(this.duration, [List props = const []])
      : super([duration]..addAll(props)); // super is Equatable

// Then Equatable will get props and deal with it for you...
0 голосов
/ 27 сентября 2019

В этом руководстве используется equatable: ^0.2.0, в этой версии, когда вы хотите переопределить операторы hashcode и ==, вам нужно передать List свойств конструктору super.Проверьте документы .

. Имея это в виду, он создает необязательный параметр с именем props и передает суперконструктору List, который содержит duration и все элементы.параметра props.

abstract class TimerState extends Equatable {
  final int duration;

  TimerState(this.duration, [List props = const []])
      : super([duration]..addAll(props));
}

Таким образом, класс, расширяющий TimerState, может использовать необязательный параметр props для передачи других свойств, и эти свойства будут добавлены к Listкоторый передается конструктору super из TimerState для правильного использования Equatable.

Поэтому, если вам нужно состояние с другими свойствами, вам нужно сделать это:

class OtherTimerState extends TimerState {
  final int otherProperty1;
  final int otherProperty2;

  OtherTimerState(int duration, this.otherProperty1, this.otherProperty2)
      : super(duration, [otherProperty1, otherProperty2]);
}
...