如何将选中的Flutter单选按钮组JSON值存入变量供后续使用
问题原因&解决步骤
核心问题1:FutureBuilder重复触发接口请求
你直接把DocVisitDays()放在FutureBuilder的future参数里,每次调用setState触发页面重绘时,FutureBuilder都会重新执行一次接口请求,拿到新的snapshot实例,导致你之前选中的赋值逻辑被重置,甚至可能出现snapshot数据不一致的问题。
修复方法:在initState中提前初始化接口请求的Future实例,避免重复请求:
class _DocBookingState extends State<DocBooking> { String radioItemHolder = '03/09/2021'; // 新增:定义存储接口请求结果的Future变量 late Future _docVisitDaysFuture; // 给_radioValue设置初始值,默认选中第一个的话设为0即可 int _radioValue = 0; @override void initState() { super.initState(); // 初始化时只执行一次接口请求 _docVisitDaysFuture = DocVisitDays(); } // ... 其他原有代码 }
然后把FutureBuilder的future参数替换成这个预初始化的变量:
FutureBuilder( future: _docVisitDaysFuture, // ... 其他参数保持不变 )
核心问题2:索引取值逻辑有隐患
你在onChanged回调里直接用itemBuilder传入的index作为取值索引,当列表滚动后可能出现索引和实际数据匹配错位的问题,最好直接用onChanged返回的选中值作为索引:
onChanged: (value) { if (value == null) return; setState(() { // 用回调返回的value作为索引,取值更稳妥 radioItemHolder = snapshot.data[value as int].visitDate; _radioValue = value as int; }); // 可以加这行打印验证变量是否更新,在控制台查看输出即可 debugPrint('更新后的选中日期:$radioItemHolder'); },
额外验证点
如果你是在UI上展示radioItemHolder,确保展示的代码写在build方法里,这样setState触发重绘后UI才会同步更新;如果你是在其他异步方法里用这个变量,确保调用时机是在选中操作之后,不要提前存了变量的静态副本。
内容的提问来源于stack exchange,提问作者Toujo
相关产品推荐
相关产品推荐

