Flutter'da Column'un çocukları arasındaki boşluk


109

Çocuk olarak Columniki widget içeren bir widget'ım var ve ikisi TextFieldarasında biraz boşluk olmasını istiyorum.

Zaten denedim mainAxisAlignment: MainAxisAlignment.spaceAroundama sonuç istediğim gibi değildi.


3
Simply Put SizedBox (yükseklik: 15.0,), İki TextField arasında
anmol.majhail

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

Yanıtlar:


135

PaddingWidget'ı bu iki widget arasında kullanabilir veya bu widget'ları widget ile sarmalayabilirsiniz Padding.

Güncelleme

SizedBox widget'ı, iki widget arasına boşluk eklemek için iki widget arasında kullanılabilir ve kodu dolgu widget'ından daha okunaklı hale getirir.

Ör:

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

7
Keşke o column-sınıfta o mülke sahip olsaydı. Tüm çocukların arasına bir dolgu malzemesi yerleştirmek kodlama zamanı kaybı olacaktır.
Haroun Hajem

Widget'ları doldururken yalnızca tek bir çocuk parametresi alırken, bir Dolgu widget'ındaki iki widget'ı nasıl sarabilirsiniz?
ScottF

@ScottF cevabı, Paddingwidget'ın 2 widget arasında yer aldığını söyledi . Bu 2 parçacığın alt öğesi haline gelmez Padding.
marcusljx

2
Doğrudan "veya bu widget'ları Dolgu widget'ıyla sarın" diyor ...
ScottF

@ScottF Alt öğeyi, iki pencere öğesiyle alt öğe olarak bir sütun veya satır yapın.
Riley Fitzpatrick

140

Widget'ların arasına SizedBoxbelirli bir karakter koyabilirsiniz height, örneğin:

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

Widget'ları içine almak yerine neden bunu tercih etmelisiniz Padding? Okunabilirlik! Daha az görsel ortak metin vardır, daha az girinti vardır ve kod tipik okuma sırasını izler.


Boyutlu bir kutu eklemek boş bir görünüm eklemek gibidir, değil mi? bu herhangi bir soruna yol açmaz mı?
user5381191

SizedBoxdüzen sırasında olmaya çalıştığı istenen boyuta sahip, ancak hiçbir şey oluşturmayan normal bir parçacıktır. Metin veya Kapsayıcı gibi tüm yaprak widget'ları da boş, bu yüzden sorun değil.
Marcel

50

Wrap()bunun yerine Column()alt widget'lar arasında boşluk eklemek için widget'ı kullanabilir ve çocuklar arasında eşit boşluk sağlamak için aralık özelliğini kullanabilirsiniz.

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
Dikey aralıklı eşyalar arasındaki boşluklar runSpacingyerine kullanınspacing
Arpit

Bu benim için çalıştı. Bence en iyi çözüm bu ama Column () yerine Wrap () kullanmanın dezavantajları neler olabilir?
Lima Chaves

1
Sütun, genişletilmiş bir widget iken, Sarma değildir. yani ebeveynin tüm alanını genişletmek istediğinizde, Sütun veya Satır gibi genişletilmiş widget'lar kullanmalısınız. Bu sizin durumunuza bağlıdır
Mahdi Tohidloo

Evet, bu, her çocuğu tek tek paketlemekten çok daha iyidir. İyi bir öneri.
kevinH

31

Bunu şu şekilde sarmak için dolgu kullanın:

Column(
  children: <Widget>[
  Padding(
    padding: EdgeInsets.all(8.0),
    child: Text('Hello World!'),
  ),
  Padding(
    padding: EdgeInsets.all(8.0),
    child: Text('Hello World2!'),
  )
]);

Ayrıca Container (padding ...) veya SizeBox (yükseklik: xx) kullanabilirsiniz. Sonuncusu en yaygın olanıdır, ancak widget'larınızın alanını nasıl yönetmek istediğinize bağlı olacaktır, eğer alan gerçekten de widget'ın bir parçasıysa padding kullanmayı ve örneğin listeler için sizebox'u kullanmayı seviyorum.


css grid-gap gibi bir şey yapmanın bir yolu var mı?
Aseem

15

Bunu yapmanın birçok yolu var, burada birkaçını listeliyorum.

  1. Kullanın Containerve biraz yükseklik verin:

    Column(
      children: <Widget>[
        Widget1(),
        Container(height: 10), // set height
        Widget2(),
      ],
    )
    
  2. Kullanım Spacer

    Column(
      children: <Widget>[
        Widget1(),
        Spacer(), // use Spacer
        Widget2(),
      ],
    )
    
  3. Kullanım Expanded

    Column(
      children: <Widget>[
        Widget1(),
        Expanded(child: SizedBox()), // use Expanded
        Widget2(),
      ],
    )
    
  4. Kullanım mainAxisAlignment

    Column(
      mainAxisAlignment: MainAxisAlignment.spaceAround, // mainAxisAlignment
      children: <Widget>[
        Widget1(),
        Widget2(),
      ],
    )
    
  5. Kullanım 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, [Esnek] widget'a eklemek için esnek bir alan oluşturur. (Bir sütun gibi)


5
Başkalarının onu daha iyi anlamasına yardımcı olmak için lütfen cevabınıza biraz açıklama ekleyin. Yalnızca kod yanıtları kaba kabul edilir ve bu, OP'nin yardım etmeye çalıştığınız sorunu anlamasına yardımcı olmayabilir.
Michael

7

SizedBox'ın yukarıda kod okunabilirliği amacıyla kullanıldığı gibi , Padding widget'ını da aynı şekilde kullanabilirsiniz ve onu herhangi bir Sütun alt öğesi için bir ana widget yapmak zorunda kalmazsınız

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

2

Bu sorunu farklı bir şekilde çözebilirsiniz.

Eğer kullanırsanız Satır / Sütun sonra kullanım zorunda mainAxisAlignment: MainAxisAlignment.spaceEvenly

Eğer kullanırsanız Wrap Widget kullanmak zorunda , 5 aralık: runSpacing 10,

SizeBox'ı her yerde kullanabilirsiniz ()


1

Sütunların varsayılan olarak yüksekliği yoktur, Sütununuzu Kapsayıcıya Sarabilir ve belirli yüksekliği Kapınıza ekleyebilirsiniz. O zaman aşağıdaki gibi bir şey kullanabilirsiniz:

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

1

Burada birçok cevap var ama herkesin kullanması gereken en önemli cevabı buraya koyacağım.

1. Sütun

 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. Sarın

     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
Column(children: <Widget>[
   Container(margin: EdgeInsets.only(top:12, child: yourWidget)),
   Container(margin: EdgeInsets.only(top:12, child: yourWidget))
]);

0

Sütununuzun alt öğeleri arasında SizedBox () widget'ı kullanmanız gerekebilir. Umarım faydalı olur


Yeni bir sorunuz varsa, lütfen Soru Sor butonuna tıklayarak sorunuz . Bağlam sağlamaya yardımcı oluyorsa bu soruya bir bağlantı ekleyin. - Yorumdan
Bruno

Bu soruya bir cevap vermiyor. Yeterli itibara sahip olduğunuzda , herhangi bir gönderi hakkında yorum yapabileceksiniz ; bunun yerine soruyu soranın açıklamasını gerektirmeyen yanıtlar verin . - Yorumdan
Ram Sharma

-1

Boyutlandırılmış kutu bu durumda yardımcı olmaz, telefon yatay modda.

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),
            ),
          ),
        ),
      ],
     )
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.