How do Dart mixins work and what are the restrictions?
TL;DR: Mixins allow sharing methods across class hierarchies without inheritance. The 'on' keyword restricts which classes can use a mixin. Dart uses C3 linearization to resolve method order when multiple mixins are applied.
Full Answer
Dart mixins add capabilities to classes without the tight coupling of inheritance. Unlike extending a class, you can apply multiple mixins to one class.
The 'on' constraint
mixin MyMixin on SomeClass means MyMixin can only be applied to classes that extend SomeClass. Inside the mixin, you can call super.method() knowing SomeClass has it.
Linearization order
class A extends B with C, D — method resolution order is: A → D → C → B. The rightmost mixin wins in case of conflict. This is C3 linearization (same as Python's MRO).
Flutter uses mixins extensively: SingleTickerProviderStateMixin, WidgetsBindingObserver, DiagnosticableMixin. They add capabilities to State without requiring inheritance.
Code Examples
Breathing... Breathing... Swimming! Breathing... Flying!
Interview Tip
Mixins differ from interfaces: mixins provide implementation, interfaces provide contracts. Mixins differ from abstract classes: you can use multiple mixins but only extend one class.