There is a basic tension between abstract data types (ADTs) and interfaces. The example is a manifestation of that.
Dart allows any class to be used as an interface. That means we don't need a separate concept of interface, it means you never have to decide whether to define a type as abstract class or an interface, and it means you don't need to duplicate the type hierarchy if you want to adhere to an interface discipline.
Alas, interfaces really fit best with object-based encapsulation. However, true object-based encapsulation is an austere discipline that is almost never found in familiar programming languages.
Tangent: Even Smalltalk does not really implement it; in Smalltalk, all fields are encapsulated, but all methods are public - which is why it is not at all annoying (contrary to what Bob said) but also not at all secure. Implementing right is an open design question; I'd argue that we have an answer for that in Newspeak, but that is actually still being researched.
Hence Dart does not implement object encapsulation. Like most mainstream languages it implements something like ADTs.
ADTs encapsulate on a per type basis. This always has inconsistencies (the issues in Java were legion, leading to papers, patents and a long, long bug tail).
In Dart, what happens is that if a type has private members, it can only be implemented outside its library if access to the private member is restricted to *this*. That is, the code assumes object-encapsulation. That way, no one ever attempt to access the private member on another instance, and in particular and instance that could come from an unrelated implementation. You can define an ADT, but then you cannot implement the type outside the abstraction - it just isn't something ADTs can do.
Dart lets you work either way. I discussed this in my very first presentation about Dart, at OOPSLA 2011. It's not new, and has not been a big issue in practice. It isn't pretty though.