Flutter 在SingleChildScrollView中颤振CustomPaint未显示

Flutter 在SingleChildScrollView中颤振CustomPaint未显示,flutter,flutter-layout,Flutter,Flutter Layout,我有一些类似以下的颤振代码: class ImagePage extends StatefulWidget { final Class clazz; ImagePage(this.clazz); @override _ImagesPageState createState() => _ImagesPageState(); } class _ImagesPageState extends State<ImagePage> { @override Wi

我有一些类似以下的颤振代码:

class ImagePage extends StatefulWidget {
  final Class clazz;

  ImagePage(this.clazz);

  @override
  _ImagesPageState createState() => _ImagesPageState();
}

class _ImagesPageState extends State<ImagePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Theme.of(context).primaryColor,
      appBar: AppBar(
        title: Text(widget.clazz.name),
      ),
      body: SingleChildScrollView(
          child: CustomPaint(
        painter: _TalentPainter([
          "image.png",
          "image.png",
          "image.png",
          "image.png",
          "image.png",
          "image.png",
          "image.png",
          "image.png",
          "image.png",
          "image.png",
          "image.png",
          "image.png",
          "image.png",
          "image.png",
          "image.png",
          "image.png",
        ]),
      )),
    );
  }
}

class _TalentPainter extends CustomPainter {
  Paint _paint;
  List<ui.Image> _images = <ui.Image>[];

  _TalentPainter(List<String> _imagePaths) {
    this._paint = Paint()..isAntiAlias = true;
    _imagePaths.forEach((path) {
      getImage(path).then((image) {
        _images.add(image);
      });
    });
  }

  @override
  void paint(Canvas canvas, Size size) {
    for (int i = 0; i < _images.length; i++) {
      ui.Image image = _images.elementAt(i);
      canvas.drawImage(
          image, Offset(image.width.toDouble(), image.height * i.toDouble()), _paint);
    }
  }

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

  Future<ui.Image> getImage(String image) async {
    ByteData data = await rootBundle.load("assets/images/class_icon/$image");
    Codec codec = await ui.instantiateImageCodec(data.buffer.asUint8List());
    ui.FrameInfo fi = await codec.getNextFrame();
    return fi.image;
  }
}
class ImagePage扩展StatefulWidget{
最后一节课;
ImagePage(this.clazz);
@凌驾
_ImagesPageState createState()=>_ImagesPageState();
}
类_imagespatate扩展状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
背景色:主题。背景色,
appBar:appBar(
标题:文本(widget.clazz.name),
),
正文:SingleChildScrollView(
孩子:定制油漆(
画家:天才画家([
“image.png”,
“image.png”,
“image.png”,
“image.png”,
“image.png”,
“image.png”,
“image.png”,
“image.png”,
“image.png”,
“image.png”,
“image.png”,
“image.png”,
“image.png”,
“image.png”,
“image.png”,
“image.png”,
]),
)),
);
}
}
类_TalentPainter扩展自定义painter{
油漆;
列表_图像=[];
_TalentPainter(列表_图像路径){
这是真的;
_ImagePath.forEach((路径){
getImage(路径)。然后((图像){
_图片。添加(图片);
});
});
}
@凌驾
空心油漆(帆布,尺寸){
对于(int i=0;i<\u images.length;i++){
ui.Image=_images.elementAt(i);
画布.绘图图像(
图像,偏移量(image.width.toDouble(),image.height*i.toDouble(),_paint);
}
}
@凌驾
bool应重新绘制(自定义代理){
返回true;
}
未来getImage(字符串映像)异步{
ByteData=wait rootBundle.load(“资产/图像/类图标/$image”);
Codec Codec=wait ui.instantialeimagecodec(data.buffer.asUint8List());
ui.FrameInfo fi=await codec.getNextFrame();
返回fi.image;
}
}

我想定制一个小部件来显示一些图像和其他东西,它的内容将超出屏幕,我希望它滚动,现在我已经完成了上面的一些工作,我是warp CustomPaint,带有SingleChildScrollView,但是图像都消失了,我不知道为什么,请帮助我,英语不是我的第一语言,所以请原谅任何错误,谢谢

当您遇到这样的问题时,您需要隔离bug。为此,请尝试制作最简单的工作特性示例

在这种情况下,简单的例子是
\u TalentPainter
类,它只有一个图像,没有
SingleChildScrollView
wrap


\u TalentPainter
将无法工作,因为您在构造中有未来的调用,并且在调用绘制方法时,
\u images
为空

绘制不起作用,因为SingleChildScrollView“隐藏”了子对象的上下文布局。因此,您需要定义CustomPaint的大小。LayoutBuilder将有助于了解上下文限制。

首先,我很抱歉没有及时回复,因为我上周去度假了。正如你所说,我删除了SingleChildScrollView包装,它工作得很好,然后我用FutureBuilder包装SingleChildScrollView,在FutureBuilder中我得到了图像,它仍然不工作我们如何重新创建问题的完整示例Hi,Kherre我已经解决了这个问题,感谢你的帮助,我使用LayoutBuilder包装SingleChildScrollView,并使用ConstrainedBox作为它的子对象,它现在可以工作了。这是医生