Skip to content

Commit 0e46935

Browse files
committed
1.add getter method inject support
2.add isRegex all demo in inject2.dart 3.fix package fetch bug
1 parent 7704613 commit 0e46935

9 files changed

Lines changed: 309 additions & 109 deletions

example/lib/inject.dart

Lines changed: 63 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,10 @@ class Inject {
2121
Function proceed) {
2222
debugPrint(
2323
"[Inject] $functionName start ${positionalParams[0]} ${positionalParams[1]} ${namedParams["key3"]}");
24-
Function.apply(proceed, positionalParams, _transToNamedParams(namedParams));
24+
25+
proceed.call(positionalParams[0], positionalParams[1],
26+
key3: namedParams["key3"]);
27+
//Function.apply(proceed, positionalParams, _transToNamedParams(namedParams));
2528
}
2629

2730
//普通方法拦截,带返回值
@@ -37,8 +40,11 @@ class Inject {
3740
target, functionName, positionalParams, namedParams, proceed) {
3841
debugPrint(
3942
"[Inject] $functionName start ${positionalParams[0]} ${positionalParams[1]} ${namedParams["key3"]}");
40-
return Function.apply(
41-
proceed, positionalParams, _transToNamedParams(namedParams));
43+
44+
return proceed.call(positionalParams[0], positionalParams[1],
45+
key3: namedParams["key3"]);
46+
//return Function.apply(
47+
// proceed, positionalParams, _transToNamedParams(namedParams));
4248
}
4349

4450
//普通静态方法拦截,带返回值
@@ -58,8 +64,11 @@ class Inject {
5864
Function proceed) {
5965
debugPrint(
6066
"[Inject] $functionName start ${positionalParams[0]} ${positionalParams[1]} ${namedParams["key3"]}");
61-
return Function.apply(
62-
proceed, positionalParams, _transToNamedParams(namedParams));
67+
68+
return proceed.call(positionalParams[0], positionalParams[1],
69+
key3: namedParams["key3"]);
70+
//return Function.apply(
71+
// proceed, positionalParams, _transToNamedParams(namedParams));
6372
}
6473

6574
//非类中的方法拦截
@@ -79,8 +88,11 @@ class Inject {
7988
Function proceed) async {
8089
debugPrint(
8190
"[Inject] $functionName start ${positionalParams[0]} ${positionalParams[1]} ${namedParams["key3"]}");
82-
bool success = await Function.apply(
83-
proceed, positionalParams, _transToNamedParams(namedParams));
91+
92+
bool success = await proceed.call(positionalParams[0], positionalParams[1],
93+
key3: namedParams["key3"]);
94+
//bool success = await Function.apply(
95+
// proceed, positionalParams, _transToNamedParams(namedParams));
8496
debugPrint("[Inject] $functionName result $success");
8597
return success;
8698
}
@@ -102,8 +114,10 @@ class Inject {
102114
Function proceed) async {
103115
debugPrint(
104116
"[Inject] $functionName start ${positionalParams[0]} ${positionalParams[1]} ${namedParams["key3"]}");
105-
bool success = await Function.apply(
106-
proceed, positionalParams, _transToNamedParams(namedParams));
117+
bool success = await proceed.call(positionalParams[0], positionalParams[1],
118+
key3: namedParams["key3"]);
119+
//bool success = await Function.apply(
120+
// proceed, positionalParams, _transToNamedParams(namedParams));
107121
debugPrint("[Inject] $functionName result $success");
108122
return success;
109123
}
@@ -126,9 +140,9 @@ class Inject {
126140
Function proceed) {
127141
debugPrint(
128142
"[Inject] $functionName start ${namedParams["title"]} ${namedParams["message"]}");
129-
130-
return Function.apply(
131-
proceed, positionalParams, _transToNamedParams(namedParams));
143+
return proceed.call(positionalParams[0], message: namedParams["message"]);
144+
//return Function.apply(
145+
// proceed, positionalParams, _transToNamedParams(namedParams));
132146
}
133147

