You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 17:36:08