2017-05-12 1 views
0

Ich habe diesen Flutter-Code (für ein Quiz) und ich möchte die Schaltfläche Senden, um zur nächsten Frage zu bewegen, aber die Verwendung der submitQuestion() aktiviert nicht die Schaltfläche noch die Animation enthaltenWie gehe ich durch die Fragenliste mit der Schaltfläche "Senden"

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(); 
    } 
} 

Ist meine Vorgehensweise falsch/wie adressiere ich das?

Antwort

1

Sie sollten submitButton() durch submitButton in Ihrem onPressed Argument ersetzen. Sie möchten onPressed ein VoidCallback statt null (das Ergebnis des Aufrufs submitButton) sein.

Ändern Sie auch Ihre submitButton-Methode, um setState, z.

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

Sie müssen immer setState() rufen, wenn Sie Mitglieder Ihrer State ändern, da sonst nicht Flutter Sie wieder aufbauen wissen.

Verwandte Themen