Skip to content

Commit 1835cad

Browse files
author
maxu
committed
增加节点记录功能
1 parent 19a8e5f commit 1835cad

File tree

8 files changed

+159
-15
lines changed

8 files changed

+159
-15
lines changed

android/src/main/kotlin/tal/com/d_stack/DStack.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import tal.com.d_stack.observer.DStackLifecycleObserver;
2323
import tal.com.d_stack.observer.FilterActivityManager;
2424
import tal.com.d_stack.router.INativeRouter;
25+
import tal.com.d_stack.router.INodeOperation;
2526
import tal.com.d_stack.utils.DLog;
2627

2728
/**
@@ -56,6 +57,10 @@ public static DStack getInstance() {
5657

5758
private INativeRouter nativeRouter;
5859

60+
private INodeOperation nodeOperation;
61+
62+
private boolean openNodeOperation;
63+
5964
/**
6065
* 初始化DStack
6166
*
@@ -264,4 +269,32 @@ public void removeFilter(String filterString) {
264269
public void listenBackPressed() {
265270

266271
}
272+
273+
/**
274+
* 设置节点操作监听
275+
*/
276+
public void setNodeOperation(INodeOperation nodeOperation) {
277+
this.nodeOperation = nodeOperation;
278+
}
279+
280+
/**
281+
* 获取节点操作监听
282+
*/
283+
public INodeOperation getNodeOperation() {
284+
return nodeOperation;
285+
}
286+
287+
/**
288+
* 节点操作是否开启
289+
*/
290+
public boolean isOpenNodeOperation() {
291+
return openNodeOperation;
292+
}
293+
294+
/**
295+
* 设置是否开启节点操作
296+
*/
297+
public void setOpenNodeOperation(boolean openNodeOperation) {
298+
this.openNodeOperation = openNodeOperation;
299+
}
267300
}

