我们如何将尺寸传递给CustomPaint?

时间:2018-12-27 07:07:20

标签: dart flutter

列的子级CustomPainter的大小变为(0,0)。

1)当我们仅使用CustomPaint和CustomPainter时,我们期望的大小将传递给CustomPainter,并按预期方式呈现。

2)当我们使用CustomPaint和CustomPainter作为Stack的子代时,我们期望的大小没有传递给CustomPainter。

3)但是,当我们将其用作SizedBox.expand的子代时,我们期望的大小将传递给CustomPainter并进行渲染。

4)当我们使用CustomPaint和CustomPainter作为Column的子代时,我们期望的大小没有传递给CustomPainter。我们正在研究解决问题的方法。

5)但是,它的高度可以是0.0或无限。我们希望它可以扩展到合适的大小。

import 'package:flutter/material.dart';

class TestWidget extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
    // 1) OK Size(360.0, 640.0)
    // return CustomPaint(
    //   painter: TestPainter(),
    // );

    // 2) NG Size(0.0, 0.0)
    // return Stack(
    //   children: <Widget>[
    //     CustomPaint(
    //       painter: TestPainter(),
    //     ),
    //   ],
    // );

    // 3) OK Size(360.0, 640.0)
    // return Stack(
    //   children: <Widget>[
    //     SizedBox.expand(
    //       child: CustomPaint(
    //         painter: TestPainter(),
    //       ),
    //     ),
    //   ],
    // );

    // 4)5) NG BoxConstraints forces an infinite height.
    // return Column(
    //   children: <Widget>[
    //     SizedBox.expand(
    //       child: CustomPaint(
    //         painter: TestPainter(),
    //       ),
    //     ),
    //     Text('test'),
    //   ],
    // );

    // 4)5) NG Size(0.0, 0.0)
    // return Column(
    //   children: <Widget>[
    //     SizedBox(
    //       child: CustomPaint(
    //         painter: TestPainter(),
    //       ),
    //     ),
    //     Text('test'),
    //   ],
    // );

    // 4)5) Size(360.0, 0.0)
    // return Column(
    //   children: <Widget>[
    //     SizedBox(
    //       width: double.infinity,
    //       child: CustomPaint(
    //         painter: TestPainter(),
    //       ),
    //     ),
    //     Text('test'),
    //   ],
    // );
    }
}

class TestPainter extends CustomPainter {
    @override
    void paint(Canvas canvas, Size size) {
    print(size);
    Paint p = Paint();
    p.color = Color.fromARGB(0xff, 0xff, 0x00, 0x00);
    Rect rect = Rect.fromLTWH(0, 0, size.width, size.height);
    canvas.drawRect(rect, p);
    }

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

我们希望CustomPaint和CustomPainter可以扩展到适当的大小,并且该大小将传递给CustomPainter。

3 个答案:

答案 0 :(得分:1)

要在flutter类中传递所需的参数,可以从实例轻松传递它 并在类中使用构造函数使用它

例如:

class TestPainter extends CustomPainter {
    int size;

    // Constructor
    TestPainter({this.size});
}

您可以将size作为参数传递给此TestPainter类

TestPainter(size: 10);

答案 1 :(得分:1)

下面是CustomPaint()的构造函数:

const CustomPaint({
  Key key,
  this.painter,
  this.foregroundPainter,
  this.size = Size.zero,
  this.isComplex = false,
  this.willChange = false,
  Widget child,
}) : assert(size != null),
     assert(isComplex != null),
     assert(willChange != null),
     super(key: key, child: child);

如果省略大小,则将其视为Size.zero(表示Size(0.0, 0.0)),因此您需要将所需的大小传递给'CustomPaint()`。

return CustomPaint(
  size: const Size(double.infinity, double.infinity),  // or whatever size you want it to be
  painter: TestPainter(),
);

对于在Column内部扩展小部件,请使用Expanded而不是SizedBox.expand

答案 2 :(得分:0)

在TestPainter类中创建一个构造函数,并从那里接受参数。

例如:

var size;
TestPainter(this.size);

现在在调用此类时,将size值传递给构造函数

TestPainter(20.0);

并在paint方法内使用它:

widget.size.width