Symbol constructor Null safety

const Symbol(
  1. String name

Constructs a new Symbol representing the provided name.

Symbols created from equal name strings are themselves equal. If the symbols are created using const, symbols with the same name strings are canonicalized and identical.

Some name strings create symbols which can also be created using a symbol literal, or be implicitly created while running Dart programs, for example through Object.noSuchMethod.

If name is a single Dart identifier that does not start with an underscore, or it is a qualified identifier (multiple identifiers separated by .s), or it is the name of a user definable operator different from unary- (one of "+", "-", "*", "/", "%", "~/", "&", "|", "^", "~", "<<", ">>", ">>>", "<", "<=", ">", ">=", "==", "[]", or "[]="), then the result of Symbol(name) is equal to the symbol literal created by prefixing # to the contents of name, and const Symbol(name) is identical to that symbol literal. That is #foo == Symbol("foo") and identical(#foo, const Symbol("foo")).

If name is a single identifier that does not start with an underscore followed by a =, then the symbol is a setter name, and can be equal to the Invocation.memberName in an Object.noSuchMethod invocation.

Private symbol literals, like #_foo, cannot be created using the symbol constructor. A symbol like const Symbol("_foo") is not equal to any symbol literal, or to any source name symbol introduced by noSuchMethod.

assert(Symbol("foo") == Symbol("foo"));
assert(Symbol("foo") == #foo);
assert(identical(const Symbol("foo"), const Symbol("foo")));
assert(identical(const Symbol("foo"), #foo));
assert(Symbol("[]=") == #[]=]);
assert(identical(const Symbol("[]="), #[]=));
assert(Symbol("") ==;
assert(identical(const Symbol(""),;

The created instance overrides Object.==.


const factory Symbol(String name) = internal.Symbol;