草庐IT

dart - flutter 中选择的轨道单选按钮

coder 2023-05-10 原文

我已经为一个测验应用程序编写了下面的代码,但我一直在寻找一种方法来比较所选单选按钮和正确的答案,并充分延迟到下一个问题的过渡,以便直观地指示所做的选择。尝试使用 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"]}")
                                ],
                              ),
                            ],
                          ),
                        ),
                      ),
                    ),
                  ],
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

最佳答案

如果我是你,我实际上会创建一个问题对象(不要认为这是理所当然的,我正在我的 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++;

为了向用户显示问题和答案,您可以再次使用计数器变量作为索引并访问存储在列表中的问题对象中的每个可能的答案。

希望能帮到你

关于dart - flutter 中选择的轨道单选按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43897047/

有关dart - flutter 中选择的轨道单选按钮的更多相关文章

  1. ruby - 没有轨道的 ActiveRecord 时区 - 2

    我在非Rails项目中使用ActiveRecord。在Rails中,我可以这样做:config.time_zone='EasternTime(US&Canada)'config.active_record.default_timezone='EasternTime(US&Canada)'但如果我不使用rails,我该如何设置时区? 最佳答案 ActiveRecord::Base.default_timezone='EasternTime(US&Canada)' 关于ruby-没有轨道的A

  2. ruby-on-rails - Rails 单选按钮 - 模型中多列的一种选择 - 2

    我希望用户从一个模型的三个选项中选择一个。即我有一个模型视频,可以被评为正面/负面/未知目前我有三列bool值(pos/neg/unknown)。这是处理这种情况的最佳方式吗?为此,表单应该是什么样的?目前我有类似的东西但显然它允许多项选择,而我试图将它限制为只有一个..怎么办? 最佳答案 如果要使用字符串列,让我们说rating。然后在你的表单中:#...#...它只允许一个选择编辑完全相同但使用radio_button_tag: 关于ruby-on-rails-Rails单选按钮-模

  3. ruby - 如何从哈希中选择前 5 个值? - 2

    我有一个ids和他们的分数的散列,它是这样的:@objects={1=>57,4=>12,3=>9,5=>3,55=>47,32=>39,17=>27,29=>97,39=>58}我怎样才能选出前五名并放弃其余的?我这样做:@orderedObject=@objects.sort_by{|k,v|v}.reverse=>[[29,97],[39,58],[1,57],[55,47],[32,39],[17,27],[4,12],[3,9],[5,3]]然后我这样做:只有@orderedObjects的键:@keys=@orderedObject.map{|key,value|key}这

  4. ruby-on-rails - 如何从按钮或链接单击的 View 调用 Rails 方法 - 2

    基本上,我试图在用户单击链接(或按钮或某种类型的交互元素)时执行Rails方法。我试着把它放在View中:但这似乎没有用。它最终只是在用户甚至没有点击“添加”链接的情况下调用该函数。我也用link_to试过了,但也没用。我开始认为没有一种干净的方法可以做到这一点。无论如何,感谢您的帮助。附言。我在ApplicationController中定义了该方法,它是一个辅助方法。 最佳答案 View和Controller是相互独立的。为了使链接在Controller内执行函数调用,您需要对应用程序中的端点执行ajax调用。该路由应调用rub

  5. ruby-on-rails - 如何在 Rails 中添加禁用的提交按钮 - 2

    我在ruby​​表单中有一个提交按钮f.submitbtn_text,class:"btnbtn-onemgt12mgb12",id:"btn_id"我想在不使用任何javascript的情况下通过ruby​​禁用此按钮 最佳答案 添加disabled:true选项。f.submitbtn_text,class:"btnbtn-onemgt12mgb12",id:"btn_id",disabled:true 关于ruby-on-rails-如何在Rails中添加禁用的提交按钮,我们在St

  6. ruby-on-rails - 从 ActiveAdmin has_many 表单助手中删除 "Add new"按钮 - 2

    我在事件管理员编辑页面中有嵌套资源,但我只想允许管理员编辑现有资源的内容,而不是添加新的嵌套资源。我的代码看起来像这样:formdo|f|f.inputsdof.input:authorf.input:contentf.has_many:commentsdo|comment_form|comment_form.input:contentcomment_form.input:_destroy,as::boolean,required:false,label:'Remove'endendf.actionsend但它在输入下添加了“添加新评论”按钮。我怎样才能禁用它,并只为主窗体保留f.ac

  7. arrays - 在一行中选择数组的第一个和最后一个元素 - 2

    我的任务是从数组中选择最高和最低的数字。我想我很清楚我想做什么,但只是努力以正确的格式访问信息以满足通过标准。defhigh_and_low(numbers)array=numbers.split("").map!{|x|x.to_i}array.sort!{|a,b|ba}putsarray[0,-1]end数字可能看起来像"80917234100",要通过,我需要输出"9234"。我正在尝试putsarray.first.last,但一直无法弄明白。 最佳答案 有Array#minmax完全满足您需要的方法:array=[80,

  8. ruby - 按 Enter 键而不是用鞋子单击按钮(Ruby) - 2

    正如标题所暗示的那样,我只是在寻找一种无需单击即可按下Shoes中的按钮的方法。我已经搜索了论坛,但不幸的是找不到任何东西。谢谢 最佳答案 这在Windows下的红色鞋子中不起作用,因为Windows控件窃取了所有事件。不过,我设法在window下穿着绿鞋工作。举个例子['green_shoes'].each(&method(:require))Shoes.app{e=edit_linebutton("Clickme!"){alert("Youclickedme.")}keypress{|k|alert("YoupressedEnt

  9. ruby - 如何使用 Mechanize 保存通过单击按钮下载的文件 - 2

    我正在尝试使用Mechanize来模拟点击网页上的按钮,然后会在浏览器中启动文件下载。这是我的代码片段form=page.forms.first#=>Mechanize::Formform=agent.page.form_with(:name=>"aspnetForm")button=form.button_with(:value=>"GPXfile")ppbuttonagent.submit(form,button)pp按钮的输出是这样显示的,这意味着它是右键:#但是在发出“agent.submit(form,button)”之后,我怎样才能让Mechanize检索单击该按钮时将发送

  10. ruby-on-rails - 将 Bootstrap 图标添加到 Ruby on Rails 中的按钮 - 2

    我想在RubyonRails中为按钮添加图标。目前我尝试了以下方法:"),{:controller=>'events',:action=>"upvoteEvent",:method=>"put",:id=>@event.id,:uid=>current_user.id},{:class=>"btnbtn-success"}%>生成以下html:"/>我遵循了此处发布的解决方案:https://stackoverflow.com/a/10468935/1385324,但这对我不起作用。我还测试了BootstrapCSS是否正常工作,只需在网站的其他任何地方插入一个图标即可。感谢您的帮助!

随机推荐