我在迁移到Flutter 的 null-safety时遇到问题,我知道在工厂中它不应该再return null
这样 Ireturn throw ArgumentError("")
了,但是在我的服务中,我将canvas的值设为null,这就是它发送错误的地方,但是什么我想要的是继续应用程序并将该值保留为null。
为了更好地解释它;我有两个模型,ModelA有一个名为ModelBcanva
型别的变量。当我向ModelA发送资料映射时,变量从服务器到达null,因此它输入一个条件并给出错误。canva
型号A:
class ModelA extends A {
ModelA ({
required ModelB? background,
required ModelB? canvas,
}) : super(
background,
canvas,
);
factory ModelA.fromMap(Map<String, dynamic>? map) {
if (map == null) throw ArgumentError('ModelA map must not be null');
return ModelA(
background: ModelB.fromMap(map['background']), // go in with not-null service value
canvas: ModelB.fromMap(map['canvas']), // go in with null service value
);
}
}
型号B:
class ModelB extends B {
ModelB({
String? content,
}) : super(
content;
);
factory ModelB.fromMap(Map<String, dynamic>? map) {
// * before the migration null-safety
// if (map == null) return null
if (map == null) throw ArgumentError('ModelB map must not be null'); // enter here (error)
return ModelB(
content: map['content'],
);
}
}
错误发生后,我进入我的应用程序没有任何问题,但它不再运行我的功能......
这是我进行编程以保存并回传我的完整ModelA的地方。
final someList = List<ModelA>.from(
listFromServer.where((i) {
return (i['someType'] == 1));
}).map(
(i) {
print("enter here");
final isBackOrCan = i['background'] ?? i['canvas'];
if (isBackOrCan != null) {
newListModelB
.add(ModelB.fromMap(isBackOrCan));
}
return ModelA.fromMap(i); // enter here the map background not null and also the canva null
},
),
);
[ ... more code that i want to continue ...]
} catch (e) {
print(e); // the message
throw CacheException();
}
错误 :
uj5u.com热心网友回复:
如果要保留 return 的旧行为null
,只需使用static
方法而不是factory
建构式。(无论如何factory
,建构式几乎没有为static
方法提供任何优势。)这将是最简单和最直接的解决方法。
但是,如果您真的想禁止null
,那么首先应该要求不可为空,ModelA.fromMap
然后您需要继续呼叫链以使呼叫者检查值。在你的情况下:ModelB.fromMap
map
null
class ModelA extends A {
ModelA({
required ModelB? background,
required ModelB? canvas,
}) : super(
background,
canvas,
);
factory ModelA.fromMap(Map<String, dynamic> map) {
var background = map['background'];
var canvas = map['canvas'];
return ModelA(
background: background == null
? null
: ModelB.fromMap(background), // go in with not-null service value
canvas: canvas == null
? null
: ModelB.fromMap(canvas), // go in with null service value
);
}
}
0 评论