拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 如何在工厂建构式中回传并保留null?

如何在工厂建构式中回传并保留null?

白鹭 - 2022-03-08 2077 0 0

我在迁移到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();
}

错误 :

如何在工厂建构式中回传并保留 null?

uj5u.com热心网友回复:

如果要保留 return 的旧行为null,只需使用static方法而不是factory建构式。(无论如何factory,建构式几乎没有为static方法提供任何优势。)这将是最简单和最直接的解决方法。

但是,如果您真的想禁止null,那么首先应该要求不可为空,ModelA.fromMap然后您需要继续呼叫链以使呼叫者检查值。在你的情况下:ModelB.fromMapmapnull

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 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *