动态向sliding_up_panel添加组件高度不更新导致底部溢出如何解决
解决方案
这个问题的核心原因是sliding_up_panel默认会初始化固定的面板高度,内部内容动态变化时不会主动触发高度重计算,因此会出现底部溢出截断的问题,按以下步骤修改即可:
- 先声明面板控制器,用于触发高度重计算
final PanelController _panelController = PanelController();
- 给
SlidingUpPanel绑定控制器,同时修改面板内部Column的适配属性,让列高度跟随内容自适应:
@override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("SlidingUpPanelExample"), ), body: Stack( children: <Widget>[ Center(child: Text("This is the Widget behind the sliding panel"),), SlidingUpPanel( // 绑定控制器 controller: _panelController, // 配置面板高度默认跟随内容适配 defaultPanelState: PanelState.COLLAPSED, panel: Container( child: Column( // 新增这行,让Column高度不占满父容器,只适配内容高度 mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ myFirstVariable ? Text("This is a sliding Widget") : Container(), mySecondVariable ? Text("This is another sliding Widget") : Container(), ], ), ) ) ], ) ); }
- 每次修改触发面板内容变化的变量(
myFirstVariable/mySecondVariable)时,在setState之后调用控制器的重算高度方法:
// 示例:修改变量触发内容变化 setState(() { myFirstVariable = true; }); // 新增这行,通知面板重新计算高度 _panelController.markNeedsResize();
旧版本兼容方案(无markNeedsResize方法的版本)
如果使用的是较旧版本的组件不支持上述方法,可以通过动态绑定maxHeight实现适配:
- 给面板内部的根容器绑定
GlobalKey,用于获取内容实际高度 - 声明一个变量存储面板高度:
double _panelHeight = 100; // 初始默认高度 - 每次内容变化时,通过
GlobalKey获取内容实际高度,更新_panelHeight后赋值给SlidingUpPanel的maxHeight和minHeight属性即可。
内容的提问来源于stack exchange,提问作者hardanger
相关产品推荐
相关产品推荐

