ช่องว่างระหว่างลูก ๆ ของคอลัมน์ใน Flutter


117

ฉันมีColumnวิดเจ็ตสองอันTextFieldวิดเจ็ตเป็นลูก ๆ และฉันต้องการให้มีช่องว่างระหว่างทั้งสองอย่าง

ฉันพยายามแล้วmainAxisAlignment: MainAxisAlignment.spaceAroundแต่ผลลัพธ์ไม่เป็นอย่างที่ฉันต้องการ


3
เพียงแค่ใส่ SizedBox (ความสูง: 15.0,) ระหว่างสอง TextField
anmol.majhail

margin: EdgeInsets.only(left: 200.0, top: 300.0))
user7856586

คำตอบ:


145

คุณสามารถใช้Paddingวิดเจ็ตระหว่างสองวิดเจ็ตนั้นหรือรวมวิดเจ็ตเหล่านั้นด้วยPaddingวิดเจ็ต

อัปเดต

วิดเจ็ต SizedBoxสามารถใช้ระหว่างสองวิดเจ็ตเพื่อเพิ่มช่องว่างระหว่างสองวิดเจ็ตและทำให้โค้ดอ่านได้ง่ายกว่าวิดเจ็ตช่องว่าง

เช่น:

Column(
  children: <Widget>[
    Widget1(),
    SizedBox(height: 10),
    Widget2(),
  ],
),

10
ฉันหวังว่าcolumn-class จะมีคุณสมบัตินั้นรวมอยู่ด้วย จะเป็นการเสียเวลาในการเขียนโค้ดสำหรับการเพิ่มช่องว่างระหว่างเด็กทั้งหมด
Haroun Hajem

คุณจะรวมวิดเจ็ตสองวิดเจ็ตในวิดเจ็ต Padding ได้อย่างไรเมื่อวิดเจ็ตการขยายใช้เพียงพารามิเตอร์ลูกเดียว
ScottF

@ScottF คำตอบบอกว่าPaddingวิดเจ็ตอยู่ระหว่าง 2 วิดเจ็ต มันไม่ได้ว่าเครื่องมือ 2 Paddingกลายเป็นเด็ก
marcusljx

2
ตรงขึ้นว่า "หรือปิดวิดเจ็ตเหล่านั้นด้วยวิดเจ็ต Padding" ....
ScottF

@ScottF ทำให้เด็กเป็นคอลัมน์หรือแถวที่มีสองวิดเจ็ตเป็นลูก
Riley Fitzpatrick

143

คุณสามารถใส่SizedBoxเฉพาะheightระหว่างวิดเจ็ตได้ดังนี้:

Column(
  children: <Widget>[
    FirstWidget(),
    SizedBox(height: 100),
    SecondWidget(),
  ],
),

ทำไมถึงชอบสิ่งนี้มากกว่าการรวมวิดเจ็ตไว้ด้วยPadding? ค่าอ่าน! มีเอกสารสำเร็จรูปที่มองเห็นได้น้อยกว่ามีการเยื้องน้อยลงและรหัสเป็นไปตามลำดับการอ่านทั่วไป


การเพิ่มช่องขนาดก็เหมือนกับการเพิ่มมุมมองที่ว่างเปล่าใช่ไหม จะไม่นำไปสู่ปัญหาใด ๆ ?
user5381191

SizedBoxเป็นเพียงวิดเจ็ตปกติที่มีขนาดที่ต้องการซึ่งพยายามให้เป็นระหว่างเลย์เอาต์ แต่ไม่แสดงผลอะไรเลย วิดเจ็ตลีฟทั้งหมดเช่นข้อความหรือคอนเทนเนอร์ว่างเปล่าดังนั้นจึงไม่เป็นไร
Marcel

52

คุณสามารถใช้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')
  ]
)

1
ใช้runSpacingแทนspacingช่องว่างระหว่างรายการที่มีระยะห่างในแนวตั้ง
Arpit

สิ่งนี้ใช้ได้ผลกับฉัน ฉันคิดว่ามันเป็นทางออกที่ดีที่สุด แต่อะไรคือความไม่พอใจของการใช้ Wrap () แทน Column ()
Lima Chaves

1
คอลัมน์เป็นวิดเจ็ตที่ขยายในขณะที่ไม่ได้ Wrap ดังนั้นเมื่อคุณต้องการขยายพื้นที่ทั้งหมดของพาเรนต์คุณควรใช้วิดเจ็ตแบบขยายเช่น Column หรือ Row เป็นต้นซึ่งขึ้นอยู่กับกรณีของคุณ
Mahdi Tohidloo

ใช่ดีกว่าการห่อเด็กแต่ละคนทีละคน ข้อเสนอแนะที่ดี
kevinH

31

เพียงใช้แผ่นรองเพื่อห่อหุ้มไว้ดังนี้:

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 สำหรับรายการเช่น


มีวิธีทำ css grid-gap ไหม
Aseem

17

