如何使用提交按钮逐步浏览问题列表

How do I step through the questions list using the submit button

我有这个 flutter 代码(用于测验),我希望提交按钮移动到下一个问题,但是使用 submitQuestion() 不会激活按钮,也不会包含动画

import 'dart:async';
import 'package:flutter/material.dart';
import 'dart:io';

var _counter = 0;
var bkgrdColor = Colors.blue[50];

bool isAnswerCorrect1 = (questions[_counter].answers[_ansCounter1] ==
    questions[_counter].correctAnswer);
bool isAnswerCorrect2 = (questions[_counter].answers[_ansCounter2] ==
    questions[_counter].correctAnswer);
bool isAnswerCorrect3 = (questions[_counter].answers[_ansCounter3] ==
    questions[_counter].correctAnswer);
bool isAnswerCorrect4 = (questions[_counter].answers[_ansCounter4] ==
    questions[_counter].correctAnswer);

final int _ansCounter1 = 0;
final int _ansCounter2 = 1;
final int _ansCounter3 = 2;
final int _ansCounter4 = 3;

final int ans1Value = 1;
final int ans2Value = 2;
final int ans3Value = 3;
final int ans4Value = 4;

var TIMEOUT = const Duration(seconds: 3);
var ms = const Duration(milliseconds: 1);

List<Question> questions = [
  new Question("What is 2+2", ["2", "3", "4", "5"], "4"),
  new Question("What is 1+1", ["2", "3", "4", "5"], "2"),
  new Question("What is 4+4", ["7", "8", "10", "16"], "8"),
  new Question("What is 5+5", ["10", "12", "25", "20"], "10"),
  new Question("What is 3+3", ["4", "5", "6", "7"], "6")
];

class Question {
  String question;
  List<String> answers;
  String correctAnswer;
  Question(this.question, this.answers, this.correctAnswer);
}

void main() {
  runApp(new _questionDisplay());
}

class _questionDisplay extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(home: new QuestDis());
  }
}

class QuestDis extends StatefulWidget {
  QuestDis({Key key}) : super(key: key);

  @override
  _QuestDisState createState() => new _QuestDisState();
}

class _QuestDisState extends State<QuestDis> with TickerProviderStateMixin {
  AnimationController _controller;
  int radioValue = 0;

  @override
  initState() {
    _controller = new AnimationController(
      vsync: this,
      duration: const Duration(milliseconds: 100),
    )..addStatusListener((AnimationStatus status) {
        if (status == AnimationStatus.completed) _controller.reverse();
      });
    super.initState();
  }

  void handleRadioValueChanged(int value) {
    if (radioValue != 0) _controller.forward();
    setState(() {
      radioValue = value;
      print("Radio value is: $radioValue");
      switch (radioValue) {
        case 1:
          bkgrdColor = isAnswerCorrect1 ? Colors.green[100] : Colors.red[100];
          break;
        case 2:
          bkgrdColor = isAnswerCorrect2 ? Colors.green[100] : Colors.red[100];
          break;
        case 3:
          bkgrdColor = isAnswerCorrect3 ? Colors.green[100] : Colors.red[100];
          break;
        case 4:
          bkgrdColor = isAnswerCorrect4 ? Colors.green[100] : Colors.red[100];
          break;
      }
      submitButton();
    });
  }

  submitButton() {
    _counter++;
    radioValue = 0;
    bkgrdColor = Colors.blue[50];
  } //nextQuestion() }

  Widget build(BuildContext context) {
    ThemeData theme = Theme.of(context);
    var container = new Container(
      child: new Column(
        children: [
          new Column(
            children: [
              new Row(
                children: [
                  new Expanded(
                    child: new Container(
                      child: new Row(
                        children: [
                          new Radio<int>(
                              value: ans1Value,
                              groupValue: radioValue,
                              onChanged: handleRadioValueChanged),
                          new Text(
                              "${questions[_counter].answers[_ansCounter1]}")
                        ],
                      ),
                    ),
                  ),
                  new Expanded(
                    child: new Container(
                      child: new Row(children: [
                        new Radio<int>(
                            value: ans2Value,
                            groupValue: radioValue,
                            onChanged: handleRadioValueChanged),
                        new Text("${questions[_counter].answers[_ansCounter2]}")
                      ]),
                    ),
                  ),
                ],
              ),
            ],
          ),
          new Column(
            children: [
              new Column(
                children: [
                  new Row(
                    children: [
                      new Expanded(
                        child: new Container(
                          child: new Row(
                            children: [
                              new Radio<int>(
                                  value: ans3Value,
                                  groupValue: radioValue,
                                  onChanged: handleRadioValueChanged),
                              new Text(
                                  "${questions[_counter].answers[_ansCounter3]}")
                            ],
                          ),
                        ),
                      ),
                      new Expanded(
                        child: new Container(
                          child: new Row(children: [
                            new Radio<int>(
                                value: ans4Value,
                                groupValue: radioValue,
                                onChanged: handleRadioValueChanged),
                            new Text(
                                "${questions[_counter].answers[_ansCounter4]}")
                          ]),
                        ),
                      ),
                    ],
                  ),
                ],
              ),
            ],
          ),
        ],
      ),
    );

    return new Scaffold(
      appBar: new AppBar(
        leading: new IconButton(icon: new Icon(Icons.menu), onPressed: null),
        title: new Text('getdata'),
      ),
      body: new Container(
        child: new Column(
          children: [
            new Expanded(
              //child: new Container(
              child: new Column(
                children: <Widget>[
                  new Expanded(
                    flex: 3,
                    child: new Container(
                      child: new Card(
                        color: bkgrdColor,
                        child: new Row(
                          children: <Widget>[
                            new Text("${questions[_counter].question}"),
                          ],
                        ),
                      ),
                    ),
                  ),
                  new Expanded(
                    flex: 1,
                    child: new Center(
                      child: container,
                    ),
                  ),
                  new AnimatedBuilder(
                      child: const Text('SUBMIT'),
                      animation: _controller,
                      builder: (BuildContext context, Widget child) {
                        return new RaisedButton(
                            color: new ColorTween(
                              begin: theme.primaryColor,
                              end: theme.disabledColor,
                            )
                                .animate(_controller)
                                .value,
                            colorBrightness: Brightness.dark,
                            child: child,
                            onPressed:
                                radioValue == 0 ? null : submitButton());
                      })
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }
}

我的方法 wrong/how 我能解决这个问题吗?

您应该在 onPressed 参数中将 submitButton() 替换为 submitButton。您希望 onPressed 成为 VoidCallback 而不是 null(调用 submitButton 的结果)。

此外,修改您的 submitButton 方法以调用 setState,例如

setState(() { 
  _counter++;
  radioValue = 0;
  bkgrdColor = Colors.blue[50];
});

当您修改 State 的成员时,您需要始终调用 setState(),否则 Flutter 将不知道重建您。