Flutter iOS风格中Widget内容滑到了顶部导航栏后面与其重叠

Flutter 开发问题点一览



1. 问题描述

Flutter在iOS风格 CupertinoApp 中使用导航栏 CupertinoNavigationBar 时,出现了Widget内容滑到了顶部导航栏后面与其重叠的现象,如下图所示:
在这里插入图片描述
代码

  @override
  Widget build(BuildContext context) {
    return CupertinoPageScaffold(
      navigationBar: CupertinoNavigationBar(middle: Text("文本输入框")),
      child: Container(height: 120, color: Colors.red),
    );
  }

2. 原因、对策

原因

使用 CupertinoNavigationBar 时若 未设置或设置了带透明度的背景颜色 则可能会出现导航栏与其它widget重叠。

对策

  • 方式一: 在 CupertinoNavigationBar 中设置非透明背景色
  @override
  Widget build(BuildContext context) {
    return CupertinoPageScaffold(
      navigationBar: CupertinoNavigationBar(
        backgroundColor: Colors.white,  //添加背景色
        middle: Text("文本输入框"),
      ),
      child: Container(height: 120, color: Colors.red),
    );
  }
  • 方式二:在 CupertinoApp 主题中设置统一的导航栏背景色
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return CupertinoApp(
      theme: CupertinoThemeData(barBackgroundColor: Colors.white), //主题设置
      title: 'Flutter Demo',
      home: MyHomePage(),
    );
  }
}

3. 源码分析

3.1 查看 CupertinoPageScaffold 源码

查看 CupertinoPageScaffold navigationBar 属性的介绍即可知道原因,如果是半透明的,主要内容可能会滑到navigationBar后面。那默认颜色是什么呢?

在这里插入图片描述
3.2 查看 CupertinoNavigationBar 源码

查看 CupertinoNavigationBar backgroundColor 属性的介绍即可知道默认颜色为 CupertinoTheme 的 barBackgroundColor 属性。

在这里插入图片描述
3.3 查看 CupertinoThemeData 源码

查看 CupertinoThemeData barBackgroundColor属性可发现未设定值时会返回默认的颜色。

在这里插入图片描述
继续查看_defaults 可以发现其值为 _kDefaultTheme

在这里插入图片描述
_kDefaultTheme 的 barBackgroundColor默认为半透明色。

3.4 结论

该现象为Flutter的一个特性。
CupertinoPageScaffold 的 navigationBar 背景如果是半透明的,主要内容可能会滑到navigationBar 后面,而CupertinoApp默认的 navigationBar 背景色就是为半透明色,所以默认情况下顶部导航栏会与其它Widget重叠。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值