Flutter空安全下id设空字符串不识别为null导致逻辑错误如何解决?
解决方案
你遇到的问题根源是目前Products_class的id属性为非空字符串类型,无法赋值null,只能用空字符串占位,而你现有逻辑判断的是id == null,永远不会命中新增分支,默认会走更新逻辑导致报错。可按以下两种方案解决:
方案1:调整模型类为可空类型(推荐)
这是最符合空安全规范的写法,直接将id声明为可空字符串类型:
class Products_class { // 将原String id修改为可空类型String? final String? id; final String title; final double price; final String description; final String imgurl; Products_class({ this.id, // 可选参数默认值为null,无需手动赋值 required this.title, required this.price, required this.description, required this.imgurl, }); }
调整后初始化产品实例时可直接赋值null:
var editedproduct = Products_class( id: null, title: '', price: 0.0, description: '', imgurl: '', );
同时修改_saveform方法的判断逻辑为if-else,避免两个独立判断可能出现的逻辑冲突:
void _saveform() { bool isValid = _form.currentState!.validate(); if (!isValid) { return; } _form.currentState!.save(); if (editedproduct.id == null) { Provider.of<products>(context, listen: false).addproduct(editedproduct); } else { // 确认非空后添加!标识告知编译器无需做空安全检查 Provider.of<products>(context, listen: false) .updateProduct(editedproduct.id!, editedproduct); } Navigator.of(context).pop(); }
方案2:不改模型类,调整判断条件
如果不想改动Products_class的定义,直接将原判断id == null替换为判断空字符串即可,同时同样要修改为if-else结构:
void _saveform() { bool isValid = _form.currentState!.validate(); if (!isValid) { return; } _form.currentState!.save(); if (editedproduct.id.isEmpty) { Provider.of<products>(context, listen: false).addproduct(editedproduct); } else { Provider.of<products>(context, listen: false) .updateProduct(editedproduct.id, editedproduct); } Navigator.of(context).pop(); }
内容的提问来源于stack exchange,提问作者Nouman Khan
相关产品推荐
相关产品推荐

