有没有办法在 Flutter 中添加两种不同的颜色 Iphone x SafeArea

Is there are way to add two different color Iphone x SafeArea on Flutter

我想知道有什么方法可以在iPhone X SafeArea中添加两种不同的颜色?

React Native 上,可以通过添加两个 SafeAreaView 来解决此问题。有谁知道如何解决这个问题?

谢谢

  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.blue,
      child: SafeArea(
        left: true,
        top: true,
        right: true,
        bottom: true,
        child: Scaffold(
          resizeToAvoidBottomInset: false,
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  'You have pushed the button this many times:',
                ),
                Text(
                  '$_counter',
                  style: Theme.of(context).textTheme.display1,
                ),
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: _incrementCounter,
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ), 
        ),
      ),
    );
  }

你可以做一件简单的事情 => 将 SafeArea 的顶部 属性 标记为 false 这样 phone 的顶部区域将采用 AppBar 的背景颜色,底部 SafeArea 将采用 parent container 的颜色。理想情况下,我建议如果您将 scaffold 限制在 SafeArea 内,那么它的顶部 SafeArea 颜色应与 AppBar 背景颜色相同,底部 SafeArea 颜色应符合您的要求要求(parent容器的颜色)。

我用两种不同的颜色修改了你的代码:

Widget build(BuildContext context) {
    return Container(
      color: Colors.blue,
      child: SafeArea(
        top: false,        
        child: Scaffold(
          resizeToAvoidBottomInset: false,
          appBar: AppBar(
            backgroundColor: Colors.orange,
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  'You have pushed the button this many times:',
                ),
                Text(
                  '$_counter',
                  style: Theme.of(context).textTheme.display1,
                ),
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: _incrementCounter,
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ), 
        ),
      ),
    );
  }

选项 2: 如果您使用的是脚手架,那么您只需将 body 小部件绑定到其中即可解决您的问题。

在 SafeArea 小部件中,我们有一些元素,例如底部、顶部、...

如果设置 bottom = true,SafeArea 将包括底部。分别对top元素做。

要获取bottom/top区域的高度,可以通过这种方式到达MediaQuery.of(context).padding.bottom

要为 bottom/top 区域制作一些背景颜色,您可以添加一个具有上述高度的容器小部件。

所以,我找到了这个方法来做到这一点。您可以更改静态颜色,例如我就是这样做的。我不知道这是正确的方法,但它有效。我认为 @dhaval-kansara 的方法不是我想要的,因为状态栏是透明的并且在滚动时会溢出。我在发言中接受批评,因为我还是一个初学者,可能了解的不多。 (对不起我的英语)

    import 'package:flutter/material.dart';
    
    class ColoredSafeArea extends StatelessWidget {
      final Color topColor;
      final Color bottomColor;
      final Color color;
      final Widget child;
    
      const ColoredSafeArea(
          {Key key,
          this.topColor,
          this.bottomColor,
          this.color,
          @required this.child,})
          : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return ColoredBox(
          color: bottomColor ?? Colors.yellow, // bottombar color
          child: SafeArea(
            top: false,
            child: ColoredBox(
              color: topColor ?? Colors.blue, // statusbar color
              child: SafeArea(
                top: true,
                child: ColoredBox(
                  color: color ?? Colors.teal, // background color
                  child: child,
                ),
              ),
            ),
          ),
        );
      }
    }