134148
// //全局catch拦截
@@ -157,7 +171,7 @@ class Inject {
157171
})
158172
//必须是static,不然不起作用
159173
//这里需要注意Extension的注入和普通方法不同,methodName的写法也与普遍的不同
160-
//Extension中的方法第一个positionalParams[0]所代表的参数是它扩展的实例本身
174+
//Extension中的方法第一个positionalParams[0]所代表的参数是它扩展的实例本身,后面的才是参数
161175
static Future<bool> _injectTest5(
162176
Object target,
163177
String functionName,
@@ -166,8 +180,12 @@ class Inject {
166180
Function proceed) async {
167181
debugPrint(
168182
"[Inject] $functionName start ${positionalParams[0].runtimeType.toString()} ${positionalParams[1]} ${positionalParams[2]} ${namedParams["key3"]}");
169-
bool success = await Function.apply(
170-
proceed, positionalParams, _transToNamedParams(namedParams));
183+
184+
bool success = await proceed.call(
185+
positionalParams[0], positionalParams[1], positionalParams[2],
186+
key3: namedParams["key3"]);
187+
// bool success = await Function.apply(
188+
// proceed, positionalParams, _transToNamedParams(namedParams));
171189
debugPrint("[Inject] $functionName result $success");
172190
return success;
173191
}
@@ -187,9 +205,12 @@ class Inject {
187205
Map<dynamic, dynamic> namedParams,
188206
Function proceed) {
189207
PointerEvent event = positionalParams[0];
208+
HitTestResult? hitTestResult = positionalParams[1];
190209
//debugPrint('dispatchEvent - start ${event.kind.name}');
191-
return Function.apply(
192-
proceed, positionalParams, _transToNamedParams(namedParams));
210+
211+
return proceed.call(event, hitTestResult);
212+
// return Function.apply(
213+
// proceed, positionalParams, _transToNamedParams(namedParams));
193214
}
194215

195216
//Mixin里方法拦截的例子
@@ -209,7 +230,9 @@ class Inject {
209230
Function proceed) async {
210231
debugPrint(
211232
"[Inject] $functionName start ${positionalParams[0]} ${positionalParams[1]} ${namedParams["key3"]}");
212-
Function.apply(proceed, positionalParams, _transToNamedParams(namedParams));
233+
proceed.call(positionalParams[0], positionalParams[1],
234+
key3: namedParams["key3"]);
235+
//Function.apply(proceed, positionalParams, _transToNamedParams(namedParams));
213236
}
214237

215238
@pragma('vm:entry-point')
@@ -228,7 +251,9 @@ class Inject {
228251
Function proceed) async {
229252
debugPrint(
230253
"[Inject] $functionName start ${positionalParams[0]} ${positionalParams[1]} ${namedParams["key3"]}");
231-
Function.apply(proceed, positionalParams, _transToNamedParams(namedParams));
254+
proceed.call(positionalParams[0], positionalParams[1],
255+
key3: namedParams["key3"]);
256+
//Function.apply(proceed, positionalParams, _transToNamedParams(namedParams));
232257
}
233258

234259
@pragma('vm:entry-point')
@@ -246,8 +271,11 @@ class Inject {
246271
Map<dynamic, dynamic> namedParams,
247272
Function proceed) async {
248273
debugPrint("[Inject] $functionName start: ${namedParams["packageName"]}");
249-
int result = await Function.apply(
250-
proceed, positionalParams, _transToNamedParams(namedParams));
274+
275+
int result = await proceed.call(packageName: namedParams["packageName"]);
276+
277+
//int result = await Function.apply(
278+
// proceed, positionalParams, _transToNamedParams(namedParams));
251279
debugPrint("[Inject] $functionName result: $result");
252280
return result;
253281
}
@@ -267,8 +295,10 @@ class Inject {
267295
Map<dynamic, dynamic> namedParams,
268296
Function proceed) async {
269297
debugPrint("[Inject] $functionName start: ${namedParams["packageName"]}");
270-
int result = await Function.apply(
271-
proceed, positionalParams, _transToNamedParams(namedParams));
298+
299+
int result = await proceed.call(packageName: namedParams["packageName"]);
300+
//int result = await Function.apply(
301+
// proceed, positionalParams, _transToNamedParams(namedParams));
272302
debugPrint("[Inject] $functionName result: $result");
273303
return result;
274304
}
@@ -289,8 +319,10 @@ class Inject {
289319
Function proceed) async {
290320
debugPrint(
291321
"[Inject] _injectGetAppVersion22 start: ${namedParams["packageName"]}");
292-
int result = await Function.apply(
293-
proceed, positionalParams, _transToNamedParams(namedParams));
322+
323+
int result = await proceed.call(packageName: namedParams["packageName"]);
324+
//int result = await Function.apply(
325+
// proceed, positionalParams, _transToNamedParams(namedParams));
294326
debugPrint("[Inject] _injectGetAppVersion22 result: $result");
295327
return result;
296328
}
@@ -310,9 +342,10 @@ class Inject {
310342
Map<dynamic, dynamic> namedParams,
311343
Function proceed) async {
312344
debugPrint("[Inject] testMixin start");
345+
return proceed.call();
313346

314-
return Function.apply(
315-
proceed, positionalParams, _transToNamedParams(namedParams));
347+
//return Function.apply(
348+
// proceed, positionalParams, _transToNamedParams(namedParams));
316349
}
317350

318351
@pragma('vm:entry-point')
@@ -331,18 +364,8 @@ class Inject {
331364
Function proceed) async {
332365
debugPrint(
333366
"[Inject] baseTest start: ${target.runtimeType.toString()} $functionName ");
334-
335-
return Function.apply(
336-
proceed, positionalParams, _transToNamedParams(namedParams));
337-
}
338-
339-
@pragma('vm:entry-point')
340-
static Map<Symbol, dynamic> _transToNamedParams(
341-
Map<dynamic, dynamic> namedParams) {
342-
Map<Symbol, dynamic> maps = {};
343-
namedParams.forEach((key, value) {
344-
maps[Symbol(key)] = value;
345-
});
346-
return maps;
367+
return proceed.call();
368+
//return Function.apply(
369+
// proceed, positionalParams, _transToNamedParams(namedParams));
347370
}
348371
}

