Skip to content

Commit 40f136f

Browse files
author
whqfor
committed
开放native、flutter侧每次节点操作监听
1 parent 19a8e5f commit 40f136f

File tree

11 files changed

+81
-3
lines changed

11 files changed

+81
-3
lines changed

example/ios/Flutter/.last_build_id

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3f715bff32baf5101070f62afcbad897
1+
d77992cc63302afcaf57acfc9766cb4c

example/ios/Podfile.lock

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,26 @@
11
PODS:
22
- d_stack (0.0.1):
33
- Flutter
4+
- d_stack_spy (0.0.1):
5+
- Flutter
46
- Flutter (1.0.0)
57

68
DEPENDENCIES:
79
- d_stack (from `.symlinks/plugins/d_stack/ios`)
10+
- d_stack_spy (from `.symlinks/plugins/d_stack_spy/ios`)
811
- Flutter (from `Flutter`)
912

1013
EXTERNAL SOURCES:
1114
d_stack:
1215
:path: ".symlinks/plugins/d_stack/ios"
16+
d_stack_spy:
17+
:path: ".symlinks/plugins/d_stack_spy/ios"
1318
Flutter:
1419
:path: Flutter
1520

1621
SPEC CHECKSUMS:
1722
d_stack: 218a394e5759f06ed1f1aacbeea9c78314bdcfd6
23+
d_stack_spy: 6894898f3f681296224a57a6419e9e361fee19f7
1824
Flutter: 0e3d915762c693b495b44d77113d4970485de6ec
1925

2026
PODFILE CHECKSUM: 9d0ac94d3d11f2290fe3fb976f070609fc82675b

example/pubspec.lock

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,13 @@ packages:
5757
relative: true
5858
source: path
5959
version: "1.2.8+4"
60+
d_stack_spy:
61+
dependency: "direct dev"
62+
description:
63+
path: "../../d_stack_spy"
64+
relative: true
65+
source: path
66+
version: "0.0.1"
6067
fake_async:
6168
dependency: transitive
6269
description:
@@ -158,4 +165,4 @@ packages:
158165
version: "2.1.0-nullsafety.3"
159166
sdks:
160167
dart: ">=2.10.0-110 <2.11.0"
161-
flutter: ">=1.17.0"
168+
flutter: ">=1.20.0 <2.0.0"

ios/Classes/Node/DNodeManager.m

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,33 @@ - (void)updateRootNodeWithFlutter
384384

385385
#pragma mark -- private
386386

