Как лучше всего извлечь повторяющийся код из StatefulWidget (используя наследование)?

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

Итак, прежде всего, я попытаюсь объяснить иерархию, которую хочу достичь:

QuizType
WordQuizType            (<-- most likely a mixin)
SentenceQuizType        (<-- most likely a mixin)

^ это будут либо абстрактные классы, либо миксины

Я хочу, чтобы ВСЕ соответствующие виджеты имели все свойства и методы, определенные в QuizType.

Некоторые из виджетов будут дополнительно унаследованы от WordQuizType
, а некоторые виджеты будут дополнительно унаследованы от SentenceQuizType.
(некоторые будут наследовать ни от одного, только от QuizType)

Мои пользовательские виджеты не смогут одновременно расширять 2 класса (StatefulWidget и Quiztype).
Я предполагаю, что я также должен сделать QuizType миксин и реализовать свой код аналогично этому: Flutter: унаследовать от абстрактного виджета без состояния.

В приведенном выше примере используется StatelessWidget, но я использую StatefulWidget, поэтому я не уверен, где добавить наследование, к StatefulWidget или State<...>?

class WordWidget1 extends StatefulWidget {
  QuizModel quiz;
  WordWidget1(this.quiz);

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

class _WordWidget1State extends State<WordWidget1> {
  //these should be available in ALL my widgets
  QuestionModel question;
  Map<String, dynamic> questionData;

  //these should be available only for certain Widgets
  String forWordsOnly;

  @override
  Widget build(BuildContext context) => Container();
}

class SentenceWidget1 extends StatefulWidget {
  QuizModel quiz;
  SentenceWidget1(this.quiz);

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

class _SentenceWidget1State extends State<SentenceWidget1> {
  //these should be available in ALL my widgets
  QuestionModel question;
  Map<String, dynamic> questionData;

  //these should be available only for certain Widgets
  String forSentencessOnly;

  @override
  Widget build(BuildContext context) => Container();
}

person Cedric    schedule 24.01.2021    source источник
comment
nvm Я использовал миксины (в классах State), и до сих пор все, кажется, работает хорошо   -  person Cedric    schedule 24.01.2021