Отсутствует конкретная реализация getter Equatable / проблема с реквизитом

Я прорабатываю многие учебники по блоку с флаттером и сталкиваюсь с некоторыми несоответствиями.

Я использую студию Android и создаю код блока с помощью плагина от Intellij v1.6.0.

Для bloc_event я продолжаю видеть такие примеры.

@immutable
abstract class FruitEvent extends Equatable {
  FruitEvent([List props = const []]) : super(props);
}

Когда я генерирую свои файлы блока и смотрю на исходный файл _event, который сгенерирован, он выглядит следующим образом.

@immutable
abstract class SongEvent extends Equatable {
  const SongEvent();
}

Если я изменю свой сгенерированный код, включив в него следующее ...

[List props = const []]) : super(props)

Затем я получаю следующую ошибку «Слишком много позиционных аргументов, 0 ожидалось, 1 найден», которая ссылается на реквизиты в конце строки, показанной выше.

Если я оставлю свой код в том виде, в каком он был сгенерирован плагином блока, а затем попытаюсь реализовать свои события, добавив следующие ...

class AddSong extends SongEvent {}

Затем я получаю сообщение об ошибке «Отсутствует конкретная реализация getter Equatable.props».

Вот мой текущий блок / song_event.dart

import 'package:equatable/equatable.dart';
import 'package:meta/meta.dart';

@immutable
abstract class SongEvent extends Equatable {
  const SongEvent();
}

class AddSong extends SongEvent {}

Вопрос. Следует ли использовать строку, в которой есть свойства, как показано в примере FuitEvent?

Я не понимаю, что мне здесь не хватает и почему отображается ошибка, когда я пытаюсь использовать тот же метод, который показан во многих учебных пособиях.


person bboursaw73    schedule 16.03.2020    source источник


Ответы (1)


Equatable переопределяет == и hashCode для вас, поэтому вам не нужно тратить время на написание большого количества шаблонного кода.

В основном это помогает при сравнении объектов на равенство.

Equatable - это абстрактный класс, у которого есть геттер List<Object> get props;. Конкретный класс, расширяющий Equatable, должен переопределить этот геттер.

import 'package:equatable/equatable.dart';
import 'package:meta/meta.dart';

@immutable
abstract class SongEvent extends Equatable {
  const SongEvent();
}

class AddSong extends SongEvent {}

В этом случае SongEvent является абстрактным классом, поэтому ему не нужно реализовывать геттер свойств, даже если он расширяет Equatable. Но AddSong - это конкретный класс, который расширяет SongEvent, который расширяет Equatable, поэтому AddSong должен реализовать геттер в Equatable.

import 'package:equatable/equatable.dart';
import 'package:meta/meta.dart';

@immutable
abstract class SongEvent extends Equatable {
  const SongEvent();
}

// Something like this
class AddSong extends SongEvent {
  final Song song;

  const AddSong(this.song);

  @override
  List<Object> get props => [song];
}
person Federick Jonathan    schedule 16.03.2020