不同设备MediaQuery不一致致Scaffold溢出错误求助
Flutter Scaffold 溢出问题解决方法
你的问题根源在于硬编码计算高度:虽然数值上(总高-107)+3=总高-104和外层Container高度匹配,但不同设备的状态栏、系统导航栏高度存在差异,且MediaQuery返回的逻辑像素本身可能带小数,硬减固定值极易出现计算偏差导致溢出。另外,Scaffold的body本身会自动适配可用空间,完全没必要手动设置高度。
解决方案
- 移除body外层Container的
height设置 - 用
Expanded包裹承载getWid(_selectedindex)的容器,让它自动填充Column的剩余空间,替代手动计算高度的方式 - 保留底部3高度的分割线Container,整个Column会自动适配Scaffold的可用空间,彻底避免溢出
修正后的代码
Scaffold( backgroundColor: Colors.black, appBar: PreferredSize( preferredSize: const Size.fromHeight(50), child: AppBar( elevation: 0, iconTheme: const IconThemeData(color: Colors.blue), backgroundColor: mode.background1, actions: actionList(), ), ), body: Column( children: [ Expanded( child: getWid(_selectedindex), ), Container( height: 3, child: Row( children: [ mydivider(0), mydivider(1), mydivider(2), mydivider(3), ], ), ) ], ), bottomNavigationBar: Theme( data: Theme.of(context).copyWith( brightness: Brightness.dark, canvasColor: mode.canvasColor, primaryColor: const Color.fromARGB(255, 45, 124, 243), textTheme: Theme.of(context) .textTheme .copyWith(bodySmall: const TextStyle(color: Colors.grey))), child: SizedBox( height: 54, child: BottomNavigationBar( onTap: (int index) { setState(() { _selectedindex = index; }); }, currentIndex: _selectedindex, type: BottomNavigationBarType.fixed, selectedItemColor: Colors.blue, unselectedItemColor: Colors.grey, items: const [ BottomNavigationBarItem( icon: Icon(Icons.list), label: 'List', ), BottomNavigationBarItem( icon: Icon(Icons.local_grocery_store), label: 'Checkout', ), BottomNavigationBarItem( icon: Icon(Icons.history), label: 'Transactions', ), BottomNavigationBarItem( icon: Icon(Icons.settings_outlined), label: 'Settings', ) ]), ), ), )
补充说明
如果getWid返回的Widget需要额外的高度限制,可在Expanded内部嵌套Container,但无需手动计算总高减固定值。Expanded会自动占据Column中除底部分割线外的所有可用空间,适配任意设备屏幕尺寸。
内容的提问来源于stack exchange,提问作者Viqtoh
相关产品推荐
相关产品推荐

