flutter - Flutter:如何在构建方法之前在小部件上发出一系列 http 请求
问题描述
我有 3 个类:用户、帖子和评论。用户有很多帖子, 帖子有很多评论。
我希望在调用小部件的构建方法之前获取所有数据。
我尝试使用initState()来做到这一点:
class FetchDataExample extends StatefulWidget {
final User _user;
FetchDataExample(this._user);
@override
_State createState() => _State(_user);
}
class _State extends State<FetchDataExample> {
final User _user;
_State(this._user);
@override
void initState() {
_user.setPosts();
super.initState();
}
@override
Widget build(BuildContext context) {
print(this._user.posts[0]);
return Container(
);
}
}
在用户类 中,我有:
void setPosts() async {
String url = 'https://jsonplaceholder.typicode.com/posts?userId=' + this.id.toString();
var request = Requester.get(url); // Returns a Future<Response>
await request.then((value) => this.posts = Post.jsonToPosts(json.decode(value.body)));
this.posts.forEach((post) => post.setComments());
print(this.posts[0]);
}
'setComments()' 具有相同的逻辑。
我有两个打印件:
- 返回null的内部构建;
- 在setPosts中返回'Post' 的实例;
因此,当在小部件中调用 Build 方法时,initState 尚未完成。
我需要完成它,有人知道我该怎么做吗?
解决方案
您可以使用FutureBuilder
未来的最新结果来构建小部件。您还可以使用方法将多个期货组合成一个Future.wait
。
这是一个示例代码:
_getPageData() async {
var _combinedFutures = await Future.wait([setPosts, setComments]);
//do stuff with data
}
...
@override
Widget build(BuildContext context) {
return FutureBuilder(
future:_getPageData(),
builder: (context, snapshot) {
return Container();
}),
);
});
推荐阅读
- c++ - 为什么这个超时?时间复杂度不是 O(n^2logn) 吗?
- python - MatplotlibDeprecationWarning 使用 Gridspec
- python - 防止python shell在返回后关闭
- html - Next.js 使用引导 html 标记样式覆盖 HTML 标记默认样式
- swift - 访问协议扩展中的静态字段值
- c# - 在 Unity 中不能更改超过 1 种材质
- javascript - 指定平台不允许使用音频
- javascript - INSERT ON CONFLICT DO UPDATE 使用 pg-promise 助手进行多行插入/更新
- angular - Angular 9 - 找不到带有路径的控件:'xxx -> 2 -> xxx'
- c++ - 如果初始数组值小于输入值,代码可以运行吗?