In Dart, fields don't really have names. They are unnamed slots of memory where a value can be stored.
The name it's declared with is instead the name of the automatically generated getter and setter (if not final), *and* it can be used in a constructor on the same class to initialize the memory during object creation. The last case here is what you run into. Outside the class' constructors' initializers, all access to the field is through the getter and setter, which are instance members. In a constructor initializer list (or in an initializing formal), the object isn't available yet, and you can't call instance methods. And you can't initialize a superclass' private field memory directly, only the class itself can do that.
Apart from conflicting with a superclass' initializer, it can also conflict with an intermediate class' contract.
Consider this example:
class A {
int field;
}
/// An A where field can only take some values.
class B extends A {
final int minValue = 42;
void set field(int x) { validate(x); super.field = x; }
validate(int x) { if (x < minValue) throw "BADNESS"; };
}
class C extends B {
C(this.field); // won't work.
}
Now, if this was to work, and if you do "new C(21)", you are either bypassing B's override of the setter of "field" (which could be really dangerous), or you are using it, which you can't yet because the B part of the object hasn't even been initialized yet so minValue would be null at the time "this.field" is executed (Dart prevents you from ever having this happen).
So, it's for your own protection. :)