Как следует из названия, у меня есть много 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();
}