【问题标题】:setState in futureBuilderfutureBuilder 中的 setState
【发布时间】:2020-09-30 02:52:00
【问题描述】:

我想在FutureBuilder 中使用setState,但不断得到

setState() or markNeedsBuild() called during build.

我已将 ratio 声明为全局变量。我想更新比率的值。只有成功获取图片的宽高后才能计算比例。

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

我知道我们不应该在FutureBuilder 中使用setState,但是由于我需要更新全局变量,解决方案是什么?

【问题讨论】:

  • 你可以试试this
  • @AjilO。我的小部件将继续构建

标签: flutter dart future


【解决方案1】:

最好将以后的调用转移到initState 方法,因为您不想在每次构建小部件时都调用selectImage。一旦将调用移到构建方法之外,您就可以进行所有计算,然后setState

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

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

阅读更多关于here的信息。

【讨论】:

  • selectImage 在 null 上调用
  • 确保在调用 selectImage 之前初始化 _bloc
猜你喜欢
  • 1970-01-01
  • 2019-10-31
  • 2019-01-31
  • 1970-01-01
  • 2021-12-18
  • 2021-08-15
  • 2021-09-06
  • 2020-03-22
  • 1970-01-01
相关资源
最近更新 更多