Flutter 如何在颤振中使用堆栈、行和类似元素独立定位元素
我一直在尝试使用Stack、Posited、Row和类似的相关小部件在Flatter中复制这两个设计,但是,我一次又一次地陷入相同的阶段。我要么无法将文本居中,要么无法正确定位“后退”按钮。此外,我尽量不使用固定大小/位置,因为这在一定程度上可以适应不同的屏幕大小。 有人能告诉我正确的方向,如何创建这个或类似的布局,这些布局将在其他屏幕中重用吗 例1: 例2:Flutter 如何在颤振中使用堆栈、行和类似元素独立定位元素,flutter,widget,css-position,positioning,Flutter,Widget,Css Position,Positioning,我一直在尝试使用Stack、Posited、Row和类似的相关小部件在Flatter中复制这两个设计,但是,我一次又一次地陷入相同的阶段。我要么无法将文本居中,要么无法正确定位“后退”按钮。此外,我尽量不使用固定大小/位置,因为这在一定程度上可以适应不同的屏幕大小。 有人能告诉我正确的方向,如何创建这个或类似的布局,这些布局将在其他屏幕中重用吗 例1: 例2: 对于您的第1个示例,我提供了以下解决方案: class DetailScreen extends StatefulWidget {
对于您的第1个示例,我提供了以下解决方案:
class DetailScreen extends StatefulWidget {
@override
_DetailScreenState createState() => _DetailScreenState();
}
class _DetailScreenState extends State<DetailScreen> {
@override
Widget build(BuildContext context) {
return Material(
color: Colors.white,
child: SafeArea(
child: Stack(
fit: StackFit.expand,
children: [
Container(
margin: const EdgeInsets.all(5),
decoration: BoxDecoration(
color: Color(0xFF0B2746),
borderRadius: BorderRadius.circular(15),
),
child: Container(
margin: const EdgeInsets.all(8),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Padding(
padding: const EdgeInsets.symmetric(vertical: 18),
child: Text(
'Glossary',
style: TextStyle(
fontWeight: FontWeight.w800,
fontSize: 20,
),
),
)
],
),
),
),
Padding(
padding: const EdgeInsets.only(top: 20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Card(
margin: const EdgeInsets.only(left: 0),
child: Padding(
padding: const EdgeInsets.all(12),
child: Icon(Icons.arrow_back_ios),
),
elevation: 6,
),
],
),
)
],
),
),
);
}
}
class DetailScreen扩展了StatefulWidget{
@凌驾
_DetailScreenState createState()=>\u DetailScreenState();
}
类_DetailScreenState扩展状态{
@凌驾
小部件构建(构建上下文){
退货(
颜色:颜色,白色,
儿童:安全区(
子:堆栈(
fit:StackFit.expand,
儿童:[
容器(
边距:常数边集所有(5),
装饰:盒子装饰(
颜色:颜色(0xFF0B2746),
边界半径:边界半径。圆形(15),
),
子:容器(
边距:常数边集全部(8),
装饰:盒子装饰(
颜色:颜色,白色,
边界半径:边界半径。圆形(10),
),
子:列(
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
填充物(
填充:常量边集。对称(垂直:18),
子:文本(
“词汇表”,
样式:TextStyle(
fontWeight:fontWeight.w800,
尺寸:20,
),
),
)
],
),
),
),
填充物(
填充:仅限常量边集(顶部:20),
子:列(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
卡片(
边距:仅限常量边集(左:0),
孩子:填充(
填充:常量边集。全部(12),
子:图标(图标、箭头、背面),
),
标高:6,
),
],
),
)
],
),
),
);
}
}
结果如下:
对于第二个示例,我必须添加额外的逻辑:
class DetailScreen extends StatefulWidget {
@override
_DetailScreenState createState() => _DetailScreenState();
}
class _DetailScreenState extends State<DetailScreen> {
@override
Widget build(BuildContext context) {
return Material(
color: Colors.white,
child: SafeArea(
child: Stack(
fit: StackFit.expand,
children: [
Container(
margin: const EdgeInsets.all(5),
decoration: BoxDecoration(
color: Color(0xFF0B2746),
borderRadius: BorderRadius.circular(15),
),
child: Column(
children: [
Container(
height: 64.0,
width: double.infinity,
margin: const EdgeInsets.only(left: 54, right: 8, top: 8),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10),
),
child: Row(
children: <Widget>[
SizedBox(width: 20),
Icon(Icons.train, size: 35),
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 18),
child: Text(
'Metro',
textAlign: TextAlign.center,
style: TextStyle(
fontWeight: FontWeight.w800,
fontSize: 20,
),
),
),
),
Icon(Icons.arrow_drop_down, size: 35),
SizedBox(width: 20),
],
),
),
Expanded(
child: Container(
margin: const EdgeInsets.all(8),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10),
)),
)
],
),
),
Padding(
padding: const EdgeInsets.only(top: 20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Card(
margin: const EdgeInsets.only(left: 0),
child: Padding(
padding: const EdgeInsets.all(12),
child: Icon(Icons.arrow_back_ios),
),
elevation: 6,
),
],
),
)
],
),
),
);
}
}
class DetailScreen扩展了StatefulWidget{
@凌驾
_DetailScreenState createState()=>\u DetailScreenState();
}
类_DetailScreenState扩展状态{
@凌驾
小部件构建(构建上下文){
退货(
颜色:颜色,白色,
儿童:安全区(
子:堆栈(
fit:StackFit.expand,
儿童:[
容器(
边距:常数边集所有(5),
装饰:盒子装饰(
颜色:颜色(0xFF0B2746),
边界半径:边界半径。圆形(15),
),
子:列(
儿童:[
容器(
身高:64.0,
宽度:double.infinity,
边距:仅限常量边集(左:54,右:8,顶:8),
装饰:盒子装饰(
颜色:颜色,白色,
边界半径:边界半径。圆形(10),
),
孩子:排(
儿童:[
尺寸箱(宽度:20),
图标(Icons.train,尺寸:35),
扩大(
孩子:填充(
填充:常量边集。对称(垂直:18),
子:文本(
“地铁”,
textAlign:textAlign.center,
样式:TextStyle(
fontWeight:fontWeight.w800,
尺寸:20,
),
),
),
),
图标(图标。箭头下拉,尺寸:35),
尺寸箱(宽度:20),
],
),
),
扩大(
子:容器(
边距:常数边集全部(8),
装饰:盒子装饰(
颜色:颜色,白色,
边界半径:边界半径。圆形(10),
)),
)
],
),
),
填充物(
填充:仅限常量边集(顶部:20),
子:列(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
卡片(
边距:仅限常量边集(左:0),
孩子:填充(
填充:常量边集。全部(12),
子:图标(图标、箭头、背面),
),
标高:6,
),
],
),
)
],
),
),
);
}
}
结果如下:
对于您的第1个示例,我提供了以下解决方案:
class DetailScreen extends StatefulWidget {
@override
_DetailScreenState createState() => _DetailScreenState();
}
class _DetailScreenState extends State<DetailScreen> {
@override
Widget build(BuildContext context) {
return Material(
color: Colors.white,
child: SafeArea(
child: Stack(
fit: StackFit.expand,
children: [
Container(
margin: const EdgeInsets.all(5),
decoration: BoxDecoration(
color: Color(0xFF0B2746),
borderRadius: BorderRadius.circular(15),
),
child: Container(
margin: const EdgeInsets.all(8),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Padding(
padding: const EdgeInsets.symmetric(vertical: 18),
child: Text(
'Glossary',
style: TextStyle(
fontWeight: FontWeight.w800,
fontSize: 20,
),
),
)
],
),
),
),
Padding(
padding: const EdgeInsets.only(top: 20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Card(
margin: const EdgeInsets.only(left: 0),
child: Padding(
padding: const EdgeInsets.all(12),
child: Icon(Icons.arrow_back_ios),
),
elevation: 6,
),
],
),
)
],
),
),
);
}
}
class DetailScreen扩展了StatefulWidget{
@凌驾
_DetailScreenState createState()=>\u详细信息