昨天我制作了一个简单的小部件,用于获取数据以显示一些基本信息,但我注意到当我返回列表时,数据通常不存在,我只得到错误文本。
我想这是因为这些小部件最初是无状态的,所以我试图将它们转换为有状态的,以便在加载页面时重新加载数据。
这就是我为小部件收集数据的方式:
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/