ease_generator 0.1.0
ease_generator: ^0.1.0 copied to clipboard
Code generator for ease state management helper
Ease Generator #
Code generator for the Ease state management library.
Overview #
This package provides build_runner generators that create boilerplate code for classes annotated with @ease(). It generates:
- Provider widgets - StatefulWidget that manages the notifier lifecycle
- InheritedModel - For efficient state propagation with selective rebuilds
- Context extensions - Type-safe access via
context.yourViewModel - Ease root widget - Aggregates all providers for easy app setup
Installation #
Add to your pubspec.yaml dev dependencies:
dev_dependencies:
ease_generator: ^1.0.0
build_runner: ^2.4.0
Usage #
1. Annotate your classes #
import 'package:ease_state_helper/ease_state_helper.dart';
part 'counter_view_model.ease.dart';
@ease()
class CounterViewModel extends StateNotifier<int> {
CounterViewModel() : super(0);
void increment() => state++;
}
2. Run the generator #
# One-time build
dart run build_runner build
# Watch mode (rebuilds on changes)
dart run build_runner watch
3. Generated files #
For each annotated class, a .ease.dart part file is created:
// counter_view_model.ease.dart
class CounterViewModelProvider extends StatefulWidget { ... }
class _CounterViewModelInherited extends InheritedModel<_CounterViewModelAspect> { ... }
extension CounterViewModelContext on BuildContext { ... }
An aggregated ease.g.dart file is also created:
// ease.g.dart
class Ease extends StatelessWidget { ... } // Wraps all providers
extension EaseContext on BuildContext { ... } // Generic get<T>() and read<T>()
Architecture #
Two-Phase Generation #
-
Per-file generation (
EaseGenerator)- Runs on each file with
@ease()annotations - Generates Provider, InheritedModel, and typed extensions
- Runs on each file with
-
Aggregation (
AggregatorBuilder)- Runs after all per-file generators complete
- Scans for generated providers
- Creates the
Easeroot widget and generic extensions
Generated Code Patterns #
Watch pattern (subscribes to changes):
// Uses dependOnInheritedWidgetOfExactType - causes rebuilds
$className get $getterName { ... }
Read pattern (no subscription):
// Uses getInheritedWidgetOfExactType - no rebuilds
$className read$className() { ... }
License #
MIT