August 25, 2022
- Introduce StateX class
- Updated analysis_options.yaml
- page_02.dart offers a means to trip an error
June 29, 2022
- BUGFIX Forgot _afterList in void activate()
- False and not True by default if initAsync() now fails: init = con.onAsyncError(details);
- Removed deprecated mixin AppControllerMVC
- Removed static T? of(BuildContext? context) {
- Removed bool get futureBuilt
- Removed ControllerMVC? get firstCon
- Removed Widget buildApp(BuildContext context);
- Removed bool widgetInherited(BuildContext? context)
- Updated example app
May 24, 2022
- With Flutter upgrade: WidgetsBinding.instance!. changed to WidgetsBinding.instance.
- Upgraded Dart to sdk: '>=2.17.1 <3.0.0'
April 06, 2022
- _lastStateMVC() // Don't supply this State object if it's deactivated
- Tightened code. // While loop so additional controllers can be added in a previous initState()
- Widget buildWidget(BuildContext context) => super.buildWidget(context);
March 31, 2022
- bool _deactivated = false; // State object's deactivated() was called.
March 30, 2022
- void activate() to mixin StateListener
- if (controllers != null) in controllerByType()
- Updated example app testing
March 16, 2022
- mixin InheritedStateMixin on State
- mixin FutureBuilderStateMixin on State
- renamed parameter inheritedWidget to inheritedBuilder
- abstract class InheritedStateMVC with InheritedStateMixin
- AppStateMVC.buildApp() is deprecated yet not replaced.
March 04, 2022
- class _BuildBuilder extends StatelessWidget has a try..catch
- ControllerMVC? get rootCon => Returns null if empty.
March 01, 2022
- Pass in the StatefulElement buildWidget(this.context);
February 28, 2022
- Installed universal_platform: ^1.0.0
- Updated Dart version: sdk: '>=2.16.1 <3.0.0'
- inactiveLifecycleState(), pausedLifecycleState(), detachedLifecycleState(), resumedLifecycleState()
- Supply a FutureBuilder to a State object. mixin FutureBuilderStateMixin on State
- A StateMVC object but inserts a InheritedWidget into the Widget tree. abstract class InheritedStateMVC
- try { init = await con.initAsync(); in initAsync()
- While loop so additional controllers can be added in a previous initState()
- Link a widget to InheritedWidget bool widgetInherited(BuildContext? context)
- Rebuild the InheritedWidget of the 'closes' InheritedStateMVC object if any. void buildInherited()
- AppControllerMVC Deprecated. All ControllerMVC objects now have this capability.
February 02, 2022
- Allow the Inherited State object to be recreated on hot reload.
January 30, 2022
- Collect all the Controllers to the 'root' State object;
- Collect all the StateMVC objects to the 'root' State object;
January 22, 2022
- testsStateListener02(tester); testsStateListener02(tester); resetPage1Count(tester);
- AppStateMVC.deactivate(); to AppStateMVC.dispose();
- Further API documentation
- sdk: ">=2.15.1 <3.0.0"
- Finalized public API documentation with - public_member_api_docs
January 17, 2022
- Rewrote 'pop state' _popState()
- Removed _popState() from deactivate()
- _AppStateMVC class merged into AppStateMVC class
January 17, 2022
- integration_test: in mvc_pattern
- Introduced test_listener.dart
- isInstanceOf is isA
- import 'package:integration_test/integration_test.dart';
January 16, 2022
- Resolved 'no_logic_in_create_state' issue in 'Root StatefulWidget'
January 15, 2022
- Include pubspec.yaml in example app
- flutter_test in dev_dependencies and dependencies
January 15, 2022
- bool _pushState(StateMVC? state) assign only if not already pushed
- addList(List? list) returns a List of keyId's
- mixin _ControllerListing._controllers renamed _controllersMap
- get firstCon renamed rootCon for consistency with rootState
- Removed parameter controller from class AppStatefulWidgetMVC
- Removed get context from class AppStatefulWidgetMVC
- Removed static getState() from class AppStatefulWidgetMVC
- Removed initApp() from class AppStatefulWidgetMVC
- Clean up memory in AppStateMVC.deactivate()
- Reduced to one state reference: AppStateMVC? _rootStateMVC;
- Replaced package:pedantic in analysis_options.yaml
- Incorporated example app to widget_test.dart
January 12, 2022
- Privatize properties in the example app
- AppStatefulWidgetMVC({Key? key, this.con}) to this.controller
- ControllerMVC? controllerById(String? keyId) =>
- this.controllers to List? controllers in AppStateMVC
January 09, 2022
- New example app
- Map<Type, Object> _controllers = {} to Set _controllers = {};
- futureBuilt to _futureBuilt
- final controllers = AppStatefulWidgetMVC._controllers.toList();
- mixin _RootStateMixin
- StateMVC? stateOf()
- Working on test
December 31, 2021
- Update .github/workflows/
December 25, 2021
- Future didPopRoute() async => false; Future didPushRoute(String route) async => false;
December 10, 2021
- context?.findAncestorStateOfType();
November 24, 2021
- Replaced setStatesInherited with inheritedNeedsBuild();
November 22, 2021
- In void deactivate() { for (final con in _beforeList) {
November 10, 2021
- // Don't if the widget is not in the widget tree.
- if (mounted) {
November 04, 2021
- StateMVC? get state => _stateMVC; replaces getter, stateMVC
- pedantic 1.11.1 (discontinued replaced by lints)
October 30, 2021
- Remove deprecated function, removeState()
- Removed from mixin StateListener: initAsync() & onAsyncError()
- Renamed ViewMVC to AppStateMVC
- Renamed AppConMVC to AppControllerMVC
- AppControllerMVC is now a mixin
- Renamed AppMVC to AppStatefulWidgetMVC
- Nullify ControllerMVC? get controller => _controller ??= firstCon;
- Nullify ControllerMVC? get firstCon => _asList.first;
- Rewritten class _InheritedMVC extends StatefulWidget {
July 08, 2021
- StateMVC.of(context);
June 24, 2021
- if (_statePushed) { // Retain the 'right' State object.
June 24, 2021
- _stateMVCSet.retainWhere((state) => state.mounted);
June 24, 2021
- setState() only if (mounted) {
June 11, 2021
- Introduced ofState() in mixin StateSets
May 01, 2021
- _inTester = WidgetsBinding.instance is TestWidgetsFlutterBinding;
April 19, 2021
- Don't continue app if !con.initAsync();
March 30, 2021
- Corrected _removeStateMVC(StateMVC? state)
- Enhanced BuildContext? get context
- Removed deprecated function, popState().
March 27, 2021
- class _InheritedMVC with Object? object;
- catchError() has WidgetsBinding.instance is WidgetsFlutterBinding
- Unit Tests for class ViewMVC & class _InheritedMVC
- Separate tests files.
March 26, 2021
- Further Unit Tests
- Corrected beforeList() & afterList() with for (final listener in set) {
March 21, 2021
- BREAKING CHANGE addState() returns State object's unique identifier; not the controller's
- Corrected AppMVC._addStateMVC(this as StateMVC);
- Removed deprecated function, popState()
- Improved test widget
- Introduced CI/CD with Github Actions
- Introduced Test coverage with Codecov
March 21, 2021
- for (final listener in set) {
March 04, 2021
- Migrated to Dart SDK 2.12.0
January 25, 2021
- AppMVC._removeStateMVC(this);
- BuildContext get context
January 08, 2021
- Updated README.md to include mvc_application.
January 08, 2021
- _rebuildAllowed = true; in dispose();
November 21, 2020
- Critical fix _rebuildAllowed = true; in initAsync()
November 21, 2020
- Commented out , if (mounted), in refresh()
November 09, 2020
- New method onAsyncError(FlutterErrorDetails details)
October 10, 2020
- Removed deprecated function, buildView();
September 07, 2020
- Introduced class, ModelMVC
- Introduced class, StateSetter
- Introduced mixin, StateSets
- Removed key from class, ViewMVC
August 14, 2020
- Remove import 'package:flutter_test/flutter_test.dart' to support Flutter Web
August 14, 2020
- ControllerMVC controller in class, ViewMVC
August 13, 2020
- Strict Flutter Lint Rules following Dart Style Guide.
- Introduced analysis_options.yaml
July 10, 2020
- Corrected the README.md
July 09, 2020
- @deprecated Widget buildView(BuildContext context);
- README Note, there is now the 'MVC framework' which wraps around this
- Remove 'author' section from pubspec.yaml
May 18, 2020
- Fixed controllerByType(); AppMVC.controllers to AppMVC._controllers
May 02, 2020
- @mustCallSuper to didChangeMetrics() didChangeTextScaleFactor() didChangeLocale()
- didHaveMemoryPressure() didChangeAccessibilityFeatures() didChangeDependencies() reassemble()
April 26, 2020
- AppConMVC(state) provide the state parameter.
- AppState should not rebuild.
April 19, 2020
- Future initAsync() async in mixin StateListener
- Removed Future init() async in class AppConMVC
- Replaced Future.value(true) in didPopRoute(), didPushRoute(),
April 07, 2020
- Introduced integrated error handling.
- ViewMVC remove errorScreen,
- AppConMVC stateMVC?.onError(details)
- AppMVC void onError(details)
February 26, 2020
- Returned the getter, context, to the Controller.
January 22, 2019
- Correction Don't call Controller's dispose in StateMVC if it's in other State objects.
January 16, 2020
- errorScreen == null
January 16, 2020
- Custom 'Error Screen' instead of 'Red Screen of Death'
December 30, 2019
- Don't dispose Controller if it's in other State objects.
December 06, 2019
- void catchError(Exception ex)
- context.dependOnInheritedWidgetOfExactType
- assert(this.mounted, "StateMVC is not instantiated properly.");
- SDK constraints sdk: ">=2.3.0 <3.0.0"
Sept. 20, 2019
- New functions, rebuild() notifyListeners() calls refresh()
- T controllerByType(
- abstract class ViewMVC extends StateMVC {
- class _InheritedMVC extends InheritedWidget {
- class SetState extends StatelessWidget {
Sept. 02, 2019
- _AppState super.initState();
- SDK constraints sdk: ">=2.2.2 <3.0.0"
August 23, 2019
- states property in AppMVC set to private, _states.
July 02, 2019
- Flutter upgrade
- _rebuildAllowed = true; after super.deactivate(); super.didUpdateWidget(oldWidget); super.reassemble();
July 02, 2019
- of() function introduced.
- expect() functions in mvc_pattern_test.dart
June 28, 2019
- Bug fix _rebuildAllowed = true; in StateMVC.deactivate()
May 11, 2019
- StateMVC.dispose() will only run once. Removed if(_disposed) return;
Apr. 21, 2019
- Ensure StateMVC.dispose() is runs only once. if(_disposed) return;
Apr. 12, 2019
- Return _rebuildAllowed = true; in didUpdateWidget() & reassemble()
Apr. 03, 2019
- Correction Controllers and Listeners dispose calls in the StateMVC were not an issue after all.
Apr. 02, 2019
- Call _disposeState() on all controllers when StateMVC is disposed.
Apr. 02, 2019
- Proven prudent to not dispose any Controllers or Listeners in the StateMVC.
Apr. 02, 2019
- ControllerMVC getter 'states' returns a 'copy' of the Set of State objects.
- Only dispose a Controller if no longer relied on by a view.
Mar. 16, 2019.
- Removed abstract from class ControllerMVC
- Add didPopRoute() didPushRoute() to StateListener
Mar. 02, 2019.
- No 'setState()' function is necessary; in some events.
Feb. 20, 2019.
- await (con as AppConMVC)?.init();
Feb. 17, 2019.
- _oldOnError = _recOnError()
Feb. 06, 2019.
- Update the upper bound of the SDK constraint to <3.0.0
Jan. 30, 2019.
- Deprecated Error Handler from Controller. Removed refresh(); from initState() & deactiveate
Jan. 26, 2019.
- StateViewMVC implements StateListener & get controller
Jan. 25, 2019.
- Changed class StateListener to a mixin
- addState() in Controller and Listener adding any number of Views
- abstract class StateViewMVC extends StateMVC
- class ViewMVC extends _StateObserver with _ControllerListing
- void didChangeDependencies() will not refresh() on first build
- Removed from Controllers the getters: widget, context, mounted
- stateView getter is deprecated. Replaced by stateMVC. Removed stateMVC setter.
- Removed controller setter in class ViewMVC
- if (con is AppConMVC) //bool addBeforeListener(StateListener listener)
Jan. 19, 2019.
- void addState(StateMVC state) {
Jan. 16, 2019.
- AppMVC({this.con, Key key}) : super(key: key);
Jan. 16, 2019.
- ControllerMVC(State state)
- class _StateView with StateListener
- _StateView() : _oldOnError = _recOnError() {
- abstract class StateMVC extends State
- remove setter, controller
- _StateListener.disposeStateEventList() use clear();
- Removed StatefulWidgetMVC
- Removed StatedWidget
- abstract class AppMVC extends StatefulWidget {
- Removed StatelessWidgetMVC
Jan. 12, 2019.
- StateListener to replace StateEvents. addState() disposedState()
Jan. 11, 2019.
- remove StateListener
Jan. 11, 2019.
- StateListener as a mixin for StateEvents
Jan. 01, 2019.
- Removed @protected from ViewMVC.build() Private _ControllerListing._con(String keyId)
Dec. 28, 2018.
- if(mounted) in refresh()
Dec. 10, 2018.
- sdk: ">=2.0.0 <5.0.0"
Dec. 03, 2018.
- Updated README.md
Nov. 18, 2018.
- add some further examples under test folder
Nov. 17, 2018.
- fix on StateEvents assign on keyId
Nov. 13, 2018.
- test for TestWidgetsFlutterBinding
Nov. 02, 2018.
- fix on StatedWidget
Nov. 02, 2018.
- fix on StateViewMVC
Oct. 29, 2018.
- enhance AppMVC
Oct. 27, 2018.
- StatefulWidgetMVC deemed deprecated
Oct. 25, 2018.
- keyId in StateEvents
Oct. 24, 2018.
- Official Production Release
Oct. 24, 2018.
- fix on StateViewMVC & AppMVC & @protected
Oct. 23, 2018.
- fix on _ControllerListing
Oct. 23, 2018.
- class ViewMVC with _ControllerListing
Oct. 23, 2018.
- class StateMVC with _ControllerListing, _StateEventList
Oct. 22, 2018.
- include travis.yml
Oct. 21, 2018.
- fix on ViewMVC & StateViewMVC
Oct. 20, 2018.
- Updated the README.md
Oct. 19, 2018.
- Provide example/main.dart
Oct. 18, 2018.
- fix on StateMVC.con()
Oct. 18, 2018.
- fix on StatedWidget
Oct. 18, 2018.
- fix on StateMVC.add()
Oct. 18, 2018.
- fix on AppMVC and StateEvents
Oct. 13, 2018.
- Initial Release