2017-05-10 6 views
3

私はクイズアプリのために以下のコードを書いていますが、選択されたラジオボタンを正しいansと比較し、次の質問への遷移を視覚的に選ばれたものの私はエラーが参照される可能性がありますどこ/何か、そのアプローチ(switch文)と間違っている可能性がありますかを理解するために十分慣れていないんだエラーラジオボタンがフラッターで選択されているトラック

The following NoSuchMethodError was thrown while handling a gesture: 
I/flutter (28574): The method '[]' was called on null. 

にswitch文と_counter変数が、結果を使用してみました。どんな訂正/指示/ヒントも感謝します。ありがとう。

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

Map<String, Map<String, String>> questionBank = { 
    "1": { 
    "question": "What is the capital of Canada?", 
    "ans1": "Toronto", 
    "ans2": "Montreal", 
    "ans3": "Ottawa", 
    "ans4": "Vancouver", 
    "coAns": "Ottawa" 
    }, 
    "2": { 
    "question": "What is the capital of the United States of America?", 
    "ans1": "New York", 
    "ans2": "California", 
    "ans3": "Texas", 
    "ans4": "Washington DC", 
    "coAns": "Washington DC" 
    }, 
    "3": { 
    "question": "What is the capital of Nigeria?", 
    "ans1": "Abuja", 
    "ans2": "Lagos", 
    "ans3": "Port Harcourt", 
    "ans4": "Makurdi", 
    "coAns": "Abuja" 
    }, 
    "4": { 
    "question": "What is the capital of England?", 
    "ans1": "Britain", 
    "ans2": "Scotland", 
    "ans3": "London", 
    "ans4": "Edinburgh", 
    "coAns": "London" 
    }, 
    "5": { 
    "question": "What is the capital of China?", 
    "ans1": "Beijing", 
    "ans2": "Shanghai", 
    "ans3": "Tianjin", 
    "ans4": "Taiwan", 
    "coAns": "Beijing" 
    }, 
}; 

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> { 

    @override 
    var _counter = 1; 
    var bkgrdColor = Colors.blue[50]; 
    int radioValue = 0; 

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

    void handleRadioValueChanged(int value) { 
    setState(() { 
     radioValue = value; 
     /* 
     switch (radioValue) { 
     case 1: 
      bkgrdColor = (questionBank[_counter]["coAns"] == 
        questionBank[_counter][ans1Value]) 
       ? Colors.green[50] 
       : Colors.red[50]; 
      break; 
     case 2: 
      bkgrdColor = (questionBank[_counter]["coAns"] == 
        questionBank[_counter][ans2Value]) 
       ? Colors.green[50] 
       : Colors.red[50]; 
      break; 
     case 3: 
      bkgrdColor = (questionBank[_counter]["coAns"] == 
        questionBank[_counter][ans3Value]) 
       ? Colors.green[50] 
       : Colors.red[50]; 
      break; 
     case 4: 
      bkgrdColor = (questionBank[_counter]["coAns"] == 
        questionBank[_counter][ans4Value]) 
       ? Colors.green[50] 
       : Colors.red[50]; 
      break; 
     } 
     */ 
     _counter++; 
     radioValue = 0; 
    }); 
    } 

    Widget build(BuildContext context) { 
    return new Scaffold(
     appBar: new AppBar(
     leading: new IconButton(icon: new Icon(Icons.menu), onPressed: null), 
     title: new Text('quizApp'), 
    ), 
     body: new Container(
     child: new Column(
      children: [ 
      new Expanded(
       child: new Container(
       child: new Column(
        children: [ 
        new Expanded(
         child: new Container(
         child: new Card(
          color: bkgrdColor, 
          child: new Row(
          children: <Widget>[ 
           new Text(
            "${questionBank[_counter.toString()]["question"]}"), 
          ], 
         ), 
         ), 
        ), 
        ), 
        new Expanded(
         child: new Container(
         child: new Card(
          child: new Column(
          children: [ 
           new Row(
           children: <Widget>[ 
            new Radio<int>(
             value: ans1Value, 
             groupValue: radioValue, 
             onChanged: handleRadioValueChanged), 
            new Text(
             "${questionBank[_counter.toString()]["ans1"]}") 
           ], 
          ), 
           new Divider(), 
           new Row(
           children: <Widget>[ 
            new Radio<int>(
             value: ans2Value, 
             groupValue: radioValue, 
             onChanged: handleRadioValueChanged), 
            new Text(
             "${questionBank[_counter.toString()]["ans2"]}") 
           ], 
          ), 
           new Divider(), 
           new Row(
           children: <Widget>[ 
            new Radio<int>(
             value: ans3Value, 
             groupValue: radioValue, 
             onChanged: handleRadioValueChanged), 
            new Text(
             "${questionBank[_counter.toString()]["ans3"]}") 
           ], 
          ), 
           new Divider(), 
           new Row(
           children: <Widget>[ 
            new Radio<int>(
             value: ans4Value, 
             groupValue: radioValue, 
             onChanged: handleRadioValueChanged), 
            new Text(
             "${questionBank[_counter.toString()]["ans4"]}") 
           ], 
          ), 
          ], 
         ), 
         ), 
        ), 
        ), 
        ], 
       ), 
      ), 
      ), 
      ], 
     ), 
    ), 
    ); 
    } 
} 
+0

マップの代わりにオブジェクトを使用すると考えましたか?私は実際にラジオのクラスが何をしているのかわからない、あなたはそれを私に説明できますか? – OhMad

+0

ラジオボタン(素材デザインウィジェット)です。私の挑戦は、ユーザーの入力を得て、選択した選択肢を正しい答えと比較することです。どのようにオブジェクトがこれに対処しますか?私は現在、ユーザー入力用のラジオウィジェットを使用しており、それをテキストウィジェットと関連付けています。 – driftavalii

+0

あなたは実際に何を得ることができましたか?ユーザーがクリックした回答やラジオボタンの一部を取得できましたか? – OhMad

答えて

2

私があなただったら、私は実際に(許可された私はすぐに...そう構文はポイントでないかもしれない、私のiPadでこれを書いているため、このいずれかを服用しないでください)質問オブジェクトを作成します:

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

今、あなたが質問のリストを作成するためにオブジェクトを使用することができます。

List<Question> questions = [ 
    new Question("What is 2+2", ["2", "3", "4"], "4"), 
    // create as many questions as you want 
]; 

あなたのカウンタ変数を維持し、実際にインデックスとして使用することができます。

あなたが選んだ答えをselectedAnswerという文字列で取得できるとしましょう。あなたのSETSTATEでは()私はこのような何かをするだろう:

は、ユーザーへの質問と回答を表示するために
if (chosenAnswer == questions[_counter].correctAnswer){ 
    // answer was correct 
} else { 
    // answer is false 
} 
// and dont forget to increment your counter 
_counter++; 

、再度質問オブジェクトのインデックスとアクセスなどのあらゆる可能な答えをカウンタ変数を使用することができますそれはリストに格納されています。

私はちょっと助けることができました

+0

ご協力ありがとうございます!これは驚異的なことでした。もう1つ質問です。変数radioValueとbkgrdColorをリセットする前に遅延を追加する方法の指針は、任意のカウンタがインクリメントされていますか? Timer(duration、 "callback function")を使ってみましたが効果がないようです。 – driftavalii

+0

問題ありません!残念ながら、私は非常に長い時間のためにフラッターを使用していないので、私は本当に正確な答えを知らない。私は私が推測するこの解決策は、ショットの価値があることを発見したhttp://stackoverflow.com/questions/18449846/how-can-i-sleep-a-dart-program – OhMad

関連する問題