Метод, требуемый интерфейсом, не удовлетворен методом расширения - PullRequest
0 голосов
/ 10 января 2020

Для образовательного приложения, которое я создаю, у меня есть интерфейс модуля, который требует метод copyWith:

abstract class Module {
  // ...
  Module copyWith() => throw 'You should call the instance\'s copyWith.';
}

Проблема в том, что я использую пакет codegen, который генерирует метод copyWith для расширения для подклассов модуля:

part 'audio_module.g.dart';

@immutable
@CopyWith()
class AudioModule implements Module {
  /* ... */
}
// GENERATED CODE - DO NOT MODIFY BY HAND

part of audio_module;

// **************************************************************************
// CopyWithGenerator
// **************************************************************************

extension AudioModuleCopyWithExtension on AudioModule {
  AudioModule copyWith(/* ... */) {
    return AudioModule(/* ... */);
  }
}

В моем классе AudioModule, таким образом, я получаю эту ошибку, потому что я думаю, что он не учитывает метод расширения:

Missing concrete implementation of 'Module.copyWith'.
Try implementing the missing method, or make the class abstract.

Почему это происходит, если подкласс (так или иначе) реализует copyWith?

Спасибо

Редактировать

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

1 Ответ

0 голосов
/ 10 января 2020

С помощью метода расширения ваш класс AudioModule не реализует / не переопределяет метод abstracte в Module. Методы расширения работают как методы stati c под капотом, поэтому на самом деле не добавляют copyWith() к AudioModule.

. Просто взгляните на Dart docs или google для методов расширения Dart и разрешения конфликтов. .

...