Flutter/Dart技术疑问:如何从嵌套Map列表中提取文本值?
解决方案
你的问题出在对嵌套结构的访问错误:questions[questionIndex]['answers']返回的是一个选项列表,而非单个选项Map,所以不能直接通过['text']取值,必须先遍历列表拿到单个选项,再提取text字段。
直接修正现有代码(无需改动数据结构)
可以通过两种循环方式实现:
方式1:索引循环
Column( children: [ // 用当前问题的选项数量作为循环上限,避免硬写固定值 for (var i = 0; i < (questions[questionIndex]['answers'] as List).length; i++) Text( // 先取列表第i个选项Map,再提取text questions[questionIndex]['answers'][i]['text'] as String, ), ], ),
方式2:直接遍历选项列表(更简洁)
Column( children: [ // 遍历当前问题的所有选项 for (var answer in questions[questionIndex]['answers'] as List<Map<String, dynamic>>) Text(answer['text'] as String), ], ),
更优方案:定义类型类(避免dynamic类型警告)
如果希望代码更健壮、可读性更高,可以创建对应的实体类来替代Map结构:
// 定义选项类 class Answer { final String text; final int answer; const Answer({required this.text, required this.answer}); } // 定义问题类 class Question { final String questionText; final List<Answer> answers; const Question({required this.questionText, required this.answers}); } // 初始化数据 final questions = const [ Question( questionText: 'This is the first question?', answers: [ Answer(text: 'Answer 1', answer: 1), Answer(text: 'Answer 2', answer: 2), Answer(text: 'Answer 3', answer: 3), Answer(text: 'Answer 4', answer: 4), ], ), Question( questionText: 'This is the second question?', answers: [ Answer(text: 'Answer 1', answer: 1), Answer(text: 'Answer 2', answer: 2), Answer(text: 'Answer 3', answer: 3), Answer(text: 'Answer 4', answer: 4), ], ), ];
此时渲染代码会更简洁直观,且无类型警告:
Column( children: [ for (var answer in questions[questionIndex].answers) Text(answer.text), ], ),
内容的提问来源于stack exchange,提问作者Cubeiik
相关产品推荐
相关产品推荐

