flutter - Flutter中的未知LateInitializationError
问题描述
我有一个颤振小部件,它从 API 检索 Json 信息并显示该信息的小部件。我的initState如下:
class _BuildCardsWidgetState extends State<BuildCardsWidget> {
bool display = false;
late Resource _resource;
Future<Resource> fetchResource(Build build) async {
var url = Uri.parse(APIURL); <-actual url link hidden
final response = await http.get(url);
var resourceReturn = json.decode(response.body);
var resourceJson = resourceReturn[0]['resource'];
return Resource.fromJson(resourceJson, build);
}
@override
void initState() {
fetchResource(widget.build).then((value) =>
this.setState(() {
_resource = value;
display = true;
}));
super.initState();
}
@override
Widget build(BuildContext context) {
return ... <- _resource is used within build
但是,每当程序到达该行时
final response = await http.get(url);
抛出此错误:
The following LateError was thrown building BuildCardsWidget(dirty, state: _BuildCardsWidgetState#b3c7a):
LateInitializationError: Field '_resource' has not been initialized.
让我感到困惑的是这个错误闪烁,但是在正确构建小部件并且它运行顺利之后。关于如何解决此问题或如何忽略此错误的任何建议,因为它似乎在初始错误后工作?
解决方案
尽量避免在内部使用异步函数initState
,如果没有await
在单独的函数中正确处理,小部件将不会在构建小部件之前加载您的数据。解决此问题的一种快速简单的方法是使用FutureBuilder()
.
class _BuildCardsWidgetState extends State<BuildCardsWidget> {
Future<Resource> fetchResource(Build build) async {
var url = Uri.parse(APIURL); <-actual url link hidden
var resourceReturn = json.decode(response.body);
var resourceJson = resourceReturn[0]['resource'];
return Resource.fromJson(resourceJson, build);
}
@override
Widget build(BuildContext context) {
return FutureBuilder<Resource>(
future: fetchResource(build),
builder: (context, snapshot) {
return SizedBox();
}
if(snapshot.hasError) {
/// Handle error
}
}
);
}
}
推荐阅读
- javascript - 单击以在具有多个位置的多个 hml 文件上显示电话号码
- android - 垂直多线芯片组是否有可能每条线有一个芯片?
- php - 自定义类别 URL wordpress
- php - 如何用更少的代码行编写下面的 switch case?
- django - 删除另一个选项卡中的相关内联记录时出现 MultiValueDictKeyError
- android - 从命令行或 Espresso 测试用例的开发人员选项中启用“不保留活动”
- javascript - 如何阻止 Discord 机器人响应其他机器人?
- python - 在 Python 中使用 Requests 模块时遇到问题
- ios - 为什么在覆盖自定义单元格的 setSelected 方法后,表格视图单元格每次在滚动时出现时都会被选中?
- swift - 无法转换“MyEnum”类型的值
' 到预期的参数类型 'MyEnum<_>'