Пользовательская форма виджета флаттера

Я пытаюсь создать во Flutter следующий макет.

Я хочу достичь двух вещей:

  • Рендеринг фона, который рисует диагональную сторону (я предполагаю через BoxDecoration)
  • Попросите розовый контейнер закрепить дочерние элементы вдоль диагональной стороны - то есть, если текст слишком велик для одной строки, он должен переноситься на новую строку.

Любые идеи?

Диагональная форма макета


person athor    schedule 04.04.2018    source источник


Ответы (2)


Вот мой код:

Stack(
  children: <Widget>[
    Pic(),
    Info(),
  ],
)

Для виджета Pic:

Container(
  decoration: BoxDecoration(
    image: DecorationImage(
      alignment: Alignment.centerRight,
      fit: BoxFit.fitHeight,
      image: NetworkImage(
          'https://media.sproutsocial.com/uploads/2014/02/Facebook-Campaign-Article-Main-Image2.png'),
    ),
  ),
)

Для информации о виджете:

ClipPath(
  clipper: TrapeziumClipper(),
  child: Container(
    color: Colors.white,
    padding: EdgeInsets.all(8.0),
    width: MediaQuery.of(context).size.width * 3/5,
    child: Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: <Widget>[
        ConstrainedBox(
          constraints: BoxConstraints(
            maxWidth: MediaQuery.of(context).size.width * 6/15
          ),
          child: Text(
            'Testing clipping with soft wrap',
            softWrap: true,
            style: Theme.of(context).textTheme.title,
          ),
        ),
      ],
    ),
  ),
)

Для TrapeziumClipper:

class TrapeziumClipper extends CustomClipper<Path> {
  @override
  Path getClip(Size size) {
    final path = Path();
    path.lineTo(size.width * 2/3, 0.0);
    path.lineTo(size.width, size.height);
    path.lineTo(0.0, size.height);
    path.close();
    return path;
  }
  @override
  bool shouldReclip(TrapeziumClipper oldClipper) => false;
}
person Philip Ch'ng    schedule 07.11.2018

Есть несколько способов сделать это. Можно было бы использовать CustomPainter, чтобы использовать его в качестве фона и нарисовать розовый + рисунок.

Другой способ - использовать стек, примерно так:

container (with pink background)
  -> stack
     -> picture, clipped
     -> text, etc

Вы бы разместили текст, как обычно, и вы бы выровняли изображение по правому краю и определите ClipPath, который обрезал его по своему усмотрению.

Чтобы обернуть текст, поместите его в ConstrainedBox или SizedBox и убедитесь, что он настроен на перенос (свойство softwrap, как мне кажется).

person rmtmckenzie    schedule 04.04.2018