NoSuchMethodError возникает, когда я пытаюсь получить доступ к методу Stateful Widget из другого Stateful Widget - PullRequest
0 голосов
/ 29 апреля 2020

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

У меня есть три класса 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

      }
    });
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...