ฉันมีColumn
วิดเจ็ตสองอันTextField
วิดเจ็ตเป็นลูก ๆ และฉันต้องการให้มีช่องว่างระหว่างทั้งสองอย่าง
ฉันพยายามแล้วmainAxisAlignment: MainAxisAlignment.spaceAround
แต่ผลลัพธ์ไม่เป็นอย่างที่ฉันต้องการ
ฉันมีColumn
วิดเจ็ตสองอันTextField
วิดเจ็ตเป็นลูก ๆ และฉันต้องการให้มีช่องว่างระหว่างทั้งสองอย่าง
ฉันพยายามแล้วmainAxisAlignment: MainAxisAlignment.spaceAround
แต่ผลลัพธ์ไม่เป็นอย่างที่ฉันต้องการ
margin: EdgeInsets.only(left: 200.0, top: 300.0))
คำตอบ:
คุณสามารถใช้Padding
วิดเจ็ตระหว่างสองวิดเจ็ตนั้นหรือรวมวิดเจ็ตเหล่านั้นด้วยPadding
วิดเจ็ต
อัปเดต
วิดเจ็ต SizedBoxสามารถใช้ระหว่างสองวิดเจ็ตเพื่อเพิ่มช่องว่างระหว่างสองวิดเจ็ตและทำให้โค้ดอ่านได้ง่ายกว่าวิดเจ็ตช่องว่าง
เช่น:
Column(
children: <Widget>[
Widget1(),
SizedBox(height: 10),
Widget2(),
],
),
column
-class จะมีคุณสมบัตินั้นรวมอยู่ด้วย จะเป็นการเสียเวลาในการเขียนโค้ดสำหรับการเพิ่มช่องว่างระหว่างเด็กทั้งหมด
Padding
วิดเจ็ตอยู่ระหว่าง 2 วิดเจ็ต มันไม่ได้ว่าเครื่องมือ 2 Padding
กลายเป็นเด็ก
คุณสามารถใส่SizedBox
เฉพาะheight
ระหว่างวิดเจ็ตได้ดังนี้:
Column(
children: <Widget>[
FirstWidget(),
SizedBox(height: 100),
SecondWidget(),
],
),
ทำไมถึงชอบสิ่งนี้มากกว่าการรวมวิดเจ็ตไว้ด้วยPadding
? ค่าอ่าน! มีเอกสารสำเร็จรูปที่มองเห็นได้น้อยกว่ามีการเยื้องน้อยลงและรหัสเป็นไปตามลำดับการอ่านทั่วไป
SizedBox
เป็นเพียงวิดเจ็ตปกติที่มีขนาดที่ต้องการซึ่งพยายามให้เป็นระหว่างเลย์เอาต์ แต่ไม่แสดงผลอะไรเลย วิดเจ็ตลีฟทั้งหมดเช่นข้อความหรือคอนเทนเนอร์ว่างเปล่าดังนั้นจึงไม่เป็นไร
คุณสามารถใช้Wrap()
วิดเจ็ตแทนColumn()
เพื่อเพิ่มช่องว่างระหว่างลูกและใช้คุณสมบัติระยะห่างเพื่อให้ระยะห่างเท่ากันระหว่างเด็ก
Wrap(
spacing: 20, // to apply margin in the main axis of the wrap
runSpacing: 20, // to apply margin in the cross axis of the wrap
children: <Widget>[
Text('child 1'),
Text('child 2')
]
)
runSpacing
แทนspacing
ช่องว่างระหว่างรายการที่มีระยะห่างในแนวตั้ง
เพียงใช้แผ่นรองเพื่อห่อหุ้มไว้ดังนี้:
Column(
children: <Widget>[
Padding(
padding: EdgeInsets.all(8.0),
child: Text('Hello World!'),
),
Padding(
padding: EdgeInsets.all(8.0),
child: Text('Hello World2!'),
)
]);
คุณยังสามารถใช้ Container (padding ... ) หรือ SizeBox (height: xx) อันสุดท้ายเป็นสิ่งที่พบบ่อยที่สุด แต่จะแสดงถึงวิธีที่คุณต้องการจัดการพื้นที่ของวิดเจ็ตของคุณฉันชอบใช้ช่องว่างภายในหากพื้นที่นั้นเป็นส่วนหนึ่งของวิดเจ็ตจริง ๆ และใช้ sizebox สำหรับรายการเช่น
มีหลายวิธีในการดำเนินการฉันมีรายชื่ออยู่ที่นี่
ใช้Container
และให้ความสูง:
Column(
children: <Widget>[
Widget1(),
Container(height: 10), // set height
Widget2(),
],
)
ใช้ Spacer
Column(
children: <Widget>[
Widget1(),
Spacer(), // use Spacer
Widget2(),
],
)
ใช้ Expanded
Column(
children: <Widget>[
Widget1(),
Expanded(child: SizedBox()), // use Expanded
Widget2(),
],
)
ใช้ mainAxisAlignment
Column(
mainAxisAlignment: MainAxisAlignment.spaceAround, // mainAxisAlignment
children: <Widget>[
Widget1(),
Widget2(),
],
)
ใช้ Wrap
Wrap(
direction: Axis.vertical, // make sure to set this
spacing: 20, // set your spacing
children: <Widget>[
Widget1(),
Widget2(),
],
)
Column(
children: <Widget>[
FirstWidget(),
Spacer(),
SecondWidget(),
]
)
Spacer สร้างพื้นที่ที่ยืดหยุ่นเพื่อแทรกลงในวิดเจ็ต [Flexible] (เหมือนคอลัมน์)
วิธีเดียวกับที่ใช้ SizedBox ข้างต้นเพื่อจุดประสงค์ในการอ่านโค้ดคุณสามารถใช้วิดเจ็ต Padding ในลักษณะเดียวกันและไม่จำเป็นต้องทำให้เป็นวิดเจ็ตหลักสำหรับลูก ๆ ของคอลัมน์
Column(
children: <Widget>[
FirstWidget(),
Padding(padding: EdgeInsets.only(top: 40.0)),
SecondWidget(),
]
)
คุณสามารถแก้ปัญหานี้ได้หลายวิธี
หากคุณใช้Row / Columnคุณต้องใช้mainAxisAlignment: MainAxisAlignment.spaceEvenly
หากคุณใช้Wrap Widget คุณต้องใช้runSpacing: 5, ระยะห่าง: 10,
ในทุกที่ที่คุณสามารถใช้SizeBox ()
คอลัมน์ไม่มีความสูงตามค่าเริ่มต้นคุณสามารถรวมคอลัมน์ของคุณเข้ากับคอนเทนเนอร์และเพิ่มความสูงที่ต้องการให้กับคอนเทนเนอร์ของคุณ จากนั้นคุณสามารถใช้สิ่งต่อไปนี้:
Container(
width: double.infinity,//Your desire Width
height: height,//Your desire Height
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Text('One'),
Text('Two')
],
),
),
มีคำตอบมากมายที่นี่ แต่ฉันจะให้คำตอบที่สำคัญที่สุดที่ทุกคนควรใช้
1. คอลัมน์
Column(
children: <Widget>[
Text('Widget A'), //Can be any widget
SizedBox(height: 20,), //height is space betweeen your top and bottom widget
Text('Widget B'), //Can be any widget
],
),
2. ห่อ
Wrap(
direction: Axis.vertical, // We have to declare Axis.vertical, otherwise by default widget are drawn in horizontal order
spacing: 20, // Add spacing one time which is same for all other widgets in the children list
children: <Widget>[
Text('Widget A'), // Can be any widget
Text('Widget B'), // Can be any widget
]
)
Column(children: <Widget>[
Container(margin: EdgeInsets.only(top:12, child: yourWidget)),
Container(margin: EdgeInsets.only(top:12, child: yourWidget))
]);
คุณอาจต้องใช้วิดเจ็ต SizedBox () ระหว่างลูก ๆ ของคอลัมน์ของคุณ หวังว่าจะเป็นประโยชน์
คุณยังสามารถใช้ฟังก์ชันตัวช่วยเพื่อเพิ่มระยะห่างหลังเด็กแต่ละคนได้
List<Widget> childrenWithSpacing({
@required List<Widget> children,
double spacing = 8,
}) {
final space = Container(width: spacing, height: spacing);
return children.expand((widget) => [widget, space]).toList();
}
ดังนั้นรายการที่ส่งคืนอาจถูกใช้เป็นลูกของคอลัมน์
Column(
children: childrenWithSpacing(
spacing: 14,
children: [
Text('This becomes a text with an adjacent spacing'),
if (true == true) Text('Also, makes it easy to add conditional widgets'),
],
),
);
ฉันไม่แน่ใจว่ามันผิดหรือมีบทลงโทษในการดูแลเด็ก ๆ ผ่านฟังก์ชั่นตัวช่วยเพื่อเป้าหมายเดียวกันหรือไม่?
กล่องขนาดจะไม่ช่วยในกรณีนี้โทรศัพท์อยู่ในโหมดแนวนอน
body: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Expanded(
child: Container(
margin: EdgeInsets.all(15.0),
decoration: BoxDecoration(
color: Color(0xFF1D1E33),
borderRadius: BorderRadius.circular(10.0),
),
),
),
Expanded(
child: Container(
margin: EdgeInsets.all(15.0),
decoration: BoxDecoration(
color: Color(0xFF1D1E33),
borderRadius: BorderRadius.circular(10.0),
),
),
),
Expanded(
child: Container(
margin: EdgeInsets.all(15.0),
decoration: BoxDecoration(
color: Color(0xFF1D1E33),
borderRadius: BorderRadius.circular(10.0),
),
),
),
],
)