首页 > 解决方案 > 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.

让我感到困惑的是这个错误闪烁,但是在正确构建小部件并且它运行顺利之后。关于如何解决此问题或如何忽略此错误的任何建议,因为它似乎在初始错误后工作?

标签: flutter

解决方案


尽量避免在内部使用异步函数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
        }
      }
    );
  }
}

推荐阅读