When is const optional in Dart 2?


In Dart Object() constructor is declared as const so:

identical(const Object(), const Object()); //true

I know that in Dart 2 the keyword const is optional and I thought that the previous statement was equivalent to:

identical(Object(), Object()); //false

But actually it seems to be equivalent to:

identical(new Object(), new Object()); //false

Now my doubts are:

1) When is const keyword optional?

2) Is there any way to ensure instances of my classes to be always constant without const keyword? So that I can obtain:

indentical(MyClass(), MyClass()); //true (is it possible?)


Dart 2 allows you to omit new everywhere. Anywhere you used to write new, you can now omit it.

Dart 2 also allows you to omit const in positions where it’s implied by the context. Those positions are:

  • Inside a const object creations, map or list literal (const [1, [2, 3]]).
  • Inside a const object creation in metadata (@Foo(Bar()))
  • In the initializer expression of a const variable (const x = [1];).
  • In a switch case expression (case Foo(2):...).

There are two other locations where the language requires constant expressions, but which are not automatically made constant (for various reasons):

  1. Optional parameter default values
  2. initializer expressions of final fields in classes with const constructors

1 is not made const because we want to keep the option of making those expressions not need to be const in the future. 2 is because it’s a non-local constraint – there is nothing around the expression that signifies that it must be const, so it’s too easy to, e.g., remove the const from the constructor without noticing that it changes the behavior of the field initializer.

Answered By – lrn

Answer Checked By – Gilberto Lyons (FlutterFixes Admin)

Leave a Reply

Your email address will not be published. Required fields are marked *