387+
- (void)operationNode:(DNode *)node {
388+
389+
// 发送给flutter侧
390+
NSDictionary *params;
391+
if (node.target) {
392+
params = @{
393+
@"action": node.actionTypeString,
394+
@"pageType": node.pageTypeString,
395+
@"target": node.target,
396+
@"params": node.params,
397+
@"homePage": @(node.isFlutterHomePage),
398+
@"boundary": @(node.boundary),
399+
@"animated": @(node.animated),
400+
};
401+
} else {
402+
params = @{};
403+
}
404+
405+
[[DStackPlugin sharedInstance] invokeMethod:DStackMethodChannelSendOperationNodeToFlutter
406+
arguments:params
407+
result:nil];
408+
// 发送调给native侧
409+
[self dStackDelegateSafeWithSEL:@selector(operationNode:) exe:^(DStack *stack) {
410+
[stack.delegate operationNode:[node copy]];
411+
}];
412+
}
413+
387414
- (DNode *)nodeWithTarget:(NSString *)target
388415
{
389416
DNode *targetNode = nil;
@@ -479,6 +506,7 @@ - (void)cleanLogFile
479506

480507
- (void)writeLogWithNode:(DNode *)node
481508
{
509+
[self operationNode:node];
482510
dispatch_async(self.logQueue, ^{
483511
if (!self.logPath || !node) { return;}
484512
NSString *target = node.target;

ios/Classes/Stack/DStack.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,10 @@ NS_ASSUME_NONNULL_BEGIN
267267
/// @param nodes 出栈节点列表
268268
- (void)dStack:(DStack *)stack outStack:(NSArray <DStackNode *>*)nodes;
269269

270+
/// 用户操作的所有行为都将会从这个api传出,可以基于此做行为回放
271+
/// 将要进行操作的节点
272+
- (void)operationNode:(DStackNode *)node;
273+
270274
/// 节点显示与消失
271275
/// @param stack stack
272276
/// @param appear 正在显示的node

ios/Classes/Stack/DStackPlugin.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ UIKIT_EXTERN DStackMethodChannelName const DStackMethodChannelSendRemoveFlutterP
1717
UIKIT_EXTERN DStackMethodChannelName const DStackMethodChannelSendLifeCircle; // 生命周期通道
1818
UIKIT_EXTERN DStackMethodChannelName const DStackMethodChannelSendNodeList; // 节点列表
1919
UIKIT_EXTERN DStackMethodChannelName const DStackMethodChannelSendFlutterRootNode; // 设置flutter根节点
20+
UIKIT_EXTERN DStackMethodChannelName const DStackMethodChannelSendOperationNodeToFlutter; // Operation节点
2021

2122
@interface DStackPlugin : NSObject<FlutterPlugin>
2223

ios/Classes/Stack/DStackPlugin.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
DStackMethodChannelName const DStackMethodChannelSendLifeCircle = @"sendLifeCycle";
1616
DStackMethodChannelName const DStackMethodChannelSendNodeList = @"sendNodeList";
1717
DStackMethodChannelName const DStackMethodChannelSendFlutterRootNode = @"sendFlutterRootNode";
18+
DStackMethodChannelName const DStackMethodChannelSendOperationNodeToFlutter = @"sendOperationNodeToFlutter";
1819

1920

2021
@interface DStackPlugin ()

lib/channel/dchannel.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import 'dart:async';
1111

1212
import 'package:d_stack/constant/constant_config.dart';
1313
import 'package:d_stack/navigator/dnavigator_manager.dart';
14+
import 'package:d_stack/observer/d_node_observer.dart';
1415
import 'package:d_stack/observer/life_cycle_observer.dart';
1516
import 'package:flutter/services.dart';
1617

@@ -27,6 +28,8 @@ class DChannel {
2728
return DNavigatorManager.handleActionToFlutter(call.arguments);
2829
} else if (DStackConstant.lifeCycle == call.method) {
2930
return LifeCycleHandler.handleLifecycleMessage(call.arguments);
31+
} else if (DStackConstant.sendOperationNodeToFlutter == call.method) {
32+
return DNodeObserverHandler.handlerNodeMessage(call.arguments);
3033
}
3134
return Future.value();
3235
});

lib/constant/constant_config.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class DStackConstant {
2525
static const String lifeCycle = "sendLifeCycle";
2626
static const String nodeList = "sendNodeList";
2727
static const String sendFlutterRootNode = "sendFlutterRootNode";
28+
static const String sendOperationNodeToFlutter = 'sendOperationNodeToFlutter';
2829

2930
/// 其他标识
3031
static const String nativeDidPopGesture = "nativeDidPopGesture";

lib/d_stack.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import 'package:d_stack/channel/dchannel.dart';
1111
import 'package:d_stack/navigator/dnavigator_gesture_observer.dart';
1212
import 'package:d_stack/navigator/dnavigator_manager.dart';
13+
import 'package:d_stack/observer/d_node_observer.dart';
1314
import 'package:d_stack/observer/life_cycle_observer.dart';
1415
import 'package:flutter/material.dart';
1516
import 'package:flutter/services.dart';
@@ -53,6 +54,8 @@ class DStack {
5354

5455
/// 用来监听 应用生命周期
5556
DLifeCycleObserver dLifeCycleObserver;
57+
/// 用来监听节点操作
58+
DNodeObserver dNodeObserver;
5659

5760
bool _hasHomePage = false;
5861
bool get hasHomePage => _hasHomePage;
@@ -73,11 +76,13 @@ class DStack {
7376
/// observer 生命周期监听者
7477
void register(
7578
{Map<String, DStackWidgetBuilder> builders,
76-
DLifeCycleObserver observer}) {
79+
DLifeCycleObserver observer,
80+
DNodeObserver nodeObserver}) {
7781
if (builders?.isNotEmpty == true) {
7882
_pageBuilders.addAll(builders);
7983
}
8084
dLifeCycleObserver = observer;
85+
dNodeObserver = nodeObserver;
8186
}
8287

8388
/// 获取一个 DStackWidgetBuilder

lib/observer/d_node_observer.dart

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
* Created with Android Studio.
3+
* User: whqfor
4+
* Date: 12/5/20
5+
* Time: 6:04 PM
6+
* target: 监听节点的observer
7+
*/
8+
9+
import 'package:d_stack/d_stack.dart';
10+
11+
abstract class DNodeObserver {
12+
/// 用户操作的所有行为都将会从这个api传出,可以基于此做行为回放
13+
/// 将要进行操作的节点
14+
void operationNode(Map node);
15+
}
16+
17+
class DNodeObserverHandler {
18+
19+
static handlerNodeMessage(Map node) {
20+
DStack.instance.dNodeObserver?.operationNode(node);
21+
}
22+
}

0 commit comments

Comments
 (0)