Dart/flutter : String data from initState can't be passed via setState

标签 dart flutter

昨天我制作了一个简单的小部件,用于获取数据以显示一些基本信息,但我注意到当我返回列表时,数据通常不存在,我只得到错误文本。

我想这是因为这些小部件最初是无状态的,所以我试图将它们转换为有状态的,以便在加载页面时重新加载数据。

这就是我为小部件收集数据的方式:

class BasicDogWidget extends StatefulWidget {
  String URL;

  BasicDogWidget(this.URL);

  @override
  createState() => new BasicDogWidgetState(URL);
}

class BasicDogWidgetState extends State<BasicDogWidget> {
  String URL;
  BasicDogWidgetState(this.URL);

  var result;
  var imageLink;
  var dogName;
  var dogType;
  var dogColor;
  var dogGender;
  var dogAge;

  @override
  initState() {
    fetchImageLink(URL).then((result) {
      setState(imageLink = result);
    });

    fetchDogInfo(URL, 'datas-nev').then((result) {
      setState(dogName = result);
    });

    fetchDogInfo(URL, 'datas-tipus').then((result) {
      setState(dogType = result);
    });

    fetchDogInfo(URL, 'datas-szin').then((result) {
      setState(dogColor = result);
    });

    fetchDogInfo(URL, 'datas-nem').then((result) {
      setState(dogGender = result);
    });

    fetchDogInfo(URL, 'datas-kor').then((result) {
      setState(dogAge = result);
    });

    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    if (imageLink == null) {
      return new Container();
    }

    if (dogName == null) {
      return new Container();
    }

    if (dogType == null) {
      return new Container();
    }

    if (dogColor == null) {
      return new Container();
    }

    if (dogGender == null) {
      return new Container();
    }

    if (dogAge == null) {
      return new Container();
    }

    return buildBasicWidget(
        imageLink, dogName, dogType, dogColor, dogGender, dogAge, URL);
  }
}

但是,fetchDogInfo收集的数据似乎不能传入setState方法,因为它是一个字符串。

E/flutter (12296): [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/flutter (12296): type 'String' is not a subtype of type 'VoidCallback' of 'fn' where
E/flutter (12296):   String is from dart:core
E/flutter (12296): 
E/flutter (12296): #0      State.setState (package:flutter/src/widgets/framework.dart:1086)
E/flutter (12296): #1      BasicDogWidgetState.initState.<anonymous closure> (package:osszefogasaszanhuzokert/dog.dart:230)

有什么方法可以绕过这个问题吗?

最佳答案

你正在执行异步代码

fetchImageLink(URL).then((result) {

这意味着fetchImageLink(URL)最终会返回一个值然后执行then(...),但是这个调用是异步的,这意味着它被添加到稍后执行的事件队列和代码同步继续执行直到 initState 结束,然后 build 直到此同步代码运行完成,然后是下一个“任务” "从事件队列中执行,这可能是 fetchImageLink() 调用中的 then(...) 部分(如果它已经完成)。

不过这应该不是问题。
您可以只检查该值是否可用

  @override
  Widget build(BuildContext context) {
    if(imageLink == null) {
      return new Container(); // dummy widget until there is something real to render
    }

    ... // your other build code

关于 Dart/flutter : String data from initState can't be passed via setState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49689970/

相关文章:

Flutter,重播 GIF

android - 如何在 Flutter 中将文件从本地存储导入到数据库中

webview - flutter 的支付网关

laravel - Flutter 中出现 401 未经授权的错误,但在 Postman 中工作正常

dart - forEach 和 for (var o in objs) 之间的性能差异

dart - 将 pushNamed 与 Dismissible Widget 结合使用

android - 如何在 flutter 中规范化 [-1, 1] 之间的数据

flutter - 与提供商更改颜色和图标

list - Flutter:使用定界符从列表创建 map

dart - 我可以在 Atom 中自定义 Dart 代码的代码格式吗?