Flutter使用flutter_swiper时如何保存每个RadioListTile的独立状态
问题原因
你当前所有题目共用同一个value变量存储选中答案,所有题目的RadioListTile的groupValue都绑定了这个全局变量,既无法存储多道题的选中结果,也会导致切换题目后选中状态复用。
解决方案
修改存储选中结果的结构,用Map按题目索引独立存储每道题的选中答案,同时在切换题目时触发UI刷新即可,修改后的代码如下:
class QuestionScreen extends StatefulWidget { @override _QuestionScreenState createState() => _QuestionScreenState(); } class _QuestionScreenState extends State<QuestionScreen> { late SwiperController _controller; // 改动:用Map存储每道题的选中答案,key为题目索引,value为选中的答案索引 Map<int, int?> selectedAnswers = {}; @override void initState() { super.initState(); _controller = SwiperController(); } @override Widget build(BuildContext context) { return BaseView( body: Column( children: [ Container( height: 80.h, width: 100.w, child: Swiper( loop: false, controller: _controller, // 改动:切换题目时触发刷新,更新当前题目的选中状态 onIndexChanged: (index) => setState(() {}), itemBuilder: (BuildContext context, int mainIndex) { return Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Container( width: 100.w, child: Center( child: Text( '(${mainIndex+1}) ${questions[mainIndex]['question']}')), ), Container( height: 50.h, child: ListView.builder( itemBuilder: (context, index) { var ans = questions[mainIndex]['answers']; var _ = ans.keys.toList()[index]; var _v = ans.values.toList()[index]; return RadioListTile( value: index, // 改动:取当前题目对应的选中值 groupValue: selectedAnswers[mainIndex], onChanged: (newVal) => setState(() => selectedAnswers[mainIndex] = newVal as int?), title: Text('$_ : $_v'), ); }, itemCount: questions[mainIndex]['answers'].length, ), ), ], ); }, itemCount: questions.length, pagination: new SwiperPagination(), ), ), Container( width: 100.w, child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ TextButton( onPressed: () { _controller.previous(); }, child: Text('Prev'), style: ButtonStyle( backgroundColor: MaterialStateProperty.all<Color>(AppColors.brown)), ), TextButton( onPressed: () { _controller.next(); }, child: Text('Next'), style: ButtonStyle( backgroundColor: MaterialStateProperty.all<Color>(AppColors.brown), ), ), ], )) ], ), ); } }
逻辑说明
- Map结构
selectedAnswers可以持久化存储所有题目的选中结果,提交答案时直接遍历这个Map就能拿到所有题的作答数据 - 每道题的
RadioListTile只绑定对应题目索引的选中值,不同题目之间的选中状态完全隔离 - 切换题目时触发的
setState会重新渲染当前题目的Radio组,自动读取对应题目的历史选中值展示
内容的提问来源于stack exchange,提问作者maykhid
相关产品推荐
相关产品推荐

