Flutter遍历列表获取索引时遇Dart类型错误,如何修复?
解决Flutter中
asMap().map闭包返回类型不匹配的错误 嘿,我来帮你搞定这个代码错误!你遇到的The return type 'Answer' isn't a 'MapEntry'问题,根源在于asMap().map方法的闭包要求返回**MapEntry<K, V>类型**,但你直接返回了Answer组件,这就导致Dart的类型检查不通过啦。
错误原因拆解
当你调用currentAnswers.asMap().map()时,这个map函数的作用是把原Map的每个键值对转换成新的键值对,所以闭包必须返回MapEntry(也就是键: 值的配对)。而你现在直接返回Answer widget,Dart自然会报错说返回类型不符合要求。
两种修复方案
方案1:使用entries.map(更简洁推荐)
直接通过asMap().entries获取索引和对应值的迭代器,然后直接转换成Answer组件,不需要手动构建MapEntry:
...currentAnswers .asMap() .entries // 获取包含索引(entry.key)和答案(entry.value)的键值对迭代器 .map( (entry) => Answer( text: entry.value, onPress: () { _onAnswerPress(entry.key, currentCorrectAnswerIndex); }, ), ) .toList()
方案2:手动返回MapEntry(兼容原有写法)
如果你想保留原来的asMap().map写法,只需要在闭包里明确返回MapEntry即可:
...currentAnswers .asMap() .map( (i, answer) => MapEntry( // 必须返回MapEntry,键为索引i,值为Answer组件 i, Answer( text: answer, onPress: () { _onAnswerPress(i, currentCorrectAnswerIndex); }, ), ), ) .values .toList()
修复后的完整代码
这里用方案1的写法给你完整的函数示例:
List<Widget> buildQuestionAndAnswers() { if (_questionIndex == QUESTION_LIST.length - 1) { return ([buildFinalScreen()]); } Map currentPair = QUESTION_LIST[_questionIndex]; String currentQuestion = currentPair["questionText"]; List<String> currentAnswers = currentPair["answers"]; int currentCorrectAnswerIndex = currentPair["correctAnswerIndex"]; return ([ Question(questionText: currentQuestion), ...currentAnswers .asMap() .entries .map( (entry) => Answer( text: entry.value, onPress: () { _onAnswerPress(entry.key, currentCorrectAnswerIndex); }, ), ) .toList() ]); }
这样修改后,代码就能正常运行,点击按钮时也能正确传递索引和正确答案索引进行对比啦。
内容的提问来源于stack exchange,提问作者Colin Burke
相关产品推荐
相关产品推荐