มีหลายวิธีในการดำเนินการฉันมีรายชื่ออยู่ที่นี่

  1. ใช้Containerและให้ความสูง:

    Column(
      children: <Widget>[
        Widget1(),
        Container(height: 10), // set height
        Widget2(),
      ],
    )
    
  2. ใช้ Spacer

    Column(
      children: <Widget>[
        Widget1(),
        Spacer(), // use Spacer
        Widget2(),
      ],
    )
    
  3. ใช้ Expanded

    Column(
      children: <Widget>[
        Widget1(),
        Expanded(child: SizedBox()), // use Expanded
        Widget2(),
      ],
    )
    
  4. ใช้ mainAxisAlignment

    Column(
      mainAxisAlignment: MainAxisAlignment.spaceAround, // mainAxisAlignment
      children: <Widget>[
        Widget1(),
        Widget2(),
      ],
    )
    
  5. ใช้ Wrap

    Wrap(
      direction: Axis.vertical, // make sure to set this
      spacing: 20, // set your spacing
      children: <Widget>[
        Widget1(),
        Widget2(),
      ],
    )
    

8
Column(
  children: <Widget>[
    FirstWidget(),
    Spacer(),
    SecondWidget(),
  ]
)

Spacer สร้างพื้นที่ที่ยืดหยุ่นเพื่อแทรกลงในวิดเจ็ต [Flexible] (เหมือนคอลัมน์)


5
โปรดเพิ่มคำอธิบายในคำตอบของคุณเพื่อช่วยให้ผู้อื่นเข้าใจได้ดีขึ้น คำตอบของโค้ดเท่านั้นที่ถือว่าไม่สุภาพและอาจไม่ช่วยให้ OP เข้าใจปัญหาที่คุณพยายามช่วยเหลือ
Michael

6

วิธีเดียวกับที่ใช้ SizedBox ข้างต้นเพื่อจุดประสงค์ในการอ่านโค้ดคุณสามารถใช้วิดเจ็ต Padding ในลักษณะเดียวกันและไม่จำเป็นต้องทำให้เป็นวิดเจ็ตหลักสำหรับลูก ๆ ของคอลัมน์

Column(
  children: <Widget>[
    FirstWidget(),
    Padding(padding: EdgeInsets.only(top: 40.0)),
    SecondWidget(),
  ]
)

2

คุณสามารถแก้ปัญหานี้ได้หลายวิธี

หากคุณใช้Row / Columnคุณต้องใช้mainAxisAlignment: MainAxisAlignment.spaceEvenly

หากคุณใช้Wrap Widget คุณต้องใช้runSpacing: 5, ระยะห่าง: 10,

ในทุกที่ที่คุณสามารถใช้SizeBox ()


1

คอลัมน์ไม่มีความสูงตามค่าเริ่มต้นคุณสามารถรวมคอลัมน์ของคุณเข้ากับคอนเทนเนอร์และเพิ่มความสูงที่ต้องการให้กับคอนเทนเนอร์ของคุณ จากนั้นคุณสามารถใช้สิ่งต่อไปนี้:

Container(
   width: double.infinity,//Your desire Width
   height: height,//Your desire Height
   child: Column(
      mainAxisAlignment: MainAxisAlignment.spaceBetween,
      children: <Widget>[
         Text('One'),
         Text('Two')
      ],
   ),
),

1

มีคำตอบมากมายที่นี่ แต่ฉันจะให้คำตอบที่สำคัญที่สุดที่ทุกคนควรใช้

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
            ]
        )


0

คุณอาจต้องใช้วิดเจ็ต SizedBox () ระหว่างลูก ๆ ของคอลัมน์ของคุณ หวังว่าจะเป็นประโยชน์


หากคุณมีคำถามใหม่โปรดขอได้โดยคลิกที่ถามคำถามปุ่ม ใส่ลิงก์ไปยังคำถามนี้หากช่วยให้บริบท - จากรีวิว
Bruno

สิ่งนี้ไม่ได้ให้คำตอบสำหรับคำถาม เมื่อคุณมีเพียงพอชื่อเสียงคุณจะสามารถที่จะแสดงความคิดเห็นในโพสต์ใด ๆ ; แทนที่จะให้คำตอบที่ไม่จำเป็นต้องชี้แจงจากผู้ถาม - จากรีวิว
Ram Sharma

0

คุณยังสามารถใช้ฟังก์ชันตัวช่วยเพื่อเพิ่มระยะห่างหลังเด็กแต่ละคนได้

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'),
    ],
  ),
);

ฉันไม่แน่ใจว่ามันผิดหรือมีบทลงโทษในการดูแลเด็ก ๆ ผ่านฟังก์ชั่นตัวช่วยเพื่อเป้าหมายเดียวกันหรือไม่?


-1

กล่องขนาดจะไม่ช่วยในกรณีนี้โทรศัพท์อยู่ในโหมดแนวนอน

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),
            ),
          ),
        ),
      ],
     )
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.