flutter - LayoutBuilder 中的 FutureBuilder 多次调用 future

标签 flutter dart flutter-layout

我刚刚在尝试 LayoutBuilderFutureBuilder 时遇到了一种情况。如果我将 FutureBuilder 放在 LayoutBuilder 之外的小部件中,一切都很好,并且 future 只解决一次。但是,当我将 FutureBuilder 放入 LayoutBuilder 中时, future 将被无限解析,并且最终的小部件永远不会绘制。

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
              }
            }
          },
        ),
    );
  }
}

所以可以解释一下吗?或者我做错了什么。

最佳答案

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
           }*/
         }
        },
      ),
   );
 }
}

关于flutter - LayoutBuilder 中的 FutureBuilder 多次调用 future,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51382348/

相关文章:

flutter - Dart 中通用 List 对象的运行时类型检查

Flutter:有没有什么方法可以只在ios上使用widget,而不能在android上使用?

调用 Navigator Pop 或 Push 时触发 Flutter Stream Builder

flutter 如何更改容器上的一个边框并保持 borderRadius?

FLUTTER: RangeError (index): Index out of range: no indices are valid: 0 (传递参数)

dart - 有没有办法设置路由的渲染顺序?

flutter - 无法使用 SizedBox 限制 Card 的高度

flutter - Dart:警告 “info: This function has a return type of ' int',但不以return语句结尾”)

animation - 使卡片足够大以适合子文字

android - Flutter:Raw Material Button 和 Material Button 的区别