From 76db6672a2dbdb0e405337f8bc06693068b2aa0e Mon Sep 17 00:00:00 2001 From: zjuwjf <> Date: Sat, 22 Jun 2019 04:06:33 +0800 Subject: [PATCH] Reconstruct dependencies --- example/lib/todo_list_page/page.dart | 2 +- lib/src/redux/connector.dart | 2 +- lib/src/redux_adapter/adapter.dart | 4 ++-- lib/src/redux_component/basic.dart | 2 +- lib/src/redux_component/component.dart | 2 +- lib/src/redux_component/dependencies.dart | 24 ++++++++++++++++---- lib/src/redux_component/dependent.dart | 4 ++-- lib/src/redux_connector/congruent.dart | 12 ---------- lib/src/redux_connector/connector.dart | 6 ++--- lib/src/redux_connector/none.dart | 10 ++++++++ lib/src/redux_connector/op_mixin.dart | 3 ++- lib/src/redux_connector/redux_connector.dart | 2 +- 12 files changed, 42 insertions(+), 31 deletions(-) delete mode 100644 lib/src/redux_connector/congruent.dart create mode 100644 lib/src/redux_connector/none.dart diff --git a/example/lib/todo_list_page/page.dart b/example/lib/todo_list_page/page.dart index 0a79351..5b4e798 100644 --- a/example/lib/todo_list_page/page.dart +++ b/example/lib/todo_list_page/page.dart @@ -16,7 +16,7 @@ class ToDoListPage extends Page> { reducer: buildReducer(), view: buildView, dependencies: Dependencies( - adapter: ToDoListAdapter(), + list: NoneConn() + ToDoListAdapter(), slots: >{ 'report': ReportConnector() + ReportComponent() }), diff --git a/lib/src/redux/connector.dart b/lib/src/redux/connector.dart index 9b2caec..8d583a4 100644 --- a/lib/src/redux/connector.dart +++ b/lib/src/redux/connector.dart @@ -27,7 +27,7 @@ abstract class ImmutableConn implements AbstractConnector { return state; } final P newProps = reducer(props, action); - final bool hasChanged = newProps != props; + final bool hasChanged = !identical(newProps, props); if (hasChanged) { final T result = set(state, newProps); assert(result != null, 'Expected to return a non-null value.'); diff --git a/lib/src/redux_adapter/adapter.dart b/lib/src/redux_adapter/adapter.dart index ba25ad9..202de0f 100644 --- a/lib/src/redux_adapter/adapter.dart +++ b/lib/src/redux_adapter/adapter.dart @@ -22,8 +22,8 @@ abstract class Adapter extends Logic implements AbstractAdapter { Dependencies dependencies, Object Function(T) key, }) : assert(adapter != null), - assert(dependencies?.adapter == null, - 'Unexpected dependencies.adapter for Adapter.'), + assert(dependencies?.list == null, + 'Unexpected dependencies.list for Adapter.'), _adapter = adapter, super( reducer: reducer, diff --git a/lib/src/redux_component/basic.dart b/lib/src/redux_component/basic.dart index 3865a0c..12dc64e 100644 --- a/lib/src/redux_component/basic.dart +++ b/lib/src/redux_component/basic.dart @@ -132,7 +132,7 @@ abstract class MixedStore extends Store /// Seen in view-part or adapter-part abstract class ViewService { - /// The way to build adapter which is configured in Dependencies.adapter + /// The way to build adapter which is configured in Dependencies.list ListAdapter buildAdapter(); /// The way to build slot component which is configured in Dependencies.slots diff --git a/lib/src/redux_component/component.dart b/lib/src/redux_component/component.dart index 7be30c8..2ebb61b 100644 --- a/lib/src/redux_component/component.dart +++ b/lib/src/redux_component/component.dart @@ -72,7 +72,7 @@ abstract class Component extends Logic implements AbstractComponent { shouldUpdate: protectedShouldUpdate, name: name, markNeedsBuild: markNeedsBuild, - sidecarCtx: protectedDependencies?.adapter?.createContext( + sidecarCtx: protectedDependencies?.list?.createContext( store: store, buildContext: buildContext, getState: getState, diff --git a/lib/src/redux_component/dependencies.dart b/lib/src/redux_component/dependencies.dart index b8bb66f..1f683cd 100644 --- a/lib/src/redux_component/dependencies.dart +++ b/lib/src/redux_component/dependencies.dart @@ -1,21 +1,35 @@ import '../redux/redux.dart'; +import '../redux_connector/redux_connector.dart'; import 'basic.dart'; class Dependencies { final Map> slots; - final AbstractAdapter adapter; + final Dependent list; - Dependencies({this.slots, this.adapter}); + /// Use [list: NoneConn() + Adapter()] instead of [adapter: Adapter()], + /// Which is better reusability and consistency. + Dependencies({ + this.slots, + @deprecated AbstractAdapter adapter, + Dependent list, + }) : assert(list == null || list.isAdapter(), ''), + assert(list == null || adapter == null, ''), + list = list ?? (NoneConn() + adapter); Reducer get reducer { - Reducer slotsReducer; + final List> subs = >[]; if (slots != null && slots.isNotEmpty) { - slotsReducer = combineSubReducers(slots.entries.map>( + subs.addAll(slots.entries.map>( (MapEntry> entry) => entry.value.createSubReducer(), )); } - return combineReducers(>[slotsReducer, adapter?.reducer]); + + if (list != null) { + subs.add(list.createSubReducer()); + } + + return combineReducers(>[combineSubReducers(subs)]); } Dependent slot(String type) => slots[type]; diff --git a/lib/src/redux_component/dependent.dart b/lib/src/redux_component/dependent.dart index 401ef0a..810c420 100644 --- a/lib/src/redux_component/dependent.dart +++ b/lib/src/redux_component/dependent.dart @@ -58,5 +58,5 @@ class _Dependent implements Dependent { } Dependent createDependent( - AbstractConnector connector, Logic logic) => - _Dependent(connector: connector, logic: logic); + AbstractConnector connector, AbstractLogic logic) => + logic != null ? _Dependent(connector: connector, logic: logic) : null; diff --git a/lib/src/redux_connector/congruent.dart b/lib/src/redux_connector/congruent.dart deleted file mode 100644 index 38f4d4f..0000000 --- a/lib/src/redux_connector/congruent.dart +++ /dev/null @@ -1,12 +0,0 @@ -import '../redux/redux.dart'; -import '../redux_component/redux_component.dart'; - -class CongruentConn extends ImmutableConn { - @override - T get(T state) => state; - - @override - T set(T state, T subState) => subState; - - Dependent operator +(Logic logic) => createDependent(this, logic); -} diff --git a/lib/src/redux_connector/connector.dart b/lib/src/redux_connector/connector.dart index f3880ee..dd9ee14 100644 --- a/lib/src/redux_connector/connector.dart +++ b/lib/src/redux_connector/connector.dart @@ -1,6 +1,6 @@ import '../redux/redux.dart'; -import '../redux_component/redux_component.dart'; +import 'op_mixin.dart'; /// use ConnOp instead of Connector @deprecated @@ -21,7 +21,7 @@ class Connector extends MutableConn { void set(T state, P subState) => _setter(state, subState); } -class ConnOp extends MutableConn { +class ConnOp extends MutableConn with ConnOpMixin { final P Function(T) _getter; final void Function(T, P) _setter; @@ -36,6 +36,4 @@ class ConnOp extends MutableConn { @override void set(T state, P subState) => _setter(state, subState); - - Dependent operator +(Logic

logic) => createDependent(this, logic); } diff --git a/lib/src/redux_connector/none.dart b/lib/src/redux_connector/none.dart new file mode 100644 index 0000000..9b7e4e3 --- /dev/null +++ b/lib/src/redux_connector/none.dart @@ -0,0 +1,10 @@ +import '../redux/redux.dart'; +import 'op_mixin.dart'; + +class CongruentConn extends ImmutableConn with ConnOpMixin { + @override + T get(T state) => state; + + @override + T set(T state, T subState) => subState; +} diff --git a/lib/src/redux_connector/op_mixin.dart b/lib/src/redux_connector/op_mixin.dart index 3af1912..4355841 100644 --- a/lib/src/redux_connector/op_mixin.dart +++ b/lib/src/redux_connector/op_mixin.dart @@ -2,5 +2,6 @@ import '../redux/redux.dart'; import '../redux_component/redux_component.dart'; mixin ConnOpMixin on AbstractConnector { - Dependent operator +(Logic

logic) => createDependent(this, logic); + Dependent operator +(AbstractLogic

logic) => + createDependent(this, logic); } diff --git a/lib/src/redux_connector/redux_connector.dart b/lib/src/redux_connector/redux_connector.dart index e6dda76..d83609c 100644 --- a/lib/src/redux_connector/redux_connector.dart +++ b/lib/src/redux_connector/redux_connector.dart @@ -1,5 +1,5 @@ -export 'congruent.dart'; export 'connector.dart'; export 'map_like.dart'; +export 'none.dart'; export 'op_mixin.dart'; export 'reselect.dart';