Flutter中Shared Preferences出现_CastError空值检查错误求助
解决
_CastError (Null check operator used on a null value)错误 你的错误根源在于Settings类的构造函数没有将传入的参数赋值给类的成员变量,导致创建Settings对象后,所有属性都是null,调用saveSettings时,settings.programmingLanguages!的空强制解包触发了错误。
具体修复步骤:
1. 修复models.dart中的Settings类
原来的构造函数仅声明了必填参数,但没有把参数赋值给类的属性,修改成以下两种方式之一:
方式一(推荐,符合空安全最佳实践):
将成员变量设为非空final,通过初始化列表直接绑定参数:
enum Gender { FEMALE, MALE, OTHER } enum ProgrammingLanguage { DART, JAVASCRIPT, KOTLIN, SWIFT } class Settings { final String username; final Gender gender; final Set<ProgrammingLanguage> programmingLanguages; final bool isEmployed; Settings({ required this.username, required this.gender, required this.programmingLanguages, required this.isEmployed, }); }
方式二(保留可空成员变量):
手动在构造函数内给成员变量赋值:
enum Gender { FEMALE, MALE, OTHER } enum ProgrammingLanguage { DART, JAVASCRIPT, KOTLIN, SWIFT } class Settings { String? username; Gender? gender; Set<ProgrammingLanguage>? programmingLanguages; bool? isEmployed; Settings({ required String username, required Gender gender, required Set<ProgrammingLanguage> programmingLanguages, required bool isEmployed, }) { this.username = username; this.gender = gender; this.programmingLanguages = programmingLanguages; this.isEmployed = isEmployed; } }
2. 调整preferences-service.dart的代码
如果用方式一(非空成员变量),可以去掉空强制解包符!,让代码更安全:
await preferences.setStringList( 'ProgrammingLanguages', settings.programmingLanguages .map((lang) => lang.index.toString()) .toList(), );
错误原因解释
你创建Settings对象时,虽然传入了username、gender等参数,但原来的构造函数没有把这些值赋给类的属性,导致settings.programmingLanguages实际是null。当你用!强制解包null值时,就会触发Null check operator used on a null value错误。
内容的提问来源于stack exchange,提问作者Christof
相关产品推荐
相关产品推荐