example/lib/inject2.dart

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import 'package:flutter/foundation.dart';
2+
import 'package:flutter/gestures.dart';
3+
4+
//普通方法拦截
5+
@pragma("aopd:aspect")
6+
@pragma('vm:entry-point')
7+
class Inject {
8+
@pragma('vm:entry-point')
9+
static Map<Symbol, dynamic> _transToNamedParams(
10+
Map<dynamic, dynamic> namedParams) {
11+
Map<Symbol, dynamic> maps = {};
12+
namedParams.forEach((key, value) {
13+
maps[Symbol(key)] = value;
14+
});
15+
return maps;
16+
}
17+
18+
@pragma('vm:entry-point')
19+
@pragma("aopd:inject", {
20+
"importUri": "package:example/main.dart",
21+
"clsName": ".",
22+
"methodName": "-.",
23+
"isRegex": true
24+
})
25+
//必须是static,不然不起作用,
26+
//isRegex =true时我们不知道方法的签名,编译时混淆 --obfuscate
27+
//就会出错,建议isRegex =true,不要用在混淆的时候
28+
static dynamic _injectAllMethod(
29+
Object target,
30+
String functionName,
31+
List positionalParams,
32+
Map<String, dynamic> namedParams,
33+
Function proceed) {
34+
debugPrint("[Inject All] $functionName ");
35+
return Function.apply(
36+
proceed, positionalParams, _transToNamedParams(namedParams));
37+
}
38+
39+
@pragma('vm:entry-point')
40+
@pragma("aopd:inject", {
41+
"importUri": "package:example/main.dart",
42+
"clsName": ".",
43+
"methodName": "+.",
44+
"isRegex": true
45+
})
46+
//必须是static,不然不起作用
47+
static dynamic _injectAllMethodStatic(
48+
Object target,
49+
String functionName,
50+
List positionalParams,
51+
Map<String, dynamic> namedParams,
52+
Function proceed) {
53+
debugPrint("[Inject All Static] $functionName ");
54+
return Function.apply(
55+
proceed, positionalParams, _transToNamedParams(namedParams));
56+
}
57+
58+
@pragma('vm:entry-point')
59+
@pragma("aopd:inject", {
60+
"importUri": "package:example/main.dart",
61+
"clsName": ".",
62+
"methodName": "-.",
63+
"isRegex": true,
64+
"isGetter": true
65+
})
66+
//必须是static,不然不起作用
67+
static dynamic _injectAllMethodGetter(
68+
Object target,
69+
String functionName,
70+
List positionalParams,
71+
Map<String, dynamic> namedParams,
72+
Function proceed) {
73+
debugPrint("[Inject All Getter] $functionName ");
74+
return Function.apply(
75+
proceed, positionalParams, _transToNamedParams(namedParams));
76+
}
77+
78+
@pragma('vm:entry-point')
79+
@pragma("aopd:inject", {
80+
"importUri": "package:example/main.dart",
81+
"clsName": ".",
82+
"methodName": "+.",
83+
"isRegex": true,
84+
"isGetter": true,
85+
})
86+
//必须是static,不然不起作用
87+
static dynamic _injectAllMethodGetterStatic(
88+
Object target,
89+
String functionName,
90+
List positionalParams,
91+
Map<String, dynamic> namedParams,
92+
Function proceed) {
93+
debugPrint("[Inject All Getter Static] $functionName ");
94+
return Function.apply(
95+
proceed, positionalParams, _transToNamedParams(namedParams));
96+
}
97+
}

