5

你好,我创建了一个扩展 CustomPainter 的小部件。问题是当调用paint方法时,Size参数宽度和高度字段总是0,0我不知道如何解决这个问题。任何想法将不胜感激。这是小部件。谢谢!!

class Box extends CustomPainter {
  double _top = 0.0;
  double _left = 0.0;
  double _width = 0.0;
  double _height = 0.0;
  String _text;

  Box(this._top, this._left, this._width, this._height, this._text);

  @override
  void paint(Canvas canvas, Size size) {
   canvas.drawRect(
      new Rect.fromLTWH(_left, _top, _width, _height),
      new Paint()
        ..style = PaintingStyle.stroke
        ..strokeWidth = 2.0
        ..color = Colors.blue // new Color(0xFF0099FF),
  );
}

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

并这样使用它:

new Positioned(
      left: 0.0,
      top: 0.0,
      child: new Container(
          child:new CustomPaint(
          painter: new Box(block.boundingBox.top.toDouble(), block.boundingBox.left.toDouble(),
              block.boundingBox.width.toDouble(), block.boundingBox.height.toDouble(),
              block.text)
      ))
  )

再次感谢您的想法!

4

2 回答 2

11

更多代码会有所帮助,但我认为我可以对您在此处所做的事情给出充分的解释。

我假设您的 Positioned 在堆栈中,并且由于堆栈中的另一个元素(或由于放置在为其提供大小的小部件中)而导致堆栈具有大小。例如,如果堆栈位于 SizedBox、Container(指定大小)或类似中,它将具有大小。而如果它在一个中心,它会根据它的孩子来调整自己的大小。

在堆栈由其子级确定大小的情况下,它根据最大的非定位子级来确定它有多大,即那些未包裹在 a 中Positioned或包裹在 a 中Positioned但定位未定义的子级左、右、上、右、宽度或高度中的任何一个。

所以回到你的问题 - 如果我们假设堆栈有一个大小,那么你的小部件被放置在左上角。但是,正如您所写的那样,您Positioned实际上没有指定自己的大小 - 您还没有设置容器或 CustomPaint 的大小。

所以你需要做的实际上是指定你希望你的 CustomPaint 有多大。如果您知道特定的宽度/高度,则可以在 Container 或 CustomPaint 的大小中指定。如果您不希望它拉伸到堆栈的大小,则可以简单地删除 Positioned 小部件,或同时定义左/右和/或上/下。或者,您可以将指定的高度或宽度 + 与您想要的尺寸的偏移量组合起来。最后一件事是,即使外部的小部件尺寸正确,CustomPaint 仍可能决定将自己的大小设置为零。如果是这种情况,您需要传入一个大小(我有把握,如果您传入Size.infinite它,它将扩展以填充其父级)。

最后一件事是我不确定你在用你的 CustomPainter 做什么,但它似乎是错误的。如果您所做的只是尝试绘制一个正方形,请使用传递给画家的大小而不是参数(我猜您正在尝试这样做以解决您看到的大小为零的问题)。

例如,如果您尝试简单地绘制一个填充整个绘画区域的矩形,请使用以下命令:

canvas.drawRect(Offset.zero & size, Paint().....);

但是,如果您传递东西,则需要确保您没有在自定义画家的范围之外进行绘制。来自 CustomPaint 文档:

画家应该在从原点开始并包含给定大小的区域的矩形内进行绘画。(如果画家在这些范围之外进行绘制,则分配的内存可能不足以对绘制命令进行光栅化,并且结果行为是未定义的。)

于 2018-08-16T17:50:10.137 回答
0

CustomPaint小部件的默认大小是Size.zero. 要给出您喜欢的大小:

CustomPaint(
size: Size(100,100),
painter: MyPainter(),
),

要根据您的设备给您的画布宽度和高度,您可以使用

double deviceWidth = MediaQuery.of(context).size.width;
double deviceHeight = MediaQuery.of(context).size.height;

在您的构建方法中初始化 deviceWidth 和 deviceHeight 并将其传递给CustomPaint小部件的 size 属性。

CustomPaint(
size: Size(deviceWidth,deviceHeight),
painter: MyPainter(),
),
于 2020-05-09T14:30:28.693 回答