Flutter 布局生成器中的FutureBuilder多次调用future

Flutter 布局生成器中的FutureBuilder多次调用future,flutter,dart,flutter-layout,Flutter,Dart,Flutter Layout,我在尝试LayoutBuilder和FutureBuilder时遇到了一个情况。如果我把FutureBuilder放在一个小部件中而不是LayoutBuilder中,一切都很好,未来只解决一次。但是,当我将FutureBuilder放入LayoutBuilder中时,未来将无限地解决,最终的小部件永远不会绘制出来 class MyApp extends StatelessWidget { @override Widget build(BuildContext context) {

我在尝试
LayoutBuilder
FutureBuilder
时遇到了一个情况。如果我把
FutureBuilder
放在一个小部件中而不是
LayoutBuilder
中,一切都很好,未来只解决一次。但是,当我将
FutureBuilder
放入
LayoutBuilder
中时,未来将无限地解决,最终的小部件永远不会绘制出来

class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Photo View example',
      theme: theme,
      home: new Scaffold(
        body: LayoutBuilder(
          builder: (BuildContext context, BoxConstraints constraints) {
            return ImagePainter();
          }
      ),
      ),
    );
  }
} 


class ImagePainter extends StatelessWidget{
  Future<ui.Image> loadImage() async {
    ByteData data = await rootBundle.load("graphics/test.jpg");
    if (data == null) {
      print("data is null");
    } else {
      var codec = await ui.instantiateImageCodec(data.buffer.asUint8List());
      var frame = await codec.getNextFrame();
      return frame.image;
    }
  }

  @override
  Widget build(BuildContext context) {
    return Container(
                child: FutureBuilder(
        future: loadImage(),
        builder: (BuildContext context, AsyncSnapshot<ui.Image> snapshot) {
          switch(snapshot.connectionState) {
            case ConnectionState.waiting : 
              return Center(child: Text("loading..."),);
            default:
              if (snapshot.hasError) {
                return Center(child: Text("error: ${snapshot.error}"),);
              } else {
                print("data: ${snapshot.data}");
                return Placeholder(); //just for testing
              }
            }
          },
        ),
    );
  }
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
标题:“照片视图示例”,
主题:主题,,
家:新脚手架(
正文:布局生成器(
生成器:(BuildContext上下文,BoxConstraints){
返回ImagePainter();
}
),
),
);
}
} 
类ImagePainter扩展了无状态小部件{
Future loadImage()异步{
ByteData=wait rootBundle.load(“graphics/test.jpg”);
如果(数据==null){
打印(“数据为空”);
}否则{
var codec=wait ui.instantialeimagecodec(data.buffer.asUint8List());
var frame=await codec.getNextFrame();
返回帧。图像;
}
}
@凌驾
小部件构建(构建上下文){
返回容器(
孩子:未来建设者(
future:loadImage(),
生成器:(BuildContext上下文,异步快照){
交换机(快照.连接状态){
案例连接状态。正在等待:
返回中心(子项:文本(“加载…”),);
违约:
if(snapshot.hasError){
返回中心(子项:文本(“错误:${snapshot.error}”);
}否则{
打印(“数据:${snapshot.data}”);
返回占位符();//仅用于测试
}
}
},
),
);
}
}
所以可以解释一下,或者我做错了什么。

类ImagePainter扩展了这个小部件{
class ImagePainter extends StatelessWidget{
Future<ui.Image> loadImage() async {
ByteData data = await rootBundle.load("graphics/test.jpg");
if (data == null) {
  print("data is null");
} else {
  var codec = await ui.instantiateImageCodec(data.buffer.asUint8List());
  var frame = await codec.getNextFrame();
  return frame.image;
}


}
  @override
  Widget build(BuildContext context) {
    return Container(
            child: FutureBuilder(
    future: loadImage(),
    builder: (BuildContext context, AsyncSnapshot<ui.Image> snapshot) {
      switch(snapshot.connectionState) {
        case ConnectionState.waiting : 
            print("data: ${snapshot.data}");
          //return Center(child: Text("loading..."),);
        default:
          if (snapshot.hasError) {
            return Center(child: Text("error: ${snapshot.error}"),);
          } /*else {
            print("data: ${snapshot.data}");
            return Placeholder(); //just for testing
           }*/
         }
        },
      ),
   );
 }
}
Future loadImage()异步{ ByteData=wait rootBundle.load(“graphics/test.jpg”); 如果(数据==null){ 打印(“数据为空”); }否则{ var codec=wait ui.instantialeimagecodec(data.buffer.asUint8List()); var frame=await codec.getNextFrame(); 返回帧。图像; } } @凌驾 小部件构建(构建上下文){ 返回容器( 孩子:未来建设者( future:loadImage(), 生成器:(BuildContext上下文,异步快照){ 交换机(快照.连接状态){ 案例连接状态。正在等待: 打印(“数据:${snapshot.data}”); //返回中心(子项:文本(“加载…”),); 违约: if(snapshot.hasError){ 返回中心(子项:文本(“错误:${snapshot.error}”); }/*其他{ 打印(“数据:${snapshot.data}”); 返回占位符();//仅用于测试 }*/ } }, ), ); } }
你说“小部件从不绘制”是什么意思?是否绘制了错误小部件?我认为您更改了
FutureBuilder
中的小部件树,这将导致
LayoutBuilder
的重建。因此,这一过程非常困难looped@KirillShashov这也是我的想法,但从我在代码中看到的情况来看似乎不是这样。不,正如您在代码示例中看到的,图像绘制器返回时没有对小部件树进行任何更改。它一直在循环中。@NatwarSingh你能解决它吗?我面临着类似的问题。问题是当你将Future builder放入布局生成器时。