Flutter开发中LateInitializationError异常:已添加late与required关键字仍报错
解决LateInitializationError: Field 'ques' has not been initialized问题
我一眼就定位到了问题的核心——你的Questions类构造函数里的赋值顺序完全搞反了!
错误原因分析
你给ques和ans标记了late关键字,承诺会在它们被使用前完成初始化,但构造函数里的代码写反了:
Questions({required String a,required bool b}) { a=ques; // 把未初始化的ques赋值给参数a,完全没用! b=ans; // 同理,ans也没被赋值 }
这导致ques和ans始终处于未初始化状态,当你在UI中访问questionsAndAnswers[questiontracker].ques时,就触发了LateInitializationError。
解决方案
这里有两种修复方式,推荐第二种更规范的写法:
方式1:修正构造函数的赋值顺序
直接把赋值方向反过来,给类字段赋值:
class Questions{ late String ques; late bool ans; Questions({required String a,required bool b}) { ques = a; // 正确:把参数a的值赋给ques ans = b; // 正确:把参数b的值赋给ans } }
方式2:使用final字段+初始化列表(推荐)
late在这里其实是多余的,我们可以用final字段配合初始化列表,更安全且简洁,还能避免未初始化的风险:
class Questions{ final String ques; final bool ans; // 用初始化列表直接完成赋值,构造函数体都可以省略 Questions({required String a, required bool b}) : ques = a, ans = b; }
如果想让代码更易读,还可以把参数名和字段名统一,用this直接赋值:
class Questions{ final String ques; final bool ans; // 直接用this.ques绑定参数,代码更简洁 Questions({required this.ques, required this.ans}); }
此时创建对象的代码也更直观:
Questions(ques: 'Pakistan is an under developed country', ans: true)
额外小提示
你的QuizPlay里还有个潜在问题:当所有问题答完后,questiontracker会超出数组长度,触发数组越界错误。建议在点击按钮时加个判断:
setState(() { // 只有还有未答的问题时,才递增索引 if(questiontracker < questionsAndAnswers.length - 1){ questiontracker++; } score.add(Icon(Icons.check,color: Colors.green,)) ; });
内容的提问来源于stack exchange,提问作者Ahmed Faraz Ali
相关产品推荐
相关产品推荐

