【问题标题】:Is there a better way to test for null in Dart constructor在 Dart 构造函数中是否有更好的方法来测试 null
【发布时间】:2018-06-16 17:17:23
【问题描述】:

我正在使用以下构造函数构造一个对象:

 class A {
   int col;
   int row;

   A.fromMap(Map<dynamic, dynamic> data)
       : col = data['col'],
         row = data['row'];
 }

 class B {
   A aObj;
   int objType;
   int count;

   B.fromMap(Map<dynamic, dynamic> data)
       : objType = data['objType'],
         count = data['count'],
         aObj = A.fromMap(data['A']);
 }

问题是,如果我传入的地图没有 aObj 的映射,它就会崩溃。我尝试将作业移到大括号中并测试 null:

 if(data['A'] != null) {
    aObj = A.fromMap(data['A']);
 }

这行得通。但我想像在其他数据成员中一样,作为捷径构造函数的一部分进行测试。

这可能吗?

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    我认为如何以一种简洁的方式防止崩溃是这样的:

    aObj = A.fromMap(data['A'] ?? Map())
    

    data['A']null 时,这将向您的自定义A.fromMap 构造函数返回一个empty Map,这将导致col 和@ 987654327@ 之后是null(如果data['A']null),因为Map 中不存在这些字段。

    【讨论】:

      【解决方案2】:

      三元运算符呢?

      aObj = data['A'] ? A.fromMap(data['A']) : null;
      

      【讨论】:

      • 我更喜欢这个想法,因为它不会创建空/空对象。问题是,当我尝试它时,我收到以下错误:type '_InternalLinkedHashMap' is not a subtype of 'bool'。使用此技术读取字符串/整数数组时,我遇到了类似的错误。有什么想法吗?
      • 我能想到的最好的事情是:aObj = data['A'] != null ? A.fromMap(data['A']) : null: 这和我开始的时候并没有什么不同,但它可以放在一行上。
      【解决方案3】:

      随着 Dart 2.8 中引入的 NNBD,您可以使用:

      class Foo {
        final int value;
      
        // 0 is the default value in case the expression data['key'] returns null
        Foo.fromNonNullable(Map data) : value = data['key'] ?? 0;
      
        // 0 is the default value in case `data` is `null`
        Foo.fromNullable(Map? data) : value = data?['key'] ?? 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多