Flutter中CupertinoTabBar遮挡WebView的非padding解决方案咨询
问题:CupertinoTabBar遮挡WebView内容,如何不用padding解决?
我在部分页面使用WebView组件时,发现CupertinoTabBar会遮挡WebView内容,请问如何不使用padding来解决这个问题?
相关代码示例:
class _ShoppingBagState extends State<ShoppingBag> { bool isLoading = false; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(), body: Constants.USER_TOKEN.isEmpty ? const Center( child: Text('Авторизуйтесь', style: TextStyle(fontSize: 25, fontWeight: FontWeight.bold),), ) : Stack( children: [ WebView(), Visibility( visible: isLoading, child: const Positioned.fill( child: Center( child: CircularProgressIndicator(), )), ) ] ), ); } }
问题截图:
解决方案
不用padding的话,可以试试以下几种方法:
- 启用Scaffold自动适配
在Scaffold中添加resizeToAvoidBottomInset: true,该属性会让body自动调整尺寸,避开底部导航栏的遮挡:
return Scaffold( appBar: AppBar(), resizeToAvoidBottomInset: true, // 开启自动适配 body: Constants.USER_TOKEN.isEmpty ? const Center( child: Text('Авторизуйтесь', style: TextStyle(fontSize: 25, fontWeight: FontWeight.bold),), ) : Stack( children: [ WebView(), Visibility( visible: isLoading, child: const Positioned.fill( child: Center( child: CircularProgressIndicator(), )), ) ] ), );
- 用SafeArea包裹WebView
SafeArea会自动识别系统栏位置,确保子组件不被遮挡,只需给WebView加上这个包裹:
Stack( children: [ SafeArea( bottom: true, // 仅适配底部区域 child: WebView(), ), Visibility( visible: isLoading, child: const Positioned.fill( child: Center( child: CircularProgressIndicator(), )), ) ] )
- 手动设置WebView底部约束
通过MediaQuery获取底部安全区域高度,加上底部导航栏固定高度,给WebView设置底部边界:
Stack( children: [ Positioned( left: 0, right: 0, top: 0, // 系统常量+底部安全区高度确定底部位置 bottom: MediaQuery.of(context).padding.bottom + kBottomNavigationBarHeight, child: WebView(), ), Visibility( visible: isLoading, child: const Positioned.fill( child: Center( child: CircularProgressIndicator(), )), ) ] )
内容的提问来源于stack exchange,提问作者st4tic
相关产品推荐
相关产品推荐

