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
相关产品推荐
相关产品推荐

