首页 > 解决方案 > LateInitializationError:字段“___”尚未初始化

问题描述

我得到了 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

解决方案


您在 ListView.builder 中调用 _subjects 进行比较,但到那时 _subjects 尚未初始化,因此会引发错误,您可以将 _subjects 初始化为空列表

final _subjects = <SubjectByUser>[];

然后,一旦您获得数据,您就可以将所有数据添加到其中。

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

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

itemCount: _subjects.length,

推荐阅读