首页 > 解决方案 > 如何解决 Flutter 中不可为空的错误?

问题描述

我是 Flutter 开发的新手,我正在尝试实现一个类别页面,数据将从 json 文件加载。但我收到空安全错误“必须初始化不可为空的变量‘类别’。尝试添加初始化表达式。 ”在创建类时。请找到以下代码供您参考并帮助解决。

有两个 dart 文件,一个是 category_models.dart,另一个是 homecategories.dart

提前致谢。

Category_model.dart

    import 'dart:convert';

    class CategoryModel { 
    static List<Category> categories;
    }

    class Category {
    final int id;
    final String name;
    final String image;
    Category({
    required this.id,
    required this.name,
    required this.image,
    });

    Category copyWith({
    int? id,
    String? name,
    String? image,
    }) {
    return Category(
      id: id ?? this.id,
      name: name ?? this.name,
      image: image ?? this.image,
    );
    }

    Map<String, dynamic> toMap() {
    return {
      'id': id,
      'name': name,
      'image': image,
    };
    }

    factory Category.fromMap(Map<String, dynamic> map) {
    return Category(
      id: map['id'],
      name: map['name'],
      image: map['image'],
    );
    }

    String toJson() => json.encode(toMap());

    factory Category.fromJson(String source) =>
      Category.fromMap(json.decode(source));

    @override
    String toString() => 'Category(id: $id, name: $name, image: $image)';

    @override
    bool operator ==(Object other) {
    if (identical(this, other)) return true;

    return other is Category &&
        other.id == id &&
        other.name == name &&
        other.image == image;
    }

    @override
    int get hashCode => id.hashCode ^ name.hashCode ^ image.hashCode;
    }

分类.dart

    import 'package:flutter/material.dart';
    import 'package:flutter/services.dart';
    import 'dart:convert';
    import 'package:citimart/models/category_model.dart';

    class HomeCategories extends StatefulWidget {
    @override
    _HomeCategoriesState createState() => _HomeCategoriesState();
    }

    class _HomeCategoriesState extends State<HomeCategories> {
    void initState() {
    super.initState();
    loadData();
    }

    loadData() async {
    await Future.delayed(Duration(seconds: 2));
    final categoryJson =
        await rootBundle.loadString("assets/files/categories.json");
    final decodedData = jsonDecode(categoryJson);
    var categoriesData = decodedData["categories"];
    CategoryModel.categories = List.from(categoriesData)
        .map<Category>((category) => Category.fromMap(category))
        .toList();
    setState(() {});
    }

标签: flutterdartflutter-layout

解决方案


您必须初始化CategoryModel.categories变量,因为此变量已被定义为 anon-nullable它不能像 this 那样保持未初始化状态null

您应该更新模型类并为类别设置初始值,例如

class CategoryModel { 
    static List<Category> categories = List.empty();
}


推荐阅读