Parameter Declarations Changes in Dart 3.13: Detailed Syntax & Migration
Explore parameter declarations changes in Dart 3.13 primary constructors, converting this.x in signatures, named parameters, default values, and migration rules.
Published on • October 24, 2026
AI Assistant

Dart 3.13 introduces fundamental changes to constructor parameter declarations by unifying class header declarations with primary constructor parameter signatures. This evolution reduces boilerplate code in data models, Flutter widgets, and domain entities.
In this deep dive, we examine how parameter declarations work in Dart 3.13, key syntax updates, and migration strategies for existing projects.
Evolution of Primary Constructor Parameters
Prior to Dart 3.13, declaring instance fields alongside constructor parameters required writing field declarations in the class body and duplicating field names in the constructor signature:
// Legacy Dart constructor syntax
class UserProfile {
final String id;
final String username;
final String email;
UserProfile({
required this.id,
required this.username,
this.email = 'guest@example.com',
});
}
In Dart 3.13, parameter declarations can be attached directly to the class header declaration:
// Dart 3.13 Primary Constructor syntax
class UserProfile(
this.id,
this.username, {
this.email = 'guest@example.com',
}) {
final String id;
final String username;
final String email;
}
Parameter Declaration Rules in Dart 3.13
- Initializing Formals (
this.x): Parameters declared withthis.directly bind to instance fields declared within the class body. - Declaring Parameters: If a parameter in the primary constructor header omits
this., it acts as a constructor argument used during initialization (such as computing derived properties):
class Circle(double radius) {
final double radius;
final double area = 3.14159 * radius * radius;
}
- Super Parameters (
super.key): Flutter widgets declared with primary constructors pass super parameters cleanly to parent classes:
class CustomCard(
this.title, {
super.key,
}) extends StatelessWidget {
final String title;
@override
Widget build(BuildContext context) {
return Card(child: Text(title));
}
}
Migration & Linter Enforcement
To automatically modernize legacy constructors across your Flutter project, update your analysis_options.yaml to enforce new linter rules:
# analysis_options.yaml
linter:
rules:
- use_declaring_parameters
- unnecessary_primary_constructor_body
- unnecessary_type_name_in_constructor
Run dart fix --apply in your terminal to automatically convert class initializers to Dart 3.13 primary constructor declarations.
Summary
Dart 3.13 parameter declaration improvements eliminate redundant field typing and parameter repetition while maintaining full soundness and compatibility with Flutter’s widget architecture.