在未来建筑中设置状态

问题描述 投票:0回答:1

我想用 setStateFutureBuilder但一直在变

setState() or markNeedsBuild() called during build.

我已经将比率声明为全局变量。我想更新比率的值。只有在成功获得图像的宽度和高度后才能计算出比率。

 Widget _showItem() {
    return FutureBuilder(
        future: _bloc.selectImage(),
        builder: (context, snapshot) {
          switch (snapshot.connectionState) {
            case ConnectionState.waiting:
              return Center(
                child: CircularProgressIndicator(),
              );
              break;

            case ConnectionState.done:
              if (snapshot.hasData) {
                Image image = new Image.network(snapshot.data);
                Completer<ui.Image> completer = new Completer<ui.Image>();
                image.image.resolve(new ImageConfiguration()).addListener(
                    new ImageStreamListener((ImageInfo image, bool _) {
                  completer.complete(image.image);

                  setState(() {
                num maxHeightRatio = 300 / image.image.height;
                num maxWidthRatio = 400 / image.image.width;
                    this.ratio = maxWidthRatio.coerceAtMost(maxHeightRatio);
                  });
                }));

                return CachedNetworkImage(
                  imageUrl: snapshot.data.toString(),
                  imageBuilder: (context, imageProvider) => Container(
                    decoration: BoxDecoration(
                      image: DecorationImage(
                        image: imageProvider
                      ),
                    ),
                  ),
                  placeholder: (context, url) => CircularProgressIndicator(),
                  errorWidget: (context, url, error) => Icon(Icons.error),
                );
              } else {
                return Image.asset('assets/no_image.png');
              }
              break;

            default:
              return Text("Error");
          }
        });
  }

我知道我们不应该使用 setStateFutureBuilder但由于我需要更新全局变量,有什么办法解决这个问题?

flutter dart future
1个回答
1
投票

最好把你的未来调用移到你的全局变量中。initState 方法,因为你不想调用你的 selectImage 每次你的widget被构建的时候。一旦您将调用移到您的构建方法之外,您就可以进行所有的计算,然后再进行 setState.

void initState() {
  super.initState();
  setup();
}

setup() async {
  var data = await _bloc.selectImage();
  // do calculations using data
  // setState
}

阅读更多关于这个 此处.

© www.soinside.com 2019 - 2024. All rights reserved.