【问题标题】:How to resolve non-nullable error in Flutter?如何解决 Flutter 中不可为空的错误?
【发布时间】:2021-09-16 10:42:50
【问题描述】:

我是 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;
    }

Categoroes.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(() {});
    }

【问题讨论】:

  • 您遇到的错误是什么?请在您的问题中添加确切的错误。
  • 我已经添加了确切的错误

标签: flutter dart flutter-layout


【解决方案1】:

您必须初始化 CategoryModel.categories 变量,因为该变量已被定义为 non-nullable,它不能保持未初始化状态,因为它是 null

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

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

【讨论】:

    【解决方案2】:

    您的变量static List&lt;Category&gt; categories;List&lt;Category&gt; 类型。由于它不可为空,它所持有的值永远不能为空。所以从初始化你需要提供一个值。

    您可以通过几种方式解决此问题。最简单的方法是给出一个初始值:

    static List<Category> categories = [];
    

    在不提供初始值的情况下处理此问题的其他方法是使变量可为空,或使用后期初始化关键字对其进行标记。要阅读更多内容,请查看官方文档here

    【讨论】:

      猜你喜欢
      • 2022-10-02
      • 2022-11-03
      • 2022-07-19
      • 2022-08-19
      • 2021-11-11
      • 1970-01-01
      • 2021-07-01
      • 2021-09-24
      • 2019-02-10
      相关资源
      最近更新 更多