Coding/Learn/dart/dart class modifiers
Dart & Flutter Engineering Complete Course
01.Introduction & Execution Architecture
02.Syntax, Statements & Code Organization
03.Variables, Type Inference, final & const
04.Core Built-In Types: int, double, num, bool, String
05.String Interpolation, Multiline & Raw Strings
06.Operators: Arithmetic, Type Test, Ternary & Cascade
07.Conditional Branching: if, else if, else & Guards
08.Loops: standard for, for-in, while & do-while
09.Switch Statements, Switch Expressions & Exhaustiveness
10.Loop Control: break, continue & Labeled Jumps
11.Pattern Matching & Destructuring in Dart 3
12.Error Handling: try, catch, on, finally & assert
13.Functions, Return Types & Arrow Syntax (=>)
14.Named Parameters & the required Keyword
15.Optional Positional Parameters & Default Values
16.Anonymous Functions, Lambdas & typedefs
17.Lexical Scope & Stateful Closures
18.Synchronous Generators: sync* and yield
19.Lists: Fixed-Length, Growable & Index Operations
20.Sets: Unique Values & Set Theory Algebra
21.Maps: Key-Value Dictionaries & Lookups
22.Collection-if, Collection-for & Spread Operators
23.Iterables & Higher-Order Methods: map, where, fold
24.Generics: Type Parameters, Bounds & Methods
25.Classes & Objects: Members, Instance Methods & this
26.Constructors: Initializing Formals & Initializer Lists
27.Named, Redirecting & Factory Constructors
28.Const Constructors & Canonical Instance Caching
29.Getters, Setters & Private Fields (_)
30.Inheritance, Method Overriding (@override) & super
31.Abstract Classes & Method Contracts
32.Implicit Interfaces & the implements Keyword
33.Mixins: Multi-Source Composition with with & on
34.Extension Methods: Extending External APIs
35.Extension Types: Zero-Cost Inline Wrappers in Dart 3.3
36.Enhanced Enums with Fields, Methods & Patterns
37.Records: Anonymous Composite Tuples in Dart 3
38.Class Modifiers: sealed, final, base & interface
39.Sound Null Safety: Core Architecture
40.Nullable Types (Type?) & Non-Nullable Invariants
41.Null-Aware Operators: ?., ??, ??=, ?.. & ?[]
42.Null Assertion Operator (!) & Safe Invariants
43.The late Keyword: Lazy Initialization & Late Final
44.Type Promotion & Flow Analysis
45.Event Loop & Microtask Queue Architecture
46.Futures, async & await: Asynchronous Foundations
47.Future Combinators: wait, any, delayed & timeout
48.Streams: Asynchronous Data Flows & StreamControllers
49.Stream Transformers & Asynchronous Generators (async*)
50.Isolates: Multi-Core Concurrency & Isolate.run()
51.Packages & pubspec.yaml: Dependency Management
52.Libraries, Namespaces & Barrel Exports
53.Unit Testing with package:test & Matchers
54.Async Testing, Stream Tests & Fixtures
55.Effective Dart Guidelines & Linter Optimization
56.Comprehensive Dart Exercises & Algorithm Challenges
57.& Flutter Architecture Assessment & Knowledge Check
58.Capstone Project: Reactive State Machine & Stream Event Hub
59.Mastery Certification & Verified Graduate Credential
Course Certificate0%

Complete all lessons to earn

LearnClass Modifiers: sealed, final, base & interface
38 / 59 0%
Lesson 38 of 59
5 mins read

Class Modifiers: sealed, final, base & interface

PreviousNext Lesson
In Plain English

Dart 3 introduced fine-grained **Class Modifiers** to control how classes can be used across library boundaries. **`sealed`** creates closed algebraic data type hierarchies with exhaustive pattern matching; **`final`** disallows external subtyping; **`base`** enforces inheritance without implementation; and **`interface`** allows implementation without extension.

The Mental Model

"Class modifiers are like property zoning laws: "Residential Only" (interface) means you can build a house that looks like the blueprint, while "Historical Landmark" (final) means nobody is allowed to alter or extend the structure."

Deep Dive: How It Works

`sealed`: All subclasses must be declared in the same library file. Enables compiler exhaustiveness in switch expressions.

`final`: Outside the defining library, the class cannot be extended, implemented, or mixed in.

`base`: Outside the defining library, classes can only `extend` (preserving base constructor invariants), disallowing `implements`.

`interface`: Outside the defining library, classes can only `implements`, disallowing `extends`.

Syntax Blueprint

// Sealed hierarchy for state
sealed class ViewState {}
class Loading extends ViewState {}
class Success extends ViewState { final String data; Success(this.data); }
class Failure extends ViewState { final String err; Failure(this.err); }

Sealed class establishing an exhaustive state hierarchy.

PointCore Rules to Remember

Point star
Exhaustive Sealed Classes: Switches on sealed classes require no default case; missing subtypes cause compile errors.
Point star
API Boundary Control: Prevent consumers from breaking internal class assumptions.
Point star
Algebraic Data Types (ADT): The standard architectural pattern for modern state management in Flutter.

Common Beginner Traps & How to Fix Them

Mistake:Trying to extend a `sealed` class in a different `.dart` file.

Why it happens: Sealed classes require all subtypes to be defined in the same file to guarantee compile-time exhaustiveness.

How to fix: Define all subtypes of the sealed class in the same file.

Pro Tip: Use `sealed class` for UI states (Loading, Data, Error) to guarantee all states are handled by your widget rendering logic.

Live Interactive Example

Hit Run Code to see it live
Sealed Class Hierarchy and Exhaustive Switch
Python 3.12
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Output Console
Click "Run Code" to view the rendered output.
How it works: The sealed class enabled clean object destructuring and exhaustive compiler validation in switch expression.

Your Turn: Micro Challenge

No pressure! Edit the starter code below and test your solution with instant feedback.

Micro Exercise

Define Sealed Auth State

  • PointDefine `sealed class AuthState {}`.
  • PointDefine `class AuthLoggedIn extends AuthState {}` and `class AuthLoggedOut extends AuthState {}`.
  • PointWrite function `String getAuthText(AuthState s) => switch (s) { AuthLoggedIn() => "IN", AuthLoggedOut() => "OUT" };`.
  • PointIn `main()`, print `Auth: ${getAuthText(AuthLoggedIn())}`.
1
2
Sandbox Output
Click "Run & Check" to test your solution.

Finished reading and practicing?

Mark this lesson as completed to update your course progress.

PreviousNext Lesson
Overview100 SheetLearnCertificates