#flutter #flutter-layout
#flutter #flutter-layout
Вопрос:
По какой-то причине я хочу использовать stack, и все мои виджеты должны быть центрированы. Это нормально, когда я использую один позиционированный и один выровненный. Однако использование второго виджета выравнивания не помещается под первым текстом.
Widget _body() {
return Stack(
children: <Widget>[
Positioned(
left: 0,
child: Text("Text here"),
),
Align(
child: Text(
"First Centered Text",
style: TextStyle(color: Colors.black87, fontSize: 30),
),
),
Align(
child: Text(
"Second Centered Text",
style: TextStyle(color: Colors.black87, fontSize: 30),
),
),
],
);
}
Я хочу получить это
описание введите изображение здесь
Комментарии:
1. Будет
Positioned
работать для вас или вы хотите использовать толькоAlign
?2. У меня все работает, я не хочу, чтобы оно было записано с фиксированными значениями пикселей.
3. Я думаю, что вам лучше использовать
Align
, и вы должны указать там фиксированное значение, однако, если вам не нравится фиксированный подход, лучший способ — использоватьColumn
.4. Если я использую столбец, я не могу использовать анимацию sizedTransition.
5. Можете ли вы предоставить мне весь экран, который вы хотите реализовать, я сделаю все возможное, чтобы предоставить вам наилучшее возможное решение.
Ответ №1:
Widget _buildBody() {
return Stack(
alignment: Alignment.center,
children: <Widget>[
Align(
alignment: Alignment(0, -0.95),
child: Image.asset('assets/images/profile.jpg', width: 200, height: 200, fit: BoxFit.cover,),
),
Align(
alignment: Alignment(0, -0.35),
child: Text("Centered Text"),
),
Align(
alignment: Alignment(0, -0.1),
child: Text("Second centered text"),
),
Align(
alignment: Alignment(0, 0.1),
child: CircularProgressIndicator(),
)
],
);
}
Комментарии:
1. Да, это то, что я хочу. Однако мне нужно подумать о размере изображения прямо сейчас 🙂 Он должен автоматически вычислять долю в зависимости от размера изображения. Использование статических жестко закодированных значений может вызвать проблемы.
2. Вы используете изображения из ресурсов, поэтому я думаю, что это не будет проблемой для жесткого кода, если бы вы использовали
Image.network()
, тогда хитрость заключалась бы в использованииLayoutBuilder
then. Однако вы должны быть готовы использовать жестко закодированное значение.
Ответ №2:
Если вы хотите использовать Align
вот что вам нужно.
Widget _body() {
return Stack(
alignment: Alignment.center,
children: <Widget>[
Positioned(
top: 0,
left: 0,
child: Text("Text here"),
),
Align(
child: Text(
"Centered Text",
style: TextStyle(color: Colors.black87, fontSize: 30),
),
),
Align(
alignment: Alignment(0.0, 0.1), // change this value to place it below the 1st centered widget
child: Text(
"Second Centered Text",
style: TextStyle(color: Colors.black87, fontSize: 30),
),
),
],
);
}