reactiv 1.0.0
reactiv: ^1.0.0 copied to clipboard
Production-ready reactive state management with undo/redo, computed values, debounce/throttle, lazy DI, and more. Lightweight, powerful, and easy to use.
Changelog #
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
1.0.0 - 2025-11-01 #
🎉 Major Release - Production-ready with comprehensive improvements and new features!
🔴 Fixed (Critical) #
- Fixed memory leak in
addListener: Listeners are now properly invoked when reactive values change - Fixed memory leak in
bindStream: Stream subscriptions are now properly managed and cancelled - Fixed
Observerwidget performance: Now uses optimizedvalueparameter instead of redundant lookups - Removed unnecessary
asynckeywords: MethodsaddListener()andremoveListener()are now synchronous
⚡ Performance #
- Batched updates for
ReactiveList: Multiple mutations in the same frame trigger only one rebuild - Batched updates for
ReactiveSet: Same batching strategy to prevent excessive rebuilds - Optimized Observer rebuilds: Eliminated unnecessary value access in widget builders
✨ New Features #
State Management
- Undo/Redo support: Enable history tracking with
enableHistory: trueparameter- Methods:
undo(),redo(),canUndo,canRedo,clearHistory() - Configurable history size with
maxHistorySizeparameter (default: 50)
- Methods:
- Computed reactive values: New
ComputedReactive<T>class for auto-updating derived state - Debounce support: Delay updates with
setDebounce()andupdateDebounced()methods - Throttle support: Limit update frequency with
setThrottle()andupdateThrottled()methods - Ever & Once utilities: Convenient listener methods
ever(callback)- called on every value changeonce(callback)- called once then auto-removed
Dependency Management
- Lazy dependency injection:
Dependency.lazyPut<T>()for deferred instantiation - Put with overwrite:
put()now overwrites existing dependencies with warning - Conditional registration: New
putIfAbsent()method - Dependency checking: New
isRegistered<T>()method - Global reset: New
reset()method to clear all dependencies - Fenix mode: Auto-recreation after deletion with
fenix: trueparameter
🛠️ Improvements #
Code Quality
- Custom exceptions: New exception classes with helpful error messages
DependencyNotFoundExceptionDependencyAlreadyExistsException
- Explicit return types: All methods now have proper return type declarations
- Fixed typo: Corrected "associa ted" to "associated" in documentation
Developer Experience
- Configurable logging: Control logging with
Logger.enabledflag - Warning and error logs: New
Logger.warn()andLogger.error()methods - Better error messages: All exceptions provide clear, actionable information
- Stream subscription management:
bindStream()now returnsStreamSubscriptionfor external control
📚 Documentation #
- NEW_FEATURES.md: Comprehensive guide to all new features with examples
- QUICK_REFERENCE.md: Quick-start guide for common use cases
- IMPLEMENTATION_SUMMARY.md: Technical implementation details
- Advanced example: New
advanced_features_example.dartdemonstrating all features
🔄 Changed #
- All reactive types (
ReactiveInt,ReactiveString, etc.) now support optional parameters:enableHistory- Enable undo/redo functionalitymaxHistorySize- Configure history buffer size
ReactiveNclass updated to support new optional parametersDependency.put()behavior changed to overwrite with warning (previously silently ignored)bindStream()now returnsStreamSubscriptioninstead ofvoid
⚠️ Deprecated #
None - All changes are backward compatible!
🚫 Breaking Changes #
None! Version 1.0.0 maintains full backward compatibility with 0.3.x versions.
📦 Migration Guide #
No migration needed! All new features are opt-in. To use them:
-
Enable logging control:
Logger.enabled = false; // Disable in production -
Use history tracking:
final text = ReactiveString('Hello', enableHistory: true); -
Create computed values:
final fullName = ComputedReactive( () => '${firstName.value} ${lastName.value}', [firstName, lastName], ); -
Use lazy dependencies:
Dependency.lazyPut(() => MyController());
📊 Statistics #
- Files changed: 20
- Lines added: 1,457
- Lines removed: 118
- New features: 8
- Bug fixes: 4
- Performance improvements: 3
- Code quality improvements: 7
0.3.6 Previous Release #
New widget ObserverN that accepts List of Reactive variables
0.3.5 #
Implement un-implemented methods in ReactiveSet
0.3.4 #
- New method added
initStateWithContext(BuildContext context)
0.3.3 #
- Now bind controller needs to be through Function(). e.g,
BindController(controller: () => MyCounterController())
0.3.2 #
- Now bind controller needs to be through Function(). e.g,
BindController(controller: () => MyCounterController())
0.3.1 #
- Added listeners getter
- Added option for remove all listeners
0.3.0 #
- Introduced BindController Class to bind the controllers with the screen smart and seamlessly
0.2.6 #
- Added support for
.reactivfor bool and num types - Update readme.md
0.2.5 #
Update readme.md
0.2.4 #
- ReactiveBool, ReactiveNum, ReactiveMap, ReactiveSet
0.2.3 #
- addListener method for Reactive variables
- Update ReadMe
0.2.2 #
- New method in Reactive types, bindStream to deal with streams
- ReactiveStateWidget and ReactiveState
0.2.1 #
- Update readme
0.2.0 #
- Breaking Change: params change
- listen => listenable
- update => listener
0.1.3 #
- Stream change to broadcast stream
- Params change
- listen => listenable
- update => listener
- ReactiveWidget major update:
- Auto dispose the controller functionality
- bindDependency method to Dependency.put() the dependency
- Life-cycle methods void initState(), void dispose(), methods added in ReactiveWidget
0.1.2 #
.reactivextension added- ReactiveList all the methods added for add new element and remove element from the list
0.1.1 #
Update documentation
0.1.0 #
Update documentation
0.0.3 #
Update example and readme
0.0.2 #
Name change:
- Reaction => Observer
- cause => listen
- effect => update
- Import file optimisations
0.0.1 #
Initial release. A new Reactive state management approach and dependency injection inspired by GetX