在 Flutter 中调用函数时遇到空引用问题

Posted

技术标签:

【中文标题】在 Flutter 中调用函数时遇到空引用问题【英文标题】:Struggling with null referencing issues while calling a function in Flutter 【发布时间】:2021-10-12 03:10:04 【问题描述】:

我目前正在尝试使用 Flutter 创建一个应用程序,帮助用户记住法语动词。这是我的代码的 sn-p:

class Quiz 
  List<String> questionList;
  List<String> answerList;
  Quiz(List questionList, List answerList)
    this.questionList = questionList;
    this.answerList = answerList;
  

如您所见,我创建了一个 Quiz 类,它接受两个参数:一个测试问题列表和一个相应答案列表。

然后我定义了一个实际返回“测验”对象的函数。这里是:

Quiz quizGenerator (questions, answers) 
  final Set<int> indexS = Set();
  for (int i = 0; i <= 9; i++)
    indexS.add(Random().nextInt(49));
  
  List<String> testQ;
  List<String> testA;
  List<int> indexes = indexS.toList();
  for (int i = 0; i <= 9; i++)
    var element = indexes[i];
    testQ[i] = questions[element];
    testA[i] = answers[element];
  
  var newTest = Quiz(testQ, testA);
  return newTest;


我希望此函数返回一个“测验”对象,该对象由十个要测试的动词组成,这些动词是从称为“问题”的五十个动词的较大列表中随机挑选的,以及它们从较大列表“答案”中的相应答案.由于我打算通过生成随机索引号来选择测试题,并且我不希望动词在测试中重复,我创建了一组称为“indexS”的整数,并用十个随机数填充它0-49。这个集合基本上包含了从更大的“问题”列表中提出的十个问题的索引号。

然后我将该集合转换为称为“索引”的整数列表。我还创建了另外两个名为“testQ”和“testA”的列表,它们实际上分别包含十个测试问题及其相应的答案。这两个列表将是“测验”对象的属性。从那里,我使用了一个 for 循环,通过使用存储在列表“索引”中的随机索引号,用十个测试问题及其答案填充“testQ”和“testA”。这一切的最终结果是“quizGenerator”返回了一个“Quiz”对象。

但是,当我尝试调用“quizGenerator”时出现以下错误:

The following NoSuchMethodError was thrown while handling a gesture:
The method '[]=' was called on null.
Receiver: null
Tried calling: []=(0, "to open")

如果这个问题的答案很明显,我深表歉意,但我才刚刚开始编程,而且我已经在互联网上搜索了好几天,但运气不佳。让我知道是否有不清楚的地方,或者您是否需要其他任何东西来更好地回答我的问题。谢谢!

编辑:

以下是“问题”和“答案”的声明:

List<String> answers = ['rentrer', 'vivre', 'rendre', 'tenir', 'oublier', 'travailler', 'manger', 'entrer', 'devenir', 'commencer', 'payer', 'tirer', 'ouvrir', 'changer', 'excuser', 'dormir', 'occuper', 'marcher', 'envoyer', 'apprendre', 'boire', 'garder', 'montrer', 'asseoir', 'porter', 'prier', 'servir', 'écrire', 'retrouver', 'gagner', 'acheter', 'rappeler', 'lire', 'monter', 'quitter', 'emmener', 'toucher', 'continuer', 'raconter', 'repondre', 'sauver', 'rencontrer', 'fermer', 'valoir', 'compter', 'bouger', 'apporter', 'décider', 'vendre', 'expliquer',];

List<String> questions = ['to bring in','to live','to return','to hold','to forget','to work','to eat','to go in','to become','to start','to pay','to pull','to open','to change','to forgive','to sleep','to occupy','to walk','to send','to learn','to drink','to look after','to show','to sit down','to carry','to pray','to serve','to write','to find', 'to win', 'to buy', 'to remind', 'to read', 'to go up', 'to leave', 'to take', 'to touch', 'to continue', 'to tell', 'to answer', 'to save', 'to meet', 'to close', 'to hold', 'to count', 'to move', 'to bring', 'to decide', 'to sell', 'to explain',];

【问题讨论】:

【参考方案1】:

testQ & testA 未初始化。用一个空列表初始化它们。

List<String> testQ = [], testA = [];

使用add方法将数据添加到列表中。

testQ.add(questions[element]);
testA.add(answers[element]);

如果某些随机数相同,则 set 将仅存储唯一的随机数。不要使用 Set 直接使用 List 或使用 i &lt;= _variable.length 而不是 i &lt;= 9 用于变量可能是某个列表或集合的条件。

【讨论】:

我尝试这样做,但随后出现以下错误 - RangeError (index): Invalid value: Valid value range is empty: 0 感谢您一直以来的帮助,但 Flutter 仍然给我类似的错误信息 - RangeError (index): Invalid value: Not inclusive range 0..7: 8 你能补充更多细节吗? questionsanswers代表什么? 两者都是包含 50 个元素的字符串列表。 “questions”是一个包含 50 个问题的列表,而“answers”包含这些问题的相应答案。如果有帮助,我还在我的帖子中添加了他们的声明。 啊,有道理。谢谢!

以上是关于在 Flutter 中调用函数时遇到空引用问题的主要内容,如果未能解决你的问题,请参考以下文章

致命异常: main ,尝试在空对象引用上调用虚拟方法 [重复]

在 Android 中调用 OpenCL 函数时未定义的引用

Angular 2+:IE 11 无法获取未定义或空引用的属性“调用”

Flutter Firebase Cloud 功能无法调用

显示来自sqlite数据库的数据时“尝试在空对象引用上调用虚拟方法”[重复]

在使用 Recycler View 时尝试在空对象引用上调用虚拟方法