Dart Mixins
last modified February 15, 2025
In this article, we show how to use mixins in Dart language. Mixins are a way to reuse code across multiple class hierarchies without using inheritance. They allow you to add functionality to a class without creating a full parent-child relationship.
Mixins are particularly useful when you want to share behavior between classes
that don't share a common ancestor. They are declared using the
mixin keyword and can be added to a class using the
with keyword.
Dart Mixins Simple Example
The following example demonstrates how to create and use a simple mixin in Dart.
mixin Logging {
void log(String message) {
print('Log: $message');
}
}
class User with Logging {
String name;
User(this.name);
void greet() {
log('User $name says hello!');
}
}
void main() {
final user = User('Alice');
user.greet();
}
In this program, we define a mixin Logging that provides a
log method. We then use this mixin in the User class
to log a greeting message.
mixin Logging {
void log(String message) {
print('Log: $message');
}
}
We define a mixin named Logging that contains a log
method.
class User with Logging {
String name;
User(this.name);
void greet() {
log('User $name says hello!');
}
}
We create a User class that uses the Logging mixin
with the with keyword. The greet method uses the
log method from the mixin.
void main() {
final user = User('Alice');
user.greet();
}
We create an instance of the User class and call the
greet method, which logs a message.
$ dart main.dart Log: User Alice says hello!
Dart Mixins with Multiple Classes
Mixins can be used with multiple classes to share common behavior.
mixin Logging {
void log(String message) {
print('Log: $message');
}
}
class User with Logging {
String name;
User(this.name);
void greet() {
log('User $name says hello!');
}
}
class Admin with Logging {
String name;
Admin(this.name);
void announce() {
log('Admin $name makes an announcement!');
}
}
void main() {
final user = User('Alice');
user.greet();
final admin = Admin('Bob');
admin.announce();
}
In this program, we use the Logging mixin in both the
User and Admin classes to share logging functionality.
class User with Logging {
String name;
User(this.name);
void greet() {
log('User $name says hello!');
}
}
class Admin with Logging {
String name;
Admin(this.name);
void announce() {
log('Admin $name makes an announcement!');
}
}
Both the User and Admin classes use the
Logging mixin to log messages.
$ dart main.dart Log: User Alice says hello! Log: Admin Bob makes an announcement!
Dart Mixins with Overriding
Mixins can override methods from the classes they are used in.
mixin Logging {
void log(String message) {
print('Log: $message');
}
}
class User with Logging {
String name;
User(this.name);
void log(String message) {
print('User Log: $message');
}
void greet() {
log('User $name says hello!');
}
}
void main() {
final user = User('Alice');
user.greet();
}
In this program, the User class overrides the log
method from the Logging mixin.
void log(String message) {
print('User Log: $message');
}
The User class overrides the log method to provide
custom logging behavior.
$ dart main.dart User Log: User Alice says hello!
Dart Mixins with Constraints
Mixins can specify constraints using the on keyword to restrict
their usage to specific classes.
class Person {
String name;
Person(this.name);
}
mixin Logging on Person {
void log(String message) {
print('Log: $name says $message');
}
}
class User extends Person with Logging {
User(String name) : super(name);
void greet() {
log('Hello!');
}
}
void main() {
final user = User('Alice');
user.greet();
}
In this program, the Logging mixin is constrained to be used only
with classes that extend Person.
mixin Logging on Person {
void log(String message) {
print('Log: $name says $message');
}
}
The Logging mixin uses the on keyword to specify that
it can only be used with classes that extend Person.
class User extends Person with Logging {
User(String name) : super(name);
void greet() {
log('Hello!');
}
}
The User class extends Person and uses the Logging mixin.
$ dart main.dart Log: Alice says Hello!
Source
Dart Mixins - Language Documentation
In this article, we have covered the basics of using mixins in Dart. Mixins are a powerful feature for code reuse and can be used to share behavior across multiple classes.
Author
List all Dart tutorials.