Как создать разделительный контейнер во флаттере? Каким должен быть правильный подход? CustomPainter или чип?

Хотел воспроизвести некоторый пользовательский интерфейс. Могу ли я сделать это со встроенными флаттер-виджетами? Я пытался использовать чип, но не смог. Будет ли CustomPainter правильным выбором?

Я думаю, что виджет CustomPainter - лучший вариант. потому что это настраиваемый виджет

George Rabbat 07.05.2022 00:40

и CustomPaint, и ClipPath могут сделать это за вас

user1032613 07.05.2022 00:42

Любые примеры или демонстрации, делающие это. Попытка использования CustomPaint не дала желаемого результата.

Daisy Shah 07.05.2022 00:45

@DaisyShah я покажу тебе пример

George Rabbat 07.05.2022 00:54

Это было бы очень полезно..

Daisy Shah 07.05.2022 00:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я сделал TestPage, вставьте его в свое приложение и посмотрите результаты. Измените ширину, чтобы сохранить форму. Это статично для трех элементов посередине и одного значка слева.

Если вы хотите сделать его динамичным, вы должны изменить форму различными способами и нуждаетесь в оптимизации.

import 'package:flutter/material.dart';

class TestPage extends StatelessWidget {
  const TestPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    double width = 300;
    return Center(
      child: SizedBox(
          width: width,
          height: width * 0.2442,
          child: CustomPaint(painter: CustomShape())),
    );
  }
}

class CustomShape extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {
    Path path_0 = Path();
    path_0.moveTo(size.width * 0.8778848, 0);
    path_0.lineTo(size.width * 0.4401651, 0);
    path_0.arcToPoint(Offset(size.width * 0.3433113, size.height * 0.1957085),
        radius:
            Radius.elliptical(size.width * 0.1218096, size.height * 0.4987930),
        rotation: 0,
        largeArc: false,
        clockwise: false);
    path_0.lineTo(size.width * 0.3433113, size.height * 0.1957085);
    path_0.lineTo(size.width * 0.3109976, size.height * 0.3582477);
    path_0.cubicTo(
        size.width * 0.2960634,
        size.height * 0.4332588,
        size.width * 0.2690989,
        size.height * 0.4360304,
        size.width * 0.2538154,
        size.height * 0.3555655);
    path_0.arcToPoint(Offset(size.width * 0.2030523, size.height * 0.1251676),
        radius:
            Radius.elliptical(size.width * 0.2818497, size.height * 1.154135),
        rotation: 0,
        largeArc: false,
        clockwise: false);
    path_0.arcToPoint(Offset(size.width * 0.1860221, size.height * 0.07393831),
        radius:
            Radius.elliptical(size.width * 0.1240584, size.height * 0.5080018),
        rotation: 0,
        largeArc: false,
        clockwise: false);
    path_0.lineTo(size.width * 0.1858475, size.height * 0.07393831);
    path_0.lineTo(size.width * 0.1858475, size.height * 0.07393831);
    path_0.arcToPoint(Offset(size.width * 0.1221152, size.height),
        radius:
            Radius.elliptical(size.width * 0.1221152, size.height * 0.5000447),
        rotation: 0,
        largeArc: true,
        clockwise: false);
    path_0.arcToPoint(Offset(size.width * 0.1858475, size.height * 0.9265087),
        radius:
            Radius.elliptical(size.width * 0.1213292, size.height * 0.4968261),
        rotation: 0,
        largeArc: false,
        clockwise: false);
    path_0.lineTo(size.width * 0.1858475, size.height * 0.9265087);
    path_0.cubicTo(
        size.width * 0.2068950,
        size.height * 0.8824318,
        size.width * 0.2298203,
        size.height * 0.7975861,
        size.width * 0.2549071,
        size.height * 0.6654448);
    path_0.cubicTo(
        size.width * 0.2707364,
        size.height * 0.5833706,
        size.width * 0.2936617,
        size.height * 0.5869468,
        size.width * 0.3087269,
        size.height * 0.6526598);
    path_0.lineTo(size.width * 0.3433113, size.height * 0.8046491);
    path_0.lineTo(size.width * 0.3433113, size.height * 0.8046491);
    path_0.arcToPoint(Offset(size.width * 0.4401651, size.height * 1.000268),
        radius:
            Radius.elliptical(size.width * 0.1218532, size.height * 0.4989718),
        rotation: 0,
        largeArc: false,
        clockwise: false);
    path_0.lineTo(size.width * 0.8778848, size.height * 1);
    path_0.arcToPoint(Offset(size.width * 0.9999782, size.height * 0.5000447),
        radius:
            Radius.elliptical(size.width * 0.1220934, size.height * 0.4999553),
        rotation: 0,
        largeArc: false,
        clockwise: false);
    path_0.lineTo(size.width * 1, size.height * 0.5000447);
    path_0.arcToPoint(Offset(size.width * 0.8778848, 0),
        radius:
            Radius.elliptical(size.width * 0.1221152, size.height * 0.5000447),
        rotation: 0,
        largeArc: false,
        clockwise: false);
    path_0.close();

    Paint paint_0_fill = Paint()..style = PaintingStyle.fill;
    paint_0_fill.color = Colors.grey[500]!;
    canvas.drawPath(path_0, paint_0_fill);
  }

  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    return false;
  }
}

Напишите свое мнение и завтра я переиграю на него.

George Rabbat 07.05.2022 01:56

Я попробую сегодня. Также я пытался использовать связь, но не оптимизировал его.

Daisy Shah 07.05.2022 10:37

@DaisyShah Сначала я сделал фигуру в иллюстраторе (не забудьте упростить путь), а затем экспортировал ее в SVG. Я использовал инструмент это, чтобы преобразовать его в флаттер CustomPainter. Измените его так, как вы хотите, и у меня есть результаты

George Rabbat 07.05.2022 12:32

Я попробовал это сегодня, и это работает отлично .. Спасибо

Daisy Shah 08.05.2022 20:26

Другие вопросы по теме