没有 AppBar 的 Flutter 布局

Posted

技术标签:

【中文标题】没有 AppBar 的 Flutter 布局【英文标题】:Flutter layout without AppBar 【发布时间】:2018-03-29 10:57:24 【问题描述】:

我需要一个没有应用栏的布局,所以最明显的方法是在Scaffold 上省略appbar 标记,但如果我这样做,内容会像这样位于状态栏下方:

您可以看到我的蓝色容器从状态栏下方开始,这不应该是这种情况,所以我不得不手动设置容器的边距,这不是很好,这就是结果:

我感觉设备可能具有高度不同的状态栏,因此将我的上边距设置为固定大小可能无法在其他设备上正确呈现。有没有办法让颤振自动将我的内容定位在状态下方,就像它将AppBar 很好地定位在状态栏下方一样。

这是我的脚手架代码:

return new Scaffold(
      body: new Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: <Widget>[
          new HeaderLayout(),
        ],
      ),
    );

这是我的标题容器:

class HeaderLayout extends StatelessWidget
  @override
  Widget build(BuildContext context) 
    return new Container(
      color: Colors.blue,
      margin: const EdgeInsets.only(top: 30.0),
      child: new SizedBox(
        height: 80.0,
        child: new Center(
          child: new Text(
              "Recommended Courses",
              style: new TextStyle(color: Colors.white),
          ),
        ),
      )
    );
  


【问题讨论】:

使用可以使用小部件SafeArea。效果与:margin: MediaQuery.of(context).padding 【参考方案1】:

用 SafeArea 包裹您的列

  body: new SafeArea(
      child: new Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: <Widget>[
          new HeaderLayout(),
        ],
      )
  ) ,

SafeArea 是一个小部件,它通过足够的填充来插入其子元素,以避免操作系统的入侵。 例如,这将使子级缩进足以避开屏幕顶部的状态栏。

【讨论】:

【参考方案2】:

您可以使用MediaQuery 获取操作系统填充。

你必须更换你的

margin: const EdgeInsets.only(top: 30.0),

margin: MediaQuery.of(context).padding,

另一种解决方案是将您的内容包装在SafeArea 中。这基本上做同样的事情。

【讨论】:

谢谢你,我不得不改用填充,它工作。非常感谢【参考方案3】:
void main() 
  SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
    systemNavigationBarColor: Colors.blue, // navigation bar color
    statusBarColor: Colors.pink, // status bar color
  ));

【讨论】:

添加对此 sn-p 机制的评论。纯代码 sn-p 鼓励复制粘贴文化。

以上是关于没有 AppBar 的 Flutter 布局的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:主从布局中的自定义 Appbar、浮动操作按钮和 BottomSheet

Flutter 横向布局

Flutter:AppBar 背景图片

Flutter:如何仅在滚动后显示 AppBar?

appbar下如何滑动页面flutter

Flutter -- 基础组件AppBar 的使用