Отсутствует конкретная реализация 'getter Equatable' / проблема с реквизитом - PullRequest
0 голосов
/ 16 марта 2020

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

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

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

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

Когда я генерирую свои файлы blo c и смотрю на исходный _event, который генерирует, это выглядит так:

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

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

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

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

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

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?

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

1 Ответ

0 голосов
/ 16 марта 2020

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

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

Equatable является абстрактным классом, и у него есть получатель List<Object> get props; .Concrete Class, расширяющий 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];
}
...