Flutter自定义标题栏之处理状态栏高度

App在很多情况下由于各种需求需要自定义标题栏,而在能够构建Android和IOS应用的Flutter中,如果不在Scaffold中使用AppBar会发现默认是沉浸式。

猜想:我们使用自定义标题栏好像需要知道状态栏的高度,我看到网上很多人想要自定义标题栏,却老是去找怎么获取状态栏的高度

解惑:其实并不用获取状态栏的高度,你想AppBar也是状态栏,它也需要知道状态栏的高度,它需要说明Flutter已经帮我们获取到了

接下来一步一步来看

一、怎么自定义标题栏

轻车熟路的就直接看第二步

自定义MAppBar类

class MAppBar extends StatefulWidget implements PreferredSizeWidget {
  MAppBar({@required this.child}) : assert(child != null);
  final Widget child;
  @override
  Size get preferredSize {
    return new Size.fromHeight(56.0);
  }
  @override
  State createState() {
    return new MAppBarState();
  }
}
class MAppBarState extends State<MAppBar> {
  @override
  Widget build(BuildContext context) {
    return widget.child;
  }
}

使用

class GoodsPageState extends State<GoodsPage> {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new MAppBar(
        child: new Text("我是标题"),
      ),
      body: new Text("我是内容"),
    );
  }
}

效果

Flutter自定义标题栏之处理状态栏高度_第1张图片

二、增加状态栏

修改代码

class MAppBarState extends State<MAppBar> {
  @override
  Widget build(BuildContext context) {
    return new SafeArea(
      top: true,
      child: widget.child,
    );
  }
}

说明

/// Whether to avoid system intrusions at the top of the screen, typically the
/// system status bar.
final bool top;

效果

Flutter自定义标题栏之处理状态栏高度_第2张图片

效果已经很明显了

结论:通过SafeArea可以很容易的避免默认沉浸式,Flutter已经帮我们做了,多看源码学习Flutter组件

你可能感兴趣的:(Flutter)