Я пытаюсь нарисовать нестандартную фигуру во флаттере, но, к сожалению, форма не отображается, я просто вижу белый контейнер - PullRequest
0 голосов
/ 10 июля 2020

это код произвольной формы

class SignInPageCustomShape extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {
    final paint = Paint();
    final Color myColor = Colors.black12;
    paint.color = myColor;
    paint.style = PaintingStyle.fill;
    final path = Path();
    path.moveTo(0, size.height * 0.9167);
    path.quadraticBezierTo(
      size.width * 0.25,
      size.height * 0.875,
      size.width * 0.5,
      size.height * 0.9167,
    );
    path.quadraticBezierTo(
      size.width * 0.75,
      size.height * 0.9584,
      size.width * 1.0,
      size.height * 0.9167,
    );
    path.lineTo(size.width, size.height);
    path.lineTo(0, size.height);

    canvas.drawPath(path, paint);
  }

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

и это мое дерево виджетов, я не знаю, что не так, я пытался разместить свой контейнер в разных местах, но получился тот же результат , переполнение стека просит меня объяснить больше, но мне больше нечего объяснять.

class Paint extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Container(
          color: Colors.white,
          child: CustomPaint(
            painter: SignInPageCustomShape(),
          ),
        ),
      ),
    );
  }
}

1 Ответ

1 голос
/ 11 июля 2020

Проблема, с которой вы столкнулись, может быть связана с тем, что вы не определили дочерний элемент в CustomPaint

Я добавил пустой контейнер, запустил код и получил следующие результаты

Снимок экрана

Именование вашего StatelessWidget Paint также не рекомендуется

class Paint extends StatelessWidget {

Следующий метод принимает два параметра, один типа Paint, потому что вы определили пользовательский виджет с тем же именем, что и был передача неправильного параметра в моем случае

canvas.drawPath(path, paint);

Код, который я использовал для получения результатов, прикрепленных в этом ответе: Paint Widget:

class PaintWidget extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Container(
          color: Colors.white,
          child: CustomPaint(
            painter: SignInPageCustomShape(),
            child: Container(),
          ),
        ),
      ),
    );
  }
}

SignInPageCustomShape Widget:

class SignInPageCustomShape extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {
    final paint = Paint();

    final Color myColor = Colors.black12;
    paint.color = myColor;
    paint.style = PaintingStyle.fill;
    final path = Path();
    path.moveTo(0, size.height * 0.9167);
    path.quadraticBezierTo(
      size.width * 0.25,
      size.height * 0.875,
      size.width * 0.5,
      size.height * 0.9167,
    );

    path.quadraticBezierTo(
      size.width * 0.75,
      size.height * 0.9584,
      size.width * 1.0,
      size.height * 0.9167,
    );

    path.lineTo(size.width, size.height);
    path.lineTo(0, size.height);

    canvas.drawPath(path, paint);
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    return true;
  }
}
...