example/lib/main.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
33

44
//必须有,不然不起作用
55
// ignore: unused_import
6+
//import 'inject2.dart';
67
import 'inject.dart';
78

89
void main() {
@@ -60,6 +61,11 @@ Future<bool> _test4(int key1, String key2, {String key3 = 'namedkey4'}) async {
6061
return true;
6162
}
6263

64+
int _intTest = 11;
65+
66+
int get getIntTest => _intTest;
67+
set getIntTest(int i) => _intTest = i;
68+
6369
Future<bool> _testtry(int key1, String key2,
6470
{String key3 = 'namedkey4'}) async {
6571
try {
@@ -123,6 +129,11 @@ abstract class BaseRepository extends Repository with MixinUpgrade {
123129
debugPrint("getAppVersion2 $packageName");
124130
return 0;
125131
}
132+
133+
int _p1 = 0;
134+
135+
int get p1 => _p1 + 7;
136+
set p1(int i) => _p1 = i;
126137
}
127138

128139
mixin MixinUpgrade on Repository {
@@ -179,10 +190,19 @@ class _MyHomePageState extends State<MyHomePage>
179190

180191
repository.getAppVersion(packageName: "packageName");
181192
repository.getAppVersion2(packageName: "packageName2");
193+
repository.p1 = 1;
194+
debugPrint("p1 is ${repository.p1}");
195+
repository.p1 = 2;
196+
debugPrint("again p1 is ${repository.p1}");
197+
182198
Get.showNotice(message: "this is a notice");
183199
// _testtry2(_counter, "positional7");
184200
BaseControllerImpl baseControllerImpl = BaseControllerImpl();
185201
baseControllerImpl.baseTest();
202+
getIntTest = 11;
203+
debugPrint(getIntTest.toString());
204+
getIntTest = 12;
205+
debugPrint(getIntTest.toString());
186206
setState(() {
187207
// This call to setState tells the Flutter framework that something has
188208
// changed in this State, which causes it to rerun the build method below
336 Bytes
Binary file not shown.
336 Bytes
Binary file not shown.
152 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)