flutter Dart:如何使用“可选链接”或默认值?

odopli94  于 2023-01-09  发布在  Flutter
关注(0)|答案(3)|浏览(174)

因为Flutter,我从TypeScript转到了Dart,我不能做最简单的事情真是难以置信。
我有style?.p?作为double?,我想读取它的值或使用0.0作为默认值。

EdgeInsets.all(style?.p != null ? style.p : 0.0))

......但是Dart说double?不能赋值给double。好吧,我使用这个三元表达式来检查null,但是我认为Dart在类型推断方面不如TypeScript聪明。

你知道吗?

63lcw9qa

63lcw9qa1#

尝试一下,您可以给予可选值,如(optionalVaribaleValue ?? DefaultValue),这样如果OptionalValue为空,则设置DefaultValue

EdgeInsets.all(style?.p ?? 0.0)
uelo1irk

uelo1irk2#

EdgeInsets.all(style?.p != null ? style.p : 0.0))不起作用的原因是only local variables can be type-promoted,而style.p不是局部变量。因此style.p仍然是double?,导致条件三元表达式的求值类型也是double?
style?.p赋给局部变量可以:

@override
void build(BuildContext context) {
  var p = style?.p;

  return ...
    padding: EdgeInsets.all(p != null ? p : 0));
}

但正如其他人所指出的(以及the Dart linter recommends),您应该更喜欢使用专用的空操作符:

padding: EdgeInsets.all(style?.p ?? 0);

其中,由于style?.p不会被计算多次(避免返回不同值的可能性),因此??可以计算为不可空类型。

4bbkushb

4bbkushb3#

您的style属性可以为空,加上p属性也可以为空,请尝试执行以下操作:

padding: style != null
            ? EdgeInsets.all(style!.p != null ? style!.p! : 0.0)
            : const EdgeInsets.all(0.0)

相关问题