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作为它的子对象,它现在可以工作了。这是医生