Я пытаюсь создать ListView, где плитки выглядят так:
Однако я столкнулся с некоторыми проблемами здесь.
Таким образом, элемент макета
@override
Widget build(BuildContext context) {
return new GestureDetector(
onTap: _onTap,
child: new Card(
elevation: 1.0,
color: Colors.white,
margin: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 15.0),
child: new Container(
child: new Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
new Container(
margin: const EdgeInsets.only(right: 15.0),
width: 100.0,
height: 130.0,
padding: const EdgeInsets.symmetric(
vertical: 10.0, horizontal: 5.0),
decoration: new BoxDecoration(
shape: BoxShape.rectangle,
image: new DecorationImage(
fit: BoxFit.cover,
image: new NetworkImage(
"https://image.tmdb.org/t/p/w500" +
widget.movie.posterPath
)
)
),
),
new Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
new Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
new Expanded(
flex: 0,
child: new Container(
margin: const EdgeInsets.only(
top: 12.0, bottom: 10.0),
child: new Text(widget.movie.title,
style: new TextStyle(
fontSize: 18.0,
color: Colors.black,
fontWeight: FontWeight.bold,
),
),
),
),
new Expanded(
flex: 0,
child: new Text(
widget.movie.voteAverage.toString(),
style: new TextStyle(
fontSize: 16.0,
fontWeight: FontWeight.bold,
color: Colors.grey[600]
),
),
),
],
),
new Container(
child: new Text(widget.movie.overview,
softWrap: true,
overflow: TextOverflow.ellipsis,
maxLines: 3,
),
),
new Container(
margin: const EdgeInsets.only(top: 5.0),
child: new Row(
children: <Widget>[
new Text("Released"),
new Container(
margin: const EdgeInsets.only(left: 5.0),
child: new Text(widget.movie.releaseDate)
),
],
),
),
new Container(
margin: const EdgeInsets.only(top: 5.0),
child: new Row(
children: <Widget>[
new Text("Rating"),
new Container(
margin: const EdgeInsets.only(left: 5.0),
child: new Text(widget.movie.voteAverage.toString())
),
],
),
),
],
)
],
),
),
),
);
}
Иерархия макетов, как вы можете видеть на изображении выше,
Строка -> Изображение, Колонка -> (Строка -> (Заголовок, Рейтинг)), Описание, Текст,
Текст
Первый выпуск
Первая проблема заключается в том, что я не могу выровнять рейтинг вправо в строке «Название, рейтинг». Поэтому я хочу, чтобы заголовок был выровнен по левому краю, а рейтинг - по правому краю. Для этого я попытался дать гибкую оценку обоим виджетам, но как только я это сделаю, оба исчезнут. Единственный способ, которым я могу придумать, - это присвоить Title ширину, но это очень хакерский способ, и он сломается на большинстве устройств.
Второй выпуск
Я хочу, чтобы Описание вписывалось в рамки Карты. Однако, если я не определю конкретную ширину для контейнера для описания, я не смогу ограничить ее в пределах экрана. Я попытался заключить его в Expanded, Flex и Flexible с различными значениями flex, но безуспешно. Я попытался использовать свойство softWrap текстового виджета, но опять не повезло. Как только я заверну текст в любой из этих виджетов, он исчезнет. В приведенном выше коде я обернул текст в контейнер, и установить его ширину. Это работает, но, опять же, это очень хакерски, и будет выглядеть по-разному на разных устройствах, плюс сломается на некоторых.
Будет полезна любая помощь по этим вопросам.