Возможно ли иметь как виджеты с сохранением состояния, так и виджеты без состояния в качестве подтипов другого класса?

#flutter #polymorphism

Вопрос:

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

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

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

Кому-нибудь из вас когда-нибудь приходилось делать нечто подобное? Вы разработали другой подход?

Для тех, кого интересует, зачем мне это нужно: Я хотел создать отдельный класс кнопок для своего приложения, который затем будет иметь различные реализации для определенных стилей кнопок (обычная кнопка, кнопка «в полоску», кнопка, которая «загружается», когда пользователь прокручивает страницу и становится активным, как только пользователь дойдет до конца страницы и т. Д.). Таким образом, я мог бы тогда просто вызвать «Button. implementation», где бы мне не требовалась конкретная кнопка, и иметь весь код, связанный с кнопками, В одном и том же месте.

Ваше здоровье.

 abstract class A {
  final int intellect;

  A(this.intellect);

  factory A.giveMeB(int intellect) {
    return _B(intellect);
  }

  factory A.giveMeC(int intellect) {
    return _C(intellect);
  }
}

class _B extends StatelessWidget implements A {
  @override
  final int intellect;

  _B(this.intellect);

  @override
  Widget build(BuildContext context) {
    return SizedBox.shrink();
  }
}

class _C extends StatefulWidget implements A {
  @override
  final int intellect;

  const _C(this.intellect, {Key key}) : super(key: key);

  @override
  _CState createState() => _CState();
}

class _CState extends State<_C> {
  @override
  Widget build(BuildContext context) {
    return Container();
  }
}