I had to double check this, because basically the only use of symbols in any languages is to provide a constant value you can treat as an internalized string (like Common Lisp keywords, for example). The would be entirely useless if that were not the case.
Luckily, the current Dart specification does guarantee this (section 17.8):
"Assume that i ∈ 1, 2, and that oi is the value of a constant expression which
is a symbol based on the string si. If s1 == s2 then o1 and o2 is the same object.
That is, symbol instances are canonicalized."
Apparently, there's even special treatment for "private symbols", which are only the same object "in the same library". TIL.
Source: https://spec.dart.dev/DartLangSpecDraft.pdf
EDIT: there's even a whole sentence justifying the existence of symbols as being related to reflection, actually... they say Dart literal Strings are already "canonicalized" so that fact about Symbols is not enough for that.... hence you're right that String literals are just as good for the use-cases I had in mind. I guess I will use String literals from now on after all.
EDIT 2:
> I'm not sure exactly what you mean by "need"
Hopefully it's clear what I "needed" now... basically, interned Strings to avoid wastefully comparing bytes when a pointer comparison would suffice as all values are known at compile-time.