Flutter căn chỉnh hai mục ở các cực - một ở bên trái và một ở bên phải


96

Tôi đang cố gắng căn chỉnh hai mục ở hai cực, một ở bên trái và một ở bên phải. Tôi có một hàng được căn ở bên trái và sau đó một con của hàng đó được căn ở bên phải. Tuy nhiên, có vẻ như hàng con đang lấy thuộc tính căn chỉnh từ hàng mẹ của nó. Đây là mã của tôi

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

kết quả là tôi nhận được một cái gì đó như thế này

Left Right

Những gì tôi muốn là

Left      Right

Ngoài ra có đủ không gian trên Hàng. Câu hỏi của tôi là tại sao Row con không trưng bày MainAxisAlignment.endtài sản của nó ?

Câu trả lời:


197

Sử dụng một đơn Rowthay thế, với mainAxisAlignment: MainAxisAlignment.spaceBetween.

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

Hoặc bạn có thể sử dụng Expanded

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

2
Trong ví dụ thứ 2 tôi sử dụng của anh ấy settingsRow, có chứaText("right")
Rémi Rousselet,

Tôi hiểu rồi. Bỏ lỡ phần đó
Günter Zöchbauer

Cảm ơn. Nhưng vì tò mò tại sao mã của tôi không hoạt động? Của mainAxisAlignmentđứa trẻ không xảy ra. Tài sản của cha mẹ có vượt qua tài sản của con cái không?
MistyD

1
Thứ 2 là tốt hơn rất nhiều.
Raghu Mudem

1
@KPradeepKumarReddy Nếu bạn không sợ hai widget này có thể chồng lên nhau nếu kích thước của chúng quá lớn, tôi khuyên bạn nên sử dụng Stack và sau đó hai con được bọc trong Align widget (một với Alignment.center, một với Alignment.centerRight). Hoặc, có ba tiện ích con Mở rộng trong hàng của bạn với flex: 1. Thứ nhất sẽ chứa trống (SizedBox), thứ hai - tiện ích con được căn giữa của bạn (được bao bọc trong Trung tâm) và thứ ba chứa tiện ích con căn phải của bạn.
Alex Semeniuk

71

Một giải pháp đơn giản sẽ là sử dụng Spacer()giữa hai tiện ích con

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

Spacer () làm gì? Liên tiếp, tôi muốn giữ một tiện ích ở giữa và một tiện ích khác ở cực bên phải. Điều này có thể sử dụng đệm () không?
K Pradeep Kumar Reddy

51

Bạn có thể làm điều đó bằng nhiều cách.

Sử dụng mainAxisAlignment: MainAxisAlignment.spaceBetween

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

Sử dụng Spacer

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

Sử dụng Expanded

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

Sử dụng Flexible

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

Đầu ra :

nhập mô tả hình ảnh ở đây


Tôi muốn một widget ở giữa và một widget khác ở cực bên phải. Làm thế nào chúng ta có thể đạt được điều đó?
K Pradeep Kumar Reddy

@KPradeepKumarReddy Một cách tốt là sử dụng Stacktrong trường hợp đó.
CopsOnRoad

@KPradeepKumarReddy Tôi chắc chắn đã có một số câu hỏi như thế này trên SO, tất cả những gì bạn cần làm là tìm kiếm với từ khóa phù hợp. Tôi thực sự không thể cho bạn thấy mã ở đây trong nhận xét, nhưng ý tưởng là sử dụng Stack, với con đầu tiên là Align(phải) và thứ hai có thể là một Centerhoặc đơn giản Align.
CopsOnRoad

1

CopsOnRoadlà đúng, thông qua ngăn xếp, bạn có thể căn chỉnh một ở bên phải và khác ở giữa.

Stack(
    children: [
      Align(
        alignment: Alignment.centerRight,
        child: Text("right"),
      ),
      Align(
        alignment: Alignment.center,
        child: Text("center"),
      )
    ],
  )
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.