Я столкнулся с проблемой, когда я не могу получить доступ к методу виджета с состоянием.
У меня есть три класса Question, QuestionBuilder и Timer.
Мне нужно было выполнить метод в Класс QuestionBuilder, когда анимация в классе Timer завершается.
Класс root - это вопрос, в котором есть два дочерних объекта QuestionBuilder и Timer.
Вот класс вопросов:
class _QuestionState extends State<Question>{
....
return Scaffold( //build method
body: Column(
children: <Widget>[
Timer(),
SizedBox(height: 40),
Expanded(child: QuestionBuilder(questions: widget.questions)),
],
),
),
}
Здесь, в классе QuestionBuilder, у меня реализованы классы Timer и QuestionBuilder. У меня также есть кнопка в QuestionBuilder, чтобы явно выполнить метод, который работает отлично. В классе есть два списка для хранения выбранных опций и правильных опций, которые используются в методе CalculateMarksandNavigateToSummary () ниже.
Вот метод в классе QuestionBuilder:
class _QuestionBuilderState extends State<QuestionBuilder>{
.....
void calculateMarksandNavigateToSummary() {
int marks = 0;
for (int i = 0; i < correctOptions.length; i++) {
if (selectedOptions[i] == correctOptions[i]) { // check the correct options with selected options
marks += 1;
}
}
Navigator.pushReplacement(
context, MaterialPageRoute(builder: (context) => TestSummary(marks)));
}
FlatButton(
.....
onTap: () => calculateMarksandNavigateToSummary(), //This works perfectly
.....
)
}
Затем мой класс таймера, где я должен прослушивать состояние анимации, используя прослушиватель статуса, и выполнить метод CalculateMarksandNavigateToSummary () в классе QuestionBuilder.
Класс таймера:
class _TimerState extends State<Timer> with SingleTickerProviderStateMixin {
AnimationController _controller;
Animation animation;
@override
void initState() {
super.initState();
_controller =
AnimationController(vsync: this, duration: Duration(minutes: 7));
animation = Tween<double>(begin: 0.1, end: 1).animate(_controller);
_controller.forward(from: _controller.value);
_controller.addStatusListener((status) {
if (status == AnimationStatus.completed) {
// I have to call the calculateMarksandNavigateToSummary() method here
// I Tried QuestionBuilder().calculateMarksandNavigateToSummary(); but it returns no such method error
}
});
}