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

Flutter问题:底部弹窗内RadioListTile单选按钮无法选中

解决Flutter RadioListTile无法显示选中状态的问题

问题根源

你在showModalBottomSheet中使用StatefulBuilder管理弹窗内状态,但更新选中索引时调用的是外部的setState方法。由于BottomSheet是独立于当前页面的弹窗上下文,外部setState无法触发弹窗内部UI刷新,导致选中值已改变,但RadioListTile的选中状态不会同步更新。

另外代码存在冗余布局:RadioListTile的title属性嵌套了ListTile,造成不必要的层级嵌套,可能影响交互和显示。

修复方案

  1. 替换状态更新方法:将onChanged中的setState改为StatefulBuilder提供的myState,确保弹窗内部UI能响应状态变化
  2. 移除冗余的ListTile:直接用Text作为RadioListTile的title

修正后的完整代码

var _selectedLanguageRadioIndex = 0;
List<String> languageTitle = ["English", "हिंदी", "ಕನ್ನಡ"];
List<String> languageType = ["en", "hi", "ka"];

_languageOptions() {
  showModalBottomSheet(
    isScrollControlled: true,
    shape: RoundedRectangleBorder(
      borderRadius: BorderRadius.vertical(top: Radius.circular(15.0)),
    ),
    context: context,
    builder: (context) {
      return StatefulBuilder(
        builder: (BuildContext context, StateSetter myState) {
          return Column(
            mainAxisSize: MainAxisSize.min,
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Container(
                padding: EdgeInsets.fromLTRB(15, 10, 0, 10),
              ),
              Flexible(
                fit: FlexFit.loose,
                child: ListView.separated(
                  shrinkWrap: true,
                  itemBuilder: (context, index) {
                    return RadioListTile(
                      value: index,
                      groupValue: _selectedLanguageRadioIndex,
                      selected: _selectedLanguageRadioIndex == index,
                      onChanged: (val) {
                        // 使用StatefulBuilder的myState更新状态
                        myState(() => _selectedLanguageRadioIndex = val as int);
                      },
                      title: Text(languageTitle[index]),
                      controlAffinity: ListTileControlAffinity.trailing,
                    );
                  },
                  itemCount: languageTitle.length,
                  separatorBuilder: (context, index) => Divider(
                    thickness: 1,
                  ),
                ),
              )
            ],
          );
        },
      );
    },
  );
}

说明

  • 使用myState方法更新状态后,弹窗内部的RadioListTile会立即感知到_selectedLanguageRadioIndex的变化,同步更新选中状态
  • 移除嵌套的ListTile后,布局更简洁,避免了不必要的交互冲突

内容的提问来源于stack exchange,提问作者vishnu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 04:15:37