在撲

2017-05-10 13 views
3

choosen軌道單選按鈕,我已經寫了下面的代碼用於測驗的應用程序,但我堅持在尋找一種方法以正確的答到比較選擇單選按鈕,也延緩了過渡到下一個問題足夠的視覺指示的選擇。使用switch語句和_counter可變的,但結果爲錯誤在撲

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

我不夠熟悉,瞭解哪裏/什麼錯誤可能指的還是什麼可能是錯的方法(switch語句)嘗試。任何更正/方向/提示將不勝感激。謝謝。

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

您是否考慮過使用對象而不是Map?我實際上並不知道無線電課的作用,你能向我解釋一下嗎? – 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 
]; 

你可以保持你的計數器變量和實際使用它作爲一個指標。

比方說,你設法讓用戶選擇在一個名爲chosenAnswer串答案。在你的setState()我會做這樣的事情:

if (chosenAnswer == questions[_counter].correctAnswer){ 
    // answer was correct 
} else { 
    // answer is false 
} 
// and dont forget to increment your counter 
_counter++; 

爲了顯示問題和答案給用戶,你可以再次使用計數器變量作爲索引和訪問每一個可能的答案的問題對象存儲在列表中。

希望我可以幫助一下

+0

感謝您的幫助!這工作出色了,還有一個問題,任何指針如何重置變量radioValue和bkgrdColor隨時計數器增加前添加延遲?我試過使用Timer(持續時間,「回調函數」),但它似乎沒有效果。 – driftavalii

+0

沒問題!不幸的是,我很久沒有使用Flutter了,所以我不知道確切的答案。我發現這個解決方案,我想是值得一試http://stackoverflow.com/questions/18449846/how-can-i-sleep-a-dart-program – OhMad