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

Flutter问题:BottomSheet选择后文本不更新,刷新才生效如何修复?

问题原因

你在BottomSheet中使用的setState1是StatefulBuilder提供的状态更新方法,它仅能刷新BottomSheet内部的UI,无法触发页面(_NonVegPizzaPageState)的重绘。而页面上的Text依赖于页面状态变量itemSize,只有页面的setState方法才能通知Flutter框架重新构建页面UI,所以当前选择后文本不会立即更新。

修复方案

将BottomSheet选项点击事件中的setState1替换为页面的setState方法,这样就能在更新itemSize后立即触发页面重绘,更新文本显示。

基础修复(无需BottomSheet内选中反馈)

修改BottomSheet中InkWell的onTap逻辑:

InkWell(
  onTap: () {
    Navigator.pop(context);
    // 使用页面的setState更新状态,触发页面重绘
    setState(() {
      itemSize = itemSizes[index]["sizes"];
    });
    print(itemSize);
  },
  // 其余代码保持不变
)

进阶修复(保留BottomSheet内选中高亮)

如果需要在BottomSheet中点击选项时实时显示选中状态,可保留StatefulBuilder,同时在更新状态后触发页面重绘:

sizeBottomSheet() {
  showModalBottomSheet(
      barrierColor: Colors.transparent,
      context: context,
      shape: const RoundedRectangleBorder(
        borderRadius: BorderRadius.only(
          topLeft: Radius.circular(15.0),
          topRight: Radius.circular(15.0),
        ),
      ),
      builder: (context) {
        return StatefulBuilder(
            builder: (BuildContext context, StateSetter setState1) {
          return Container(
            decoration: BoxDecoration(
              color: MyColor.whiteColor,
              borderRadius: BorderRadius.only(
                topLeft: Radius.circular(15.0),
                topRight: Radius.circular(15.0),
              ),
              boxShadow: [
                BoxShadow(
                  color: MyColor.greyColor.withOpacity(0.8),
                  spreadRadius: 5,
                  blurRadius: 7,
                  offset: Offset(0, 0), // changes position of shadow
                ),
              ],
            ),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              mainAxisSize: MainAxisSize.min,
              children: [
                Padding(
                  padding:
                      const EdgeInsets.only(left: 43.0, top: 10, bottom: 11),
                  child: Text(
                    "Select Size",
                    style: textStyleWith14500(MyColor.blackColor2),
                    maxLines: 1,
                    overflow: TextOverflow.ellipsis,
                  ),
                ),
                ListView.builder(
                    physics: NeverScrollableScrollPhysics(),
                    shrinkWrap: true,
                    itemCount: itemSizes.length,
                    itemBuilder: (_, index) {
                      return Padding(
                        padding: EdgeInsets.only(
                          top: 0,
                        ),
                        child: InkWell(
                          onTap: () {
                            // 先更新BottomSheet内的选中状态,显示高亮
                            setState1(() {
                              itemSize = itemSizes[index]["sizes"];
                            });
                            Navigator.pop(context);
                            // 触发页面重绘,更新页面文本
                            setState(() {});
                            print(itemSize);
                          },
                          child: Container(
                            margin: EdgeInsets.only(left: 2, right: 2),
                            height: 36,
                            width: double.infinity,
                            color: itemSize == itemSizes[index]["sizes"]
                                ? MyColor.lightBlueColor
                                : MyColor.whiteColor,
                            child: Padding(
                              padding:
                                  const EdgeInsets.only(left: 43.0, top: 10),
                              child: Text(
                                "${itemSizes[index]["sizes"]}",
                                style:
                                    textStyleWith12400(MyColor.blackColor3),
                                maxLines: 1,
                                overflow: TextOverflow.ellipsis,
                              ),
                            ),
                          ),
                        ),
                      );
                    }),
              ],
            ),
          );
        });
      });
}
说明

页面的setState方法会通知Flutter框架重新执行build方法,从而更新页面上的Text组件内容。如果不需要BottomSheet内的选中反馈,基础修复即可满足需求;若需要交互时的视觉反馈,则使用进阶方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:48:29