android/src/main/kotlin/tal/com/d_stack/action/DActionManager.java

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,27 +27,53 @@ public class DActionManager {
2727
*/
2828
public static void push(DNode node) {
2929
enterPageWithNode(node, DNodeActionType.DNodeActionTypePush, node.isAnimated());
30+
DOperationManager.operation(node);
3031
}
3132

3233
/**
3334
* 返回当前页面
3435
*/
3536
public static void pop(DNode node) {
3637
closePageWithNode(node, DNodeActionType.DNodeActionTypePop, node.isAnimated());
38+
DOperationManager.operation(node);
3739
}
3840

3941
/**
4042
* 返回指定页面
4143
*/
4244
public static void popTo(DNode node, List<DNode> removeNodes) {
43-
closePageWithNodes(node, removeNodes, DNodeActionType.DNodeActionTypePopTo, node.isAnimated());
45+
closePageWithNodes(removeNodes, DNodeActionType.DNodeActionTypePopTo, node.isAnimated());
46+
DOperationManager.operation(node);
47+
}
48+
49+
/**
50+
* 返回根页面
51+
*/
52+
public static void popToRoot(DNode node, List<DNode> removeNodes) {
53+
closePageWithNodes(removeNodes, DNodeActionType.DNodeActionTypePopToRoot, node.isAnimated());
54+
DOperationManager.operation(node);
4455
}
4556

4657
/**
4758
* 返回指定模块页面
4859
*/
4960
public static void popSkip(DNode node, List<DNode> removeNodes) {
50-
closePageWithNodes(node, removeNodes, DNodeActionType.DNodeActionTypePopSkip, node.isAnimated());
61+
closePageWithNodes(removeNodes, DNodeActionType.DNodeActionTypePopSkip, node.isAnimated());
62+
DOperationManager.operation(node);
63+
}
64+
65+
/**
66+
* 替换页面
67+
*/
68+
public static void replace(DNode node) {
69+
DOperationManager.operation(node);
70+
}
71+
72+
/**
73+
* 手势返回页面
74+
*/
75+
public static void gesture(DNode node) {
76+
DOperationManager.operation(node);
5177
}
5278

5379
/**
@@ -102,7 +128,7 @@ private static void closePageWithNode(DNode node, String action, boolean animate
102128
/**
103129
* 关闭已移除节点集合的所有页面,包括native和flutter
104130
*/
105-
private static void closePageWithNodes(final DNode node, List<DNode> nodes, final String action, final boolean animated) {
131+
private static void closePageWithNodes(List<DNode> nodes, final String action, final boolean animated) {
106132
final List<Map<String, Object>> flutterNodes = new ArrayList<>();
107133
List<String> nativeNodes = new ArrayList<>();
108134
int size = nodes.size();
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package tal.com.d_stack.action;
2+
3+
import tal.com.d_stack.DStack;
4+
import tal.com.d_stack.channel.DStackMethodHandler;
5+
import tal.com.d_stack.node.DNode;
6+
import tal.com.d_stack.node.DNodeManager;
7+
import tal.com.d_stack.node.DNodeResponse;
8+
import tal.com.d_stack.router.INodeOperation;
9+
import tal.com.d_stack.utils.DLog;
10+
11+
/**
12+
* 节点操作行为记录
13+
*/
14+
public class DOperationManager {
15+
public static void operation(DNode node) {
16+
if (!DStack.getInstance().isOpenNodeOperation()) {
17+
return;
18+
}
19+
DNodeResponse nodeResponse = DNodeManager.getInstance().createNodeResponse(node);
20+
DLog.logE("$$$$$节点操作$$$$$");
21+
DLog.logE(nodeResponse.action + "-----" + nodeResponse.target);
22+
DLog.logE("$$$$$节点操作$$$$$");
23+
DStackMethodHandler.sendNodeOperation(nodeResponse);
24+
INodeOperation nodeOperation = DStack.getInstance().getNodeOperation();
25+
if (nodeOperation != null) {
26+
nodeOperation.operationNode(nodeResponse);
27+
}
28+
}
29+
}

android/src/main/kotlin/tal/com/d_stack/channel/DStackMethodHandler.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,36 @@ public void notImplemented() {
191191
});
192192
}
193193

194+
/**
195+
* native侧发送节点的操作
196+
*/
197+
public static void sendNodeOperation(DNodeResponse nodeResponse) {
198+
Map<String, Object> resultMap = new HashMap();
199+
resultMap.put("target", nodeResponse.target);
200+
resultMap.put("pageType", nodeResponse.pageType);
201+
resultMap.put("action", nodeResponse.action);
202+
resultMap.put("params", nodeResponse.params);
203+
resultMap.put("homePage", nodeResponse.homePage);
204+
resultMap.put("boundary", nodeResponse.boundary);
205+
resultMap.put("animated", nodeResponse.animated);
206+
DStack.getInstance().getMethodChannel().invokeMethod("sendOperationNodeToFlutter", resultMap, new MethodChannel.Result() {
207+
@Override
208+
public void success(Object result) {
209+
210+
}
211+
212+
@Override
213+
public void error(String errorCode, String errorMessage, Object errorDetails) {
214+
215+
}
216+
217+
@Override
218+
public void notImplemented() {
219+
220+
}
221+
});
222+
}
223+
194224
/**
195225
* 根据flutter侧传来的信息创建节点
196226
*/

android/src/main/kotlin/tal/com/d_stack/node/DNodeManager.java

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.util.concurrent.atomic.AtomicReference;
1111

1212
import tal.com.d_stack.action.DActionManager;
13+
import tal.com.d_stack.action.DOperationManager;
1314
import tal.com.d_stack.lifecycle.PageLifecycleManager;
1415
import tal.com.d_stack.node.constants.DNodeActionType;
1516
import tal.com.d_stack.node.constants.DNodePageType;
@@ -116,7 +117,7 @@ public void checkNode(DNode node) {
116117
DNode popToRootNode = getCurrentNode();
117118
deleteNodes();
118119
updateNodes();
119-
DActionManager.popTo(node, needRemoveNodes);
120+
DActionManager.popToRoot(node, needRemoveNodes);
120121
PageLifecycleManager.pageDisappear(popToRootNode);
121122
DLog.logD("----------popToRoot方法结束----------");
122123
break;
@@ -133,8 +134,11 @@ public void checkNode(DNode node) {
133134
DLog.logD("----------popSkip方法结束----------");
134135
break;
135136
case DNodeActionType.DNodeActionTypeGesture:
137+
DLog.logD("----------gesture方法开始----------");
136138
nodeList.remove(nodeList.size() - 1);
139+
DLog.logD("----------gesture方法结束----------");
137140
updateNodes();
141+
DActionManager.gesture(node);
138142
break;
139143
case DNodeActionType.DNodeActionTypeReplace:
140144
DLog.logD("----------replace方法开始----------");
@@ -146,6 +150,7 @@ public void checkNode(DNode node) {
146150
}
147151
updateNodes();
148152
PageLifecycleManager.pageAppearWithReplace(preNode, currentNode);
153+
DActionManager.replace(node);
149154
DLog.logD("----------replace方法结束----------");
150155
break;
151156
default:
@@ -179,15 +184,24 @@ private boolean repeatNode(DNode node) {
179184
private List<DNode> needRemoveNodes(DNode node) {
180185
List<DNode> removeNodeList = new ArrayList<>();
181186
boolean startAddRemoveList = true;
187+
boolean existNode = false;
182188
int size = nodeList.size();
183-
for (int i = size - 1; i >= 0; i--) {
184-
DNode currentNode = nodeList.get(i);
185-
if (currentNode.getTarget().equals(node.getTarget())) {
186-
startAddRemoveList = false;
189+
for (DNode tempNode : nodeList) {
190+
if (tempNode.getTarget().equals(node.getTarget())) {
191+
existNode = true;
192+
break;
187193
}
188-
if (startAddRemoveList) {
189-
removeNodeList.add(currentNode);
190-
needRemoveNodesIndex.add(i);
194+
}
195+
if (existNode) {
196+
for (int i = size - 1; i >= 0; i--) {
197+
DNode currentNode = nodeList.get(i);
198+
if (currentNode.getTarget().equals(node.getTarget())) {
199+
startAddRemoveList = false;
200+
}
201+
if (startAddRemoveList) {
202+
removeNodeList.add(currentNode);
203+
needRemoveNodesIndex.add(i);
204+
}
191205
}
192206
}
193207
Collections.reverse(removeNodeList);
@@ -312,6 +326,7 @@ public void handleNeedRemoveFlutterNode(DNode node) {
312326
nodeList.remove(currentNode);
313327
updateNodes();
314328
PageLifecycleManager.pageDisappear(node);
329+
DOperationManager.operation(node);
315330
}
316331
}
317332
}
@@ -332,6 +347,7 @@ public void removeNodeWithOnDestroyed(DNode node) {
332347
if (needRemoveNode != null) {
333348
nodeList.remove(needRemoveNode);
334349
PageLifecycleManager.pageDisappear(node);
350+
DOperationManager.operation(node);
335351
}
336352
updateNodes();
337353
DLog.logD("----------removeNodeWithOnDestroyed方法结束----------");
@@ -396,9 +412,6 @@ public DNodeResponse createNodeResponse(DNode node) {
396412
nodeResponse.homePage = node.isHomePage();
397413
nodeResponse.animated = node.isAnimated();
398414
nodeResponse.boundary = node.isBoundary();
399-
DLog.logD("-----createNodeResponse开始-----");
400-
DLog.logD(nodeResponse.toString());
401-
DLog.logD("-----createNodeResponse结束-----");
402415
return nodeResponse;
403416
}
404417

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package tal.com.d_stack.router;
2+
3+
import tal.com.d_stack.node.DNodeResponse;
4+
5+
/**
6+
* 节点操作接口
7+
*/
8+
public interface INodeOperation {
9+
10+
void operationNode(DNodeResponse node);
11+
12+
}

example/android/app/src/main/kotlin/tal/com/d_stack_example/DStackApplication.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,6 @@ public void onCreate() {
2222
application.startActivity(intent);
2323
}
2424
});
25+
DStack.getInstance().setOpenNodeOperation(true);
2526
}
2627
}

example/lib/page_widgets.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ class Page4 extends StatelessWidget {
116116
RaisedButton(
117117
child: Text('popTo Flutter Page 2'),
118118
onPressed: () {
119-
DStack.popTo("HomeViewController", PageType.flutter);
119+
DStack.popTo("page2", PageType.flutter);
120120
},
121121
),
122122
RaisedButton(

0 commit comments

Comments
 (0)