Flutter空安全报错:参数'id'不可为null及添加required后新问题求助
Flutter空安全参数非空报错解决方案
问题核心
你遇到的报错完全是**Flutter空安全(Null Safety)**的规则导致的:
- 你的
Item类成员变量都是final非空类型(num、String),但构造函数用了可选命名参数(带{}),这类参数默认隐式为null,违反了非空类型的初始化要求。 - 添加
required修饰符后出现新错误,是因为调用Item时用了位置参数,但构造函数定义的是命名参数,两者不匹配。
修复方案
以下两种方案任选其一:
方案一:命名参数+required(推荐,符合空安全规范)
给所有非空参数添加required修饰,调用时改用命名参数传值:
import 'package:flutter/material.dart'; class CatalogModel { static final items = [ Item( id: 1, name: "iPhone 12", desc: "Apple 12th Gen", price: 999, color: "White", image: "assets/images/iphone12b.jpg", ) ]; } class Item { final num id; final String name; final String desc; final num price; final String color; final String image; Item({ required this.id, required this.name, required this.desc, required this.price, required this.color, required this.image, }); factory Item.fromMap(Map<String, dynamic> map) { return Item( id: map["id"], name: map["name"], desc: map["desc"], price: map["price"], color: map["color"], image: map["image"], ); } Map<String, dynamic> toMap() => { "id": id, "name": name, "desc": desc, "price": price, "color": color, "image": image, }; }
方案二:位置参数(保持原有调用习惯)
去掉构造函数的{},改用位置参数定义,匹配你原来的调用方式:
import 'package:flutter/material.dart'; class CatalogModel { static final items = [ Item( 1, "iPhone 12", "Apple 12th Gen", 999, "White", "assets/images/iphone12b.jpg", ) ]; } class Item { final num id; final String name; final String desc; final num price; final String color; final String image; Item(this.id, this.name, this.desc, this.price, this.color, this.image); factory Item.fromMap(Map<String, dynamic> map) { return Item( map["id"], map["name"], map["desc"], map["price"], map["color"], map["image"], ); } Map<String, dynamic> toMap() => { "id": id, "name": name, "desc": desc, "price": price, "color": color, "image": image, }; }
补充说明
- 空安全是Flutter 2.0+的强制特性,非空类型变量必须初始化时赋值,或标记为可空(类型后加
?,比如num? id)。 - 如果成员变量允许为null,可加
?标记,但使用时要注意处理null的情况(比如用id!强制解包或id ?? 默认值)。
内容的提问来源于stack exchange,提问作者Tahmeed Zamindar
相关产品推荐
相关产品推荐

