Flutter, biri solda, diğeri sağda olmak üzere iki öğeyi uç noktalara hizalar


95

İki öğeyi biri solda, diğeri sağda olacak şekilde hizalamaya çalışıyorum. Sola hizalanmış bir satırım var ve sonra bu satırın bir çocuğu sağa hizalanmış. Ancak, alt satır, üst satırdan hizalama özelliğini alıyor gibi görünüyor. Bu benim kodum

var SettingsRow = new Row(
            mainAxisAlignment: MainAxisAlignment.end,
            crossAxisAlignment: CrossAxisAlignment.center,
            mainAxisSize: MainAxisSize.max,
            children: <Widget>[
                Text("Right",softWrap: true,),
            ],
        );

        var nameRow = new Row(
            mainAxisAlignment: MainAxisAlignment.start,
            crossAxisAlignment: CrossAxisAlignment.center,
            mainAxisSize: MainAxisSize.max,
            children: <Widget>[
                Text("Left"),
                SettingsRow,
            ],
        );

sonuç olarak böyle bir şey elde ediyorum

Left Right

Ne isterdim

Left      Right

Ayrıca Satırda yeterli alan var. Sorum şu, Row çocuk MainAxisAlignment.endmülkünü neden sergilemiyor ?

Yanıtlar:


195

RowBunun yerine bir single kullanın mainAxisAlignment: MainAxisAlignment.spaceBetween.

new Row(
  mainAxisAlignment: MainAxisAlignment.spaceBetween,
  children: [
    new Text("left"),
    new Text("right")
  ]
);

Ya da kullanabilirsin Expanded

new Row(
  children: [
    new Text("left"),
    new Expanded(
      child: settingsRow,
    ),
  ],
);

2
2. örnekte settingsRow, şunu içeren onunkini kullanıyorumText("right")
Rémi Rousselet

Anlıyorum. Bu bölümü
kaçırdık

Teşekkürler. Ama meraktan kodum neden çalışmıyor? mainAxisAlignmentÇocuğun oluşmaz. Ebeveynlerin mülkleri çocuklarınkini geride mi bırakıyor?
MistyD

1
İkincisi çok daha iyi.
Raghu Mudem

1
@KPradeepKumarReddy Bu iki parçacığın boyutları çok büyükse birbiriyle çakışabileceğinden korkmuyorsanız, Stack'i ve ardından Align widget'larına sarılmış iki çocuğu (biri Alignment.center, diğeri Alignment.centerRight ile) kullanmanızı öneririm. Veya, flex ile satırınızda üç Genişletilmiş widget bulundurun: 1. Birincisi boş (SizedBox), ikincisi - ortalanmış widget'ınız (Ortaya sarılmış) ve üçüncüsü sağa hizalı widget'ınızı içerir.
Alex Semeniuk

71

Basit bir çözüm Spacer(), iki widget arasında kullanmak olacaktır

Row(
  children: [
    Text("left"),
    Spacer(),
    Text("right")
  ]
);

Spacer () ne yapar? Arka arkaya, bir parçacığı ortada ve diğerini aşırı sağda tutmak istiyorum. Bu, spacer () kullanılarak mümkün müdür?
K Pradeep Kumar Reddy

51

Bunu pek çok şekilde yapabilirsiniz.

Kullanma mainAxisAlignment: MainAxisAlignment.spaceBetween

Row(
  mainAxisAlignment: MainAxisAlignment.spaceBetween,
  children: <Widget>[
    FlutterLogo(),
    FlutterLogo(),
  ],
);

Kullanma Spacer

Row(
  children: <Widget>[
    FlutterLogo(),
    Spacer(),
    FlutterLogo(),
  ],
);

Kullanma Expanded

Row(
  children: <Widget>[
    FlutterLogo(),
    Expanded(child: SizedBox()),
    FlutterLogo(),
  ],
);

Kullanma Flexible

Row(
  children: <Widget>[
    FlutterLogo(),
    Flexible(fit: FlexFit.tight, child: SizedBox()),
    FlutterLogo(),
  ],
);

Çıktı :

görüntü açıklamasını buraya girin


Merkezde bir widget, diğerinin aşırı sağda olmasını istiyorum. Bunu nasıl başarabiliriz?
K Pradeep Kumar Reddy

@KPradeepKumarReddy StackBu durumda kullanmak iyi bir yaklaşımdır .
CopsOnRoad

@KPradeepKumarReddy Eminim ki SO'da buna benzer bir soru olmalı, tek yapmanız gereken doğru anahtar kelimeyle arama yapmak. Buradaki kodu size yorumda gerçekten gösteremem, ancak fikir kullanmaktır Stack, ilk çocuğu Align(sağda) ve ikincisi a Centerveya basit olabilir Align.
CopsOnRoad

1

Evet CopsOnRoaddoğru, yığın aracılığıyla birini sağa ve diğerini ortaya hizalayabilirsiniz.

Stack(
    children: [
      Align(
        alignment: Alignment.centerRight,
        child: Text("right"),
      ),
      Align(
        alignment: Alignment.center,
        child: Text("center"),
      )
    ],
  )
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.