I'm coming from TypeScript to Dart because of Flutter and It's incredible how I can't do the simplest of things.
I have style?.p? as double? and I would like to read its value or use 0.0 as a default. Like this:
EdgeInsets.all(style?.p != null ? style.p : 0.0))
... but Dart is saying double? can't be assigned to double. Well, I'm using this ternary expression to check for null, but I think Dart is not as smart as TypeScript in type inference.
Any idea?
CodePudding user response:
try this you can give the optional value like (optionalVaribaleValue ?? DefaultValue) so if OptionalValue null then DefaultValue set
EdgeInsets.all(style?.p ?? 0.0)
CodePudding user response:
The reason why EdgeInsets.all(style?.p != null ? style.p : 0.0)) doesn't work is because only local variables can be type-promoted, and style.p is not a local variable. style.p therefore remains a double?, causing the evaluated type of the conditional ternary expression to also be double?.
Assigning style?.p to a local variable would work:
@override
void build(BuildContext context) {
var p = style?.p;
return ...
padding: EdgeInsets.all(p != null ? p : 0));
}
but as others have noted (and as the Dart linter recommends), you should prefer using a dedicated null operator:
padding: EdgeInsets.all(style?.p ?? 0);
where, because style?.p will not be evaluated multiple times (avoiding the potential for returning different values), ?? can evaluate to a non-nullable type.
CodePudding user response:
Your style attribute is nullable plus the p property is nullable too, try doing this:
padding: style != null
? EdgeInsets.all(style!.p != null ? style!.p! : 0.0)
: const EdgeInsets.all(0.0)

