Stop LateInitializationError at compile time.
Dart analyzer plugin that bans unsafe late usage. Only allows late for lazy initialization. Everything else is a compile error.
late without immediate initialization causes runtime exceptions:
late String name; // 💣 Bomb waiting to explode
String greet() => 'Hello $name'; // 💥 LateInitializationError!This plugin makes unsafe late usage a compile-time error:
late String name; // ❌ ERROR: Uninitialized late variableJust add the package and put this in your analysis_options
analyzer:
plugins:
- custom_lint// ❌ Uninitialized late
late String userName;
// ❌ Simple literals (no lazy benefit)
late String title = "Hello";
late int count = 42;
// ❌ Simple identifiers
late var copy = originalValue;// ✅ Expensive computations
late final primes = calculatePrimes(1000000);
// ✅ Method/constructor calls
late final db = Database.connect();
late final timestamp = DateTime.now();
// ✅ Complex expressions
late final sum = numbers.fold(0, (a, b) => a + b);class _MyWidgetState extends State<MyWidget> {
late AnimationController controller;
@override
void initState() {
super.initState();
controller = AnimationController(vsync: this);
}
// If initState fails, controller.dispose() crashes
}class _MyWidgetState extends State<MyWidget> {
AnimationController? controller;
@override
void initState() {
super.initState();
controller = AnimationController(vsync: this);
}
@override
void dispose() {
controller?.dispose(); // Null-safe
super.dispose();
}
}| Pattern | Before | After |
|---|---|---|
| Uninitialized | late T value; |
T? value; |
| Simple literal | late T value = literal; |
T value = literal; |
| Lazy computation | late T value = compute(); |
Keep as-is ✅ |