Итак, я вижу два пути решения этой проблемы, в зависимости от вашей конечной цели. Я думаю, что первое, вероятно, то, что вы действительно хотите.
1) Используйте виджет Row
и Expanded
для каждой части флага, с flex
, равным единице. AspectRatio
сохранит соотношение сторон фиксированным, поэтому пропорции должны оставаться одинаковыми для контейнеров. Так как по умолчанию коэффициент гибкости равен единице, вы также можете просто пропустить это. Если вам нужно, чтобы белые части были прозрачными, просто укажите цвет Colors.transparent
.
class Flag extends StatelessWidget {
@override
Widget build(BuildContext context) {
var scaleFactor = 1.0;
final flag = Transform.scale(
scale: scaleFactor,
child: AspectRatio(
aspectRatio: 5 / 3,
child: Container(
decoration: BoxDecoration(
border: Border.all(width: 2, color: Colors.black),
),
child: Row(
children: <Widget>[
Expanded(
flex:1,
child: Container(
color: Colors.white,
),
),
Expanded(
flex:1,
child: Container(
color: Colors.purple,
),
),
Expanded(
flex:1,
child: Container(
color: Colors.white,
),
),
],
),
),
),
);
return LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) => flag,
);
}
}
2) Вы можете просто масштабировать содержимое центра с помощью виджета Transform
, но это будетраздавить любой контент, который вы положили в него, так что это, вероятно, не то, что вы хотите.
class Flag extends StatelessWidget {
@override
Widget build(BuildContext context) {
var scaleFactor = 1.0;
final flag = Transform.scale(
scale: scaleFactor,
child: AspectRatio(
aspectRatio: 5 / 3,
child: Container(
decoration: BoxDecoration(
border: Border.all(width: 2, color: Colors.black),
),
child: Center(
child: Transform(
transform: Matrix4.diagonal3Values(0.33, 1.0, 1.0),
alignment: Alignment.bottomCenter,
child: Container(
color: Colors.purple,
),
),
),
),
),
);
return LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) => flag,
);
}
}