颤振自定义画家

use*_*498 3 dart flutter flutter-layout flutter-animation

你好,我创建了一个扩展CustomPainter的小部件。问题是,当调用paint方法时,Size参数的width和height字段始终为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;
 }
}
Run Code Online (Sandbox Code Playgroud)

并这样使用它:

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)
      ))
  )
Run Code Online (Sandbox Code Playgroud)

再次感谢您提出的反对意见!

rmt*_*zie 6

多一点的代码会有所帮助,但是我想我可以对您在这里所做的事情给出足够的解释。

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

如果堆栈按其子级调整大小,则根据未定位的子级中最大的子级来确定堆栈的大小,即未包装成a Positioned或包裹在a中Positioned但未定位的子级左侧,右侧,顶部,右侧,宽度或高度中的任何一个。

回到您的问题-如果我们假设堆栈有一个大小,那么您的小部件将放在左上方。但是,按照书面规定,您Positioned实际上未指定任何小部件的大小-您尚未设置Container或CustomPaint的大小。

因此,您实际上需要指定CustomPaint的大小。如果知道特定的宽度/高度,则可以在Container或CustomPaint的尺寸中指定该宽度/高度。如果您不希望扩展到堆栈的大小,则可以简单地删除Positioned小部件,或定义left / right和/或top / bottom。或者,您可以组合指定的高度或宽度+所需偏移量。最后一件事是,即使外部小部件的大小正确,CustomPaint仍可能决定将其大小调整为零。如果是这种情况,则需要传递一个尺寸(我很确定如果传递给Size.infinite它,它将扩大以填充其父对象)。

最后一件事是我不确定您对CustomPainter所做的事情,但是看来这可能是错误的。如果您只是想绘制一个正方形,请使用传递给绘制器的尺寸而不是参数(我猜您正在尝试这样做是为了解决尺寸为零的问题)。

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

canvas.drawRect(Offset.zero & size, Paint().....);
Run Code Online (Sandbox Code Playgroud)

但是,如果您传入了一些东西,则需要确保您不在自定义画家的画图范围之外。从CustomPaint文档中:

画家应在从原点开始并围绕给定尺寸的区域内的矩形范围内进行绘画。(如果画家在这些界限之外绘画,则可能分配的内存不足以光栅化绘画命令,并且导致的行为是不确定的。)