#flutter #flutter-layout
#flutter #flutter-макет
Вопрос:
Может кто-нибудь помочь мне получить этот макет с первым кругом поверх второго? изображение
У меня есть эта функция:
Widget overlapped() {
final overlap = 25;
final items = [
Container(
padding: EdgeInsets.only(right: 2),
decoration: new BoxDecoration(
color: Colors.blue,
shape: BoxShape.circle,
),
child: CircleAvatar(
radius: 22,
backgroundImage: AssetImage('assets/example_logo.png'),
backgroundColor: Colors.black,
),
),
CircleAvatar(
radius: 22,
backgroundColor: Colors.white,
child: ClipOval(
child: Image.network(
"https://upload.wikimedia.org/wikipedia/commons/thumb/5/53/Google_"G"_Logo.svg/1200px-Google_"G"_Logo.svg.png",
errorBuilder: (context, exception, stackTrace) {
return Container(color: Colors.white);
},
height: 35,
))),
CircleAvatar(
child: Text(' 2', style: TextStyle(color: Colors.white)),
backgroundColor: Theme.of(context).canvasColor),
];
List<Widget> stackLayers = List<Widget>.generate(items.length, (index) {
return Container(
padding: EdgeInsets.fromLTRB(index.toDouble() * overlap, 0, 0, 0),
child: items[index],
);
});
return Stack(children: stackLayers);
}
Эта функция всякий раз, когда я добавляю элемент в массив, он добавляет виджет справа. Но я хочу, чтобы первый был выше второго, второй третьего и т.д…
Ответ №1:
вы могли бы использовать виджет стека :
Stack(
children:<Widget>:[
Positioned(
right: 130.0,
child:Container(
shape: BoxShape.circle,
)
),
Positioned(
left: 130.0,
child:Container(
shape: BoxShape.circle,
)
),
]
)
Комментарии:
1. Ответ более или менее правильный, но левый виджет должен быть после правого в
children
массиве, чтобы он был нарисован «поверх» правого виджета. Стек рисует своего первого дочернего элемента, затем второго поверх этого, затем третьего поверх этого и т. Д.2. @nstosic, ты прав, я это пропустил, я отредактирую ответ.
3. @nstosic Нет ли способа изменить порядок в стеке? Я хочу, чтобы первый виджет в массиве был поверх второго, а второй поверх третьего.
4. Самым простым способом было бы изменить порядок в массиве. Последний
Stack
дочерний элемент всегда рисуется поверх первого. Вам нужно будет расширитьRenderStack
и переопределитьvoid paint(PaintingContext context, Offset offset)
, что довольно сложно сделать без побочных эффектов
Ответ №2:
Используйте Stack
и Positioned
вместе.
import 'package:flutter/material.dart';
class OverLap extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Overlap'),
),
body: Container(
padding: const EdgeInsets.all(8.0),
width: 500.0,
child: Stack(
children: <Widget>[
//Change according to your icon
Icon(
Icons.flaky,
size: 50.0,
color: Colors.red,
),
Positioned(
left: 20.0,
//Change according to your icon
child: Icon(
Icons.flaky,
size: 50.0,
color: Colors.blue,
),
),
],
),
),
);
}
}