问题描述
我试图理解Flutter中的 SafeArea 小部件. /p>将
SafeArea代码添加到Flutter Gallery应用程序此处并在github中显示top:false
和bottom:false
到处都是.为什么在这些情况下需要将它们设置为假?
SafeArea
基本上是美化的Padding
小部件.如果用SafeArea
包装另一个小部件,它将添加所需的必要填充,以防止小部件被制造商的系统状态栏,凹口,孔,圆角和其他创意"功能所阻塞.
以下是未设置SafeArea
的示例:
Align(
alignment: Alignment.topLeft, // and bottomLeft
child: Text('My Widget: ...'),
)
再次将小部件包裹在SafeArea小部件中:
Align(
alignment: Alignment.topLeft, // and bottomLeft
child: SafeArea(
child: Text('My Widget: ...'),
),
)
您可以为不受缺口等影响的边缘设置最小填充:
SafeArea(
minimum: const EdgeInsets.all(16.0),
child: Text('My Widget: ...'),
)
您还可以关闭任意一侧的安全区域插图:
SafeArea(
left: false,
top: false,
right: false,
bottom: false,
child: Text('My Widget: ...'),
)
将它们全部设置为false与不使用SafeArea相同.所有面的默认值为true
.大多数情况下,您将不需要使用这些设置,但是我可以想象这样一种情况:您有一个可以填充整个屏幕的小部件.您希望顶部不受任何阻碍,但您不关心底部.因此,您只需设置bottom: false
,而将另一侧保留为默认的true
值.
SafeArea(
bottom: false,
child: myWidgetThatFillsTheScreen,
)
补充代码
如果您想更多地玩这个游戏,这里是 main.dart :
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: BodyWidget(),
),
);
}
}
class BodyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Align(
alignment: Alignment.topLeft,
child: SafeArea(
left: true,
top: true,
right: true,
bottom: true,
minimum: const EdgeInsets.all(16.0),
child: Text(
'My Widget: This is my widget. It has some content that I don\'t want '
'blocked by certain manufacturers who add notches, holes, and round corners.'),
),
);
}
}
I am trying to understand the SafeArea widget in Flutter.
SafeArea code added to Flutter Gallery app here in github show top:false
and bottom:false
everywhere. Why do these need to be set false in these cases?
SafeArea
is basically a glorified Padding
widget. If you wrap another widget with SafeArea
, it adds any necessary padding needed to keep your widget from being blocked by the system status bar, notches, holes, rounded corners and other "creative" features by manufactures.
Here is an example without SafeArea
set:
Align(
alignment: Alignment.topLeft, // and bottomLeft
child: Text('My Widget: ...'),
)
And again with the widget wrapped in a SafeArea widget:
Align(
alignment: Alignment.topLeft, // and bottomLeft
child: SafeArea(
child: Text('My Widget: ...'),
),
)
You can set a minimum padding for edges not affected by notches and such:
SafeArea(
minimum: const EdgeInsets.all(16.0),
child: Text('My Widget: ...'),
)
You can also turn off the safe area insets for any side:
SafeArea(
left: false,
top: false,
right: false,
bottom: false,
child: Text('My Widget: ...'),
)
Setting them all to false would be the same as not using SafeArea. The default for all sides is true
. Most of the time you will not need to use these settings, but I can imagine a situation where you have a widget that fills the whole screen. You want the top to not be blocked by anything, but you don't care about the bottom. In that cause you would just set bottom: false
but leave the other sides to their default true
values.
SafeArea(
bottom: false,
child: myWidgetThatFillsTheScreen,
)
Supplemental code
In case you want to play around more with this, here is main.dart:
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: BodyWidget(),
),
);
}
}
class BodyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Align(
alignment: Alignment.topLeft,
child: SafeArea(
left: true,
top: true,
right: true,
bottom: true,
minimum: const EdgeInsets.all(16.0),
child: Text(
'My Widget: This is my widget. It has some content that I don\'t want '
'blocked by certain manufacturers who add notches, holes, and round corners.'),
),
);
}
}
这篇关于在Flutter中使用SafeArea的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!