【问题标题】:LateInitializationError: Field '___' has not been initializedLateInitializationError:字段“___”尚未初始化
【发布时间】:2021-08-20 06:28:13
【问题描述】:

我收到 LateInitializationError: Field '_subjects@100178445' has not been initialized 下列代码错误。

Json 响应如下。

{
  "success": 1,
  "subject": [
    {
      "subject_id": "5e32874c714fa",
      "subject_name": "Account",
      "image": "upload/subject/Account.png",
      "active": "1",
      "standard_id": "5d1594e283e1a",
      "medium_id": "5d15938aa1344"
    },
    {
      "subject_id": "5da9ff659fb7c",
      "subject_name": "Biology",
      "image": "upload/subject/03_logo-1164x484.png",
      "active": "1",
      "standard_id": "5d1594e283e1a",
      "medium_id": "5d15938aa1344"
    },
    {
      "subject_id": "5da9ff990b1c6",
      "subject_name": "Chemisty",
      "image": "upload/subject/02_logo-1168x490.png",
      "active": "1",
      "standard_id": "5d1594e283e1a",
      "medium_id": "5d15938aa1344"
    },
    {
      "subject_id": "5de76afbd064e",
      "subject_name": "Computer",
      "image": "upload/subject/07_logo-1169x486.png",
      "active": "1",
      "standard_id": "5d1594e283e1a",
      "medium_id": "5d15938aa1344"
    },
    {
      "subject_id": "5d788906c431b",
      "subject_name": "Devsatya Paperset March 2020",
      "image": "upload/subject/04_logo-1174x491.png",
      "active": "1",
      "standard_id": "5d1594e283e1a",
      "medium_id": "5d15938aa1344"
    }
  ]
}

在 subject_model.dart 文件中的模型类如下。

// To parse this JSON data, do
//
//     final subjectByUser = subjectByUserFromJson(jsonString);

import 'dart:convert';

SubjectByUser subjectByUserFromJson(String str) =>
    SubjectByUser.fromJson(json.decode(str));

String subjectByUserToJson(SubjectByUser data) => json.encode(data.toJson());

class SubjectByUser {
  SubjectByUser({
    required this.success,
    required this.subject,
  });

  int success;
  List<Subject> subject;

  factory SubjectByUser.fromJson(Map<String, dynamic> json) => SubjectByUser(
        success: json["success"],
        subject:
            List<Subject>.from(json["subject"].map((x) => Subject.fromJson(x))),
      );

  Map<String, dynamic> toJson() => {
        "success": success,
        "subject": List<dynamic>.from(subject.map((x) => x.toJson())),
      };
}

class Subject {
  Subject({
    required this.subjectId,
    required this.subjectName,
    required this.image,
    required this.active,
    required this.standardId,
    required this.mediumId,
  });

  String subjectId;
  String subjectName;
  String image;
  String active;
  String standardId;
  String mediumId;

  factory Subject.fromJson(Map<String, dynamic> json) => Subject(
        subjectId: json["subject_id"],
        subjectName: json["subject_name"],
        image: json["image"],
        active: json["active"],
        standardId: json["standard_id"],
        mediumId: json["medium_id"],
      );

  Map<String, dynamic> toJson() => {
        "subject_id": subjectId,
        "subject_name": subjectName,
        "image": image,
        "active": active,
        "standard_id": standardId,
        "medium_id": mediumId,
      };
}

我在 apimanager.dart 文件中创建了如下函数

class ApiManager {
  static const String subjectUrl =
      "http://192.168.43.160/sahjanand/api/subject/get_by_user_plan?user_id=609cab2cd5b6c&order_id=1620889722609cd07a601af469889697609cab2cd5b6c&standard_id=5d1594e283e1a&medium_id=5d15938aa1344";

  static Future<List<SubjectByUser>> getSubjectByUser() async {
    try {
      final response = await http.get(Uri.parse(subjectUrl));
      if (response.statusCode == 200) {
        final List<SubjectByUser> subjects =
            subjectByUserFromJson(response.body) as List<SubjectByUser>;
        print(subjects);
        return subjects;
      } else {
        return <SubjectByUser>[];
      }
    } catch (e) {
      // ignore: deprecated_member_use
      return <SubjectByUser>[];
    }
  }
}

在 homepage.dart 文件中查看代码如下。

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late List<SubjectByUser> _subjects;
  late bool _loading;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _loading = true;
    ApiManager.getSubjectByUser().then((subjects) {
      setState(() {
        _subjects = subjects;
        _loading = false;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(_loading ? 'Loading...' : 'Subjects'),
      ),
      body: Center(
        child: ListView.builder(
            itemCount: null == _subjects ? 0 : _subjects.length,
            itemBuilder: (context, index) {
              SubjectByUser subjectByUser = _subjects[index];
              return ListTile(
                title: Text(subjectByUser.success.toString()),
                subtitle: Text(subjectByUser.subject.length.toString()),
              );
            }),
       
      ),
    );
  }
}

我得到了 LateInitializationError: Field '_subjects@100178445' has not been initialized 错误。 所以请帮助我如何解决这个错误。

【问题讨论】:

    标签: flutter


    【解决方案1】:

    你在 ListView.builder 中调用 _subjects 进行比较,但是到时候 _subjects 还没有初始化,所以会报错,你可以初始化 _subjects 为空列表

    final _subjects = <SubjectByUser>[];
    

    那么一旦你得到数据,你就可以添加所有的数据。

     ApiManager.getSubjectByUser().then((subjects) {
          setState(() {
           _subject..clear()..addAll(subjects);
            _loading = false;
          });
        });
    

    在 itemCount 中,你可以简单地拥有

    itemCount: _subjects.length,
    

    【讨论】:

      【解决方案2】:

      尝试类似:

      child: _subjects != null  && _subjects.length.length > 0 ? ListView.builder(...) : CircularProgressIndicator();
      

      【讨论】:

      • 好的先生,我消除了错误,但在_loading = false之后处于setstate;我放行 print(_subjects.toString());并放置断点,以便列表中没有记录。当我对 _subjects 感兴趣时,有列表(0 项)。并且只打印 []。
      • 这意味着您的 API 中存在错误,因为它没有返回您想要的结果
      • 如果_subjectslate,则无法检查它是否已初始化。 late 的重点是在变量初始化之前禁止读取它。如果有必要先检查它,则该变量应该可以为空。
      • 如果是[],表示里面没有元素。因此,您不要将任何数据放入列表中。也许 API 没有返回任何数据。
      • 是的,先生,您是对的,当我从 app.quicktype.io 创建模型类时,我忘记将响应放在 [] 大括号之间。我可以放置新的模型类,那么您能帮我了解如何获取内部列表对象并在 lisview 中显示吗?
      猜你喜欢
      • 2022-07-27
      • 2021-10-27
      • 2021-12-29
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      相关资源
      最近更新 更多