Skip to content

Commit

Permalink
reconstruct pass
Browse files Browse the repository at this point in the history
  • Loading branch information
zjuwjf committed Jun 25, 2019
1 parent df9cd06 commit 425162b
Show file tree
Hide file tree
Showing 46 changed files with 894 additions and 881 deletions.
86 changes: 59 additions & 27 deletions example/lib/app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,37 +7,69 @@ import 'todo_edit_page/page.dart';
import 'todo_list_page/page.dart';

//create global page helper
Page<T, dynamic> pageConfiguration<T extends GlobalBaseState<T>>(
Page<T, dynamic> page) {
return page
// Page<T, dynamic> pageConfiguration<T extends GlobalBaseState>(
// Page<T, dynamic> page) {
// return page

///connect with app-store
..connectExtraStore(GlobalStore.store, (T pagestate, GlobalState appState) {
return pagestate.themeColor == appState.themeColor
? pagestate
: ((pagestate.clone())..themeColor = appState.themeColor);
})
// ///connect with app-store
// ..connectExtraStore(GlobalStore.store,
// (T pagestate, GlobalState appState) {
// return pagestate.themeColor == appState.themeColor
// ? pagestate
// : ((pagestate.clone())..themeColor = appState.themeColor);
// })

///updateMiddleware
..updateMiddleware(
view: (List<ViewMiddleware<T>> viewMiddleware) {
viewMiddleware.add(safetyView<T>());
},
adapter: (List<AdapterMiddleware<T>> adapterMiddleware) {
adapterMiddleware.add(safetyAdapter<T>());
},
);
}
// ///updateMiddleware
// /// TODO
// // ..updateMiddleware(
// // view: (List<ViewMiddleware<T>> viewMiddleware) {
// // viewMiddleware.add(safetyView<T>());
// // },
// // adapter: (List<AdapterMiddleware<T>> adapterMiddleware) {
// // adapterMiddleware.add(safetyAdapter<T>());
// // },
// // )
// ;
// }

Widget createApp() {
final AbstractRoutes routes = HybridRoutes(routes: <AbstractRoutes>[
PageRoutes(
pages: <String, Page<Object, dynamic>>{
'todo_list': pageConfiguration(ToDoListPage()),
'todo_edit': pageConfiguration(TodoEditPage()),
},
),
]);
final AbstractRoutes routes = PageRoutes(
pages: <String, Page<Object, dynamic>>{
'todo_list': ToDoListPage(),
'todo_edit': TodoEditPage(),
},
visitor: (String path, Page<Object, dynamic> page) {
/// XXX
if (page.isTypeof<GlobalBaseState>()) {
page.connectExtraStore<GlobalState>(GlobalStore.store,
(Object pagestate, GlobalState appState) {
final GlobalBaseState p = pagestate;
if (p.themeColor == appState.themeColor) {
return pagestate;
} else {
if (pagestate is Cloneable) {
final Object copy = pagestate.clone();
final GlobalBaseState newState = copy;
newState.themeColor = appState.themeColor;
return newState;
}
}
});
}

// }
///updateMiddleware
/// TODO
// ..updateMiddleware(
// view: (List<ViewMiddleware<T>> viewMiddleware) {
// viewMiddleware.add(safetyView<T>());
// },
// adapter: (List<AdapterMiddleware<T>> adapterMiddleware) {
// adapterMiddleware.add(safetyAdapter<T>());
// },
// )
},
);

return MaterialApp(
title: 'Fluro',
Expand Down
4 changes: 2 additions & 2 deletions example/lib/global_store/state.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@ import 'dart:ui';

import 'package:fish_redux/fish_redux.dart';

abstract class GlobalBaseState<T extends Cloneable<T>> implements Cloneable<T> {
abstract class GlobalBaseState {
Color get themeColor;
set themeColor(Color color);
}

class GlobalState implements GlobalBaseState<GlobalState> {
class GlobalState implements GlobalBaseState, Cloneable<GlobalState> {
@override
Color themeColor;

Expand Down
3 changes: 2 additions & 1 deletion example/lib/todo_edit_page/state.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import 'package:fish_redux/fish_redux.dart';
import 'package:flutter/material.dart' hide Action;

import '../global_store/state.dart';
import '../todo_list_page/todo_component/component.dart';

class TodoEditState implements GlobalBaseState<TodoEditState> {
class TodoEditState implements GlobalBaseState, Cloneable<TodoEditState> {
ToDoState toDo;

TextEditingController nameEditController;
Expand Down
2 changes: 1 addition & 1 deletion example/lib/todo_list_page/state.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import '../global_store/state.dart';
import 'report_component/component.dart';
import 'todo_component/component.dart';

class PageState implements GlobalBaseState<PageState> {
class PageState implements GlobalBaseState, Cloneable<PageState> {
List<ToDoState> toDos;

@override
Expand Down
49 changes: 41 additions & 8 deletions lib/src/redux_adapter/adapter.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:fish_redux/src/redux_component/basic.dart';
import 'package:fish_redux/src/redux_component/context.dart';
import 'package:flutter/widgets.dart' hide Action;

Expand All @@ -7,7 +8,6 @@ import '../redux_component/logic.dart';
import '../redux_component/redux_component.dart';

/// abstract for custom extends
@immutable
abstract class Adapter<T> extends Logic<T> implements AbstractAdapter<T> {
final AdapterBuilder<T> _adapter;

Expand Down Expand Up @@ -35,20 +35,53 @@ abstract class Adapter<T> extends Logic<T> implements AbstractAdapter<T> {
);

@override
ListAdapter buildAdapter(ContextSys<T> ctx) {
return ctx.store
.adapterEnhance(protectedAdapter, this)
.call(ctx.state, ctx.dispatch, ctx);
}
ListAdapter buildAdapter(ContextSys<T> ctx) =>
ctx.enhancer
?.adapterEnhance(protectedAdapter, this, ctx.store)
?.call(ctx.state, ctx.dispatch, ctx) ??
protectedAdapter?.call(ctx.state, ctx.dispatch, ctx);

@override
ContextSys<T> createContext(
{MixedStore<Object> store, BuildContext buildContext, Get<T> getState}) {
return DefaultContext<T>(
Store<Object> store,
BuildContext buildContext,
Get<T> getState, {
@required Enhancer<Object> enhancer,
@required DispatchBus bus,
}) {
assert(bus != null && enhancer != null);
return AdapterContext<T>(
logic: this,
store: store,
buildContext: buildContext,
getState: getState,
bus: bus,
enhancer: enhancer,
);
}
}

class AdapterContext<T> extends LogicContext<T> {
AdapterContext({
@required Adapter<T> logic,
@required Store<Object> store,
@required BuildContext buildContext,
@required Get<T> getState,
@required DispatchBus bus,
@required Enhancer<Object> enhancer,
}) : assert(bus != null && enhancer != null),
super(
logic: logic,
store: store,
buildContext: buildContext,
getState: getState,
bus: bus,
enhancer: enhancer,
);

@override
ListAdapter buildAdapter() {
final Adapter<T> curLogic = logic;
return curLogic.buildAdapter(this);
}
}
21 changes: 10 additions & 11 deletions lib/src/redux_adapter/dynamic_flow_adapter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,7 @@ class ItemBean {
}

/// template is a map, driven by array
class DynamicFlowAdapter<T> extends Logic<T>
with RecycleContextMixin<T>
implements AbstractAdapter<T> {
class DynamicFlowAdapter<T> extends Logic<T> with RecycleContextMixin<T> {
final Map<String, AbstractLogic<Object>> pool;
final AbstractConnector<T, List<ItemBean>> connector;

Expand Down Expand Up @@ -63,21 +61,22 @@ class DynamicFlowAdapter<T> extends Logic<T>
result.runtimeType,
result.key(itemBean.data),
),
() {
return result.createContext(
store: recycleCtx.store,
buildContext: recycleCtx.context,
getState:
_subGetter(() => connector.get(recycleCtx.state), index),
);
},
() => result.createContext(
recycleCtx.store,
recycleCtx.context,
_subGetter(() => connector.get(recycleCtx.state), index),
bus: recycleCtx.bus,
enhancer: recycleCtx.enhancer,
),
);
adapters.add(result.buildAdapter(subCtx));
} else if (result is AbstractComponent<Object>) {
adapters.add(ListAdapter((BuildContext buildContext, int _) {
return result.buildComponent(
recycleCtx.store,
_subGetter(() => connector.get(recycleCtx.state), index),
bus: recycleCtx.bus,
enhancer: recycleCtx.enhancer,
);
}, 1));
}
Expand Down
36 changes: 26 additions & 10 deletions lib/src/redux_adapter/recycle_context.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,26 @@ import '../redux/redux.dart';
import '../redux_component/context.dart';
import '../redux_component/redux_component.dart';

class RecycleContext<T> extends DefaultContext<T> {
class RecycleContext<T> extends LogicContext<T> {
final Map<Object, List<ContextSys<Object>>> _cachedMap =
<Object, List<ContextSys<Object>>>{};
final Map<Object, int> _usedIndexMap = <Object, int>{};

RecycleContext({
AbstractLogic<T> logic,
MixedStore<Object> store,
BuildContext buildContext,
Get<T> getState,
}) : super(
@required AbstractAdapter<T> logic,
@required @required Store<Object> store,
@required BuildContext buildContext,
@required Get<T> getState,
@required DispatchBus bus,
@required Enhancer<Object> enhancer,
}) : assert(bus != null && enhancer != null),
super(
logic: logic,
store: store,
buildContext: buildContext,
getState: getState,
bus: bus,
enhancer: enhancer,
);

@override
Expand Down Expand Up @@ -65,20 +70,31 @@ class RecycleContext<T> extends DefaultContext<T> {
return usedCount == 0;
});
}

@override
ListAdapter buildAdapter() {
final AbstractAdapter<T> curLogic = logic;
return curLogic.buildAdapter(this);
}
}

mixin RecycleContextMixin<T> on Logic<T> {
mixin RecycleContextMixin<T> implements AbstractAdapter<T> {
@override
RecycleContext<T> createContext({
MixedStore<Object> store,
RecycleContext<T> createContext(
Store<Object> store,
BuildContext buildContext,
Get<T> getState,
Get<T> getState, {
@required DispatchBus bus,
@required Enhancer<Object> enhancer,
}) {
assert(bus != null && enhancer != null);
return RecycleContext<T>(
logic: this,
store: store,
buildContext: buildContext,
getState: getState,
bus: bus,
enhancer: enhancer,
);
}
}
Expand Down
10 changes: 7 additions & 3 deletions lib/src/redux_adapter/static_flow_adapter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,11 @@ class StaticFlowAdapter<T> extends Logic<T>
/// use index of key
final ContextSys<Object> subCtx = recycleCtx.reuseOrCreate(i, () {
return dependent.createContext(
store: recycleCtx.store,
buildContext: recycleCtx.context,
getState: recycleCtx.getState,
recycleCtx.store,
recycleCtx.context,
recycleCtx.getState,
bus: recycleCtx.bus,
enhancer: recycleCtx.enhancer,
);
});
final ListAdapter subAdapter = dependent.buildAdapter(subCtx);
Expand All @@ -65,6 +67,8 @@ class StaticFlowAdapter<T> extends Logic<T>
return dependent.buildComponent(
recycleCtx.store,
recycleCtx.getState,
bus: recycleCtx.bus,
enhancer: recycleCtx.enhancer,
);
}, 1));
}
Expand Down
2 changes: 1 addition & 1 deletion lib/src/redux_adapter/visible_change.dart
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ class _VisibleChangeWidget extends StatefulWidget {

ListAdapter _wrapVisibleChange<T>(
ListAdapter listAdapter,
DefaultContext<T> ctx,
LogicContext<T> ctx,
) {
final _VisibleChangeDispatch onChange =
(ctx.extra['\$visible'] ??= _VisibleChangeDispatch(ctx.dispatch));
Expand Down
Loading

0 comments on commit 425162b

Please sign in to comment.