【问题标题】:null-aware operator ? not recognized空感知运算符?未识别
【发布时间】:2022-12-16 23:10:44
【问题描述】:

不确定这是否是最好的方法,但我正在尝试根据一些过滤将单个列表转换为 3 个列表的列表以创建视图模型。

由于过滤器 (List.where) 可能返回 null,因此我正在尝试实现 null-aware (?) 和 if-null (??) 运算符。但是,这会被 IDE 标记为 Conditions must have a static type of 'bool'.

所以基本上我将 3 List<PropertyTask>s 添加到 List<List<PropertyTask>>,其中每个 List<PropertyTask> 都是应用于初始 List<PropertyTask> 的过滤器。

我的代码如下所示:

factory JobMasterEditViewmodel.fromDomain(JobMaster master)
    => JobMasterEditViewmodel(
    tasks: master.tasks == null
        ? null
        : List<List<JobMasterEditTaskViewModel>>
            .from([List<JobMasterEditTaskViewModel>
              .from(((List<PropertyTask>
                .from(master.tasks.where((t)
                  => t.taskType == PropertyTaskTypes.always)))? // null-aware
                  .map((tf) => JobMasterEditTaskViewModel.fromDomain(tf))?) ?? []), // if-null
            List<JobMasterEditTaskViewModel> // from here on without null-awareness
              .from(List<PropertyTask>
                .from(master.tasks.where((t)
                  => t.taskType == PropertyTaskTypes.inventory))
                    .map((tf) => JobMasterEditTaskViewModel.fromDomain(tf))),
            List<JobMasterEditTaskViewModel>
              .from(List<PropertyTask>
                .from(master.tasks.where((t)
                   => t.taskType == PropertyTaskTypes.periodically))
                    .map((tf) => JobMasterEditTaskViewModel.fromDomain(tf))),
            List<JobMasterEditTaskViewModel>
              .from(List<PropertyTask>
                .from(master.tasks.where((t)
                  => t.taskType == PropertyTaskTypes.onRequest))
                    .map((tf) => JobMasterEditTaskViewModel.fromDomain(tf))),
            ]),
);            

【问题讨论】:

  • 是否标记了 if-null?哪个特定的代码部分会被 IDE 标记?
  • (List&lt;PropertyTask&gt;.from(master.tasks.where((t) =&gt; t.taskType == PropertyTaskTypes.always))) 有错误文本。 ?) ?? [] 中的 ) 标记 Expected to find ':'.,这是由于错误地将 ? 理解为条件而不是 null-aware

标签: flutter dart dart-null-safety


【解决方案1】:

该列表永远不会为空,因此尝试使代码具有空值意识会导致编译器将其误解为三元运算符。如果删除空感知代码,错误也会被删除。

如果输入的任何值的代码都不能为 null(这不能;List documentation 表明它不能返回 null),那么尝试向其添加 null 感知代码将导致编译器感到困惑。


factory JobMasterEditViewmodel.fromDomain(JobMaster master)
    => JobMasterEditViewmodel(
    tasks: master.tasks == null
        ? null
        : List<List<JobMasterEditTaskViewModel>>
            .from([List<JobMasterEditTaskViewModel>
              .from(((List<PropertyTask>
                .from(master.tasks.where((t)
                  => t.taskType == PropertyTaskTypes.always))) 
                  .map((tf) => JobMasterEditTaskViewModel.fromDomain(tf)))), 
            List<JobMasterEditTaskViewModel> 
              .from(List<PropertyTask>
                .from(master.tasks.where((t)
                  => t.taskType == PropertyTaskTypes.inventory))
                    .map((tf) => JobMasterEditTaskViewModel.fromDomain(tf))),
            List<JobMasterEditTaskViewModel>
              .from(List<PropertyTask>
                .from(master.tasks.where((t)
                   => t.taskType == PropertyTaskTypes.periodically))
                    .map((tf) => JobMasterEditTaskViewModel.fromDomain(tf))),
            List<JobMasterEditTaskViewModel>
              .from(List<PropertyTask>
                .from(master.tasks.where((t)
                  => t.taskType == PropertyTaskTypes.onRequest))
                    .map((tf) => JobMasterEditTaskViewModel.fromDomain(tf))),
            ]),
); 

【讨论】:

  • 谢谢,你是完全正确的。不知何故,我假设.where()如果没有找到任何东西就会返回null。但我刚刚在 DartPad 上查了一下,它是[ ]。也许我应该早点质疑这个假设……
猜你喜欢
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 2014-03-01
  • 2017-11-05
  • 2018-12-10
  • 2015-05-09
  • 1970-01-01
  • 2020-09-09
相关资源
最近更新 更多