Dart - Prevent Instantiation of Class

If you have a Dart class that only contains static methods and constants, most likely you want to make the class to be non-instantiable. However, even if you don't provide any constructor, Dart creates an empty constructor for the class by default.

Creating Private Constructor to Prevent Instantiation

The solution is creating a private constructor. By declaring a private constructor, Flutter no longer creates the default constructor. To make the constructor private, you need to use _ (underscore) which means private. The example below creates a class named MyUtils with a private constructor as the only constructor.

  class MyUtils {
    static void printMessage() {


Calling the Constructor From Another File

If you try to call the default constructor from another file, you will get an error because the constructor is private.

  // The class MyUtils doesn't have a default constructor
  MyUtils myUtils = MyUtils();


The same also applies if you declare a class that extends MyUtils in a different file.

  // The superclass 'MyUtils' doesn't have a zero argument constructor
  class MyExtendedUtils extends MyUtils {}


It's also impossible to call the private constructor

  class MyExtendedUtils extends MyUtils {
// The class 'MyUtils' doesn't have a constructor named '_' MyExtendedUtils() : super._(); }


Since you declare a constructor in the class, you can't use it as a mixin.

  // Error: The class 'MyUtils' can't be used as a mixin because it declares a constructor
  class MyAnotherUtils extends Object with MyUtils


Calling the Constructor in The Same File

However, you can call the private constructor in the same file. 

  MyUtils myUtils = MyUtils._();


In the same file, you can also call the private constructor inside its subclass like the code below.

  class MyExtendedUtils extends MyUtils {
    MyExtendedUtils() : super._();


If you don't want the private constructor to be called successfully even from the same file, you can throw an error inside the private constructor.

  MyUtils._() {
    throw new AssertionError();


That's how to prevent instantiation of a class in Dart.