route_middleware.dart
3.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import 'package:flutter/cupertino.dart';
import '../../../get.dart';
abstract class _RouteMiddleware {
/// The Order of the Middlewares to run.
///
/// {@tool snippet}
/// This Middewares will be called in this order.
/// ```dart
/// final middlewares = [
/// GetMiddleware(priority: 2),
/// GetMiddleware(priority: 5),
/// GetMiddleware(priority: 4),
/// GetMiddleware(priority: -8),
/// ];
/// ```
/// -8 => 2 => 4 => 5
/// {@end-tool}
int priority;
/// This function will be the first thing to call when this Page is called
/// you can use it to redirect befor anything in this page happend.
/// {@tool snippet}
/// ```dart
/// GetPage onPageCalled( ) {
/// final authService = Get.find<AuthService>();
/// return authService.isAuthed ? null : '/login';
/// }
/// ```
/// {@end-tool}
String redirect();
/// This function will be called right before the [Bindings] are initialize.
/// Here you can change [Bindings] for this page
List<Bindings> onBindingsStart(List<Bindings> bindings);
/// This function will be called right after the [Bindings] are initialize.
/// Here you can change the Page to build
GetPageBuilder onPageBuildStart(GetPageBuilder page);
// Get the built page
Widget onPageBuilt(Widget page);
void onPageDispose();
}
/// The Page Middlewares.
/// The Functions will be called in this order
/// (( [redirect] -> [onBindingsStart] -> [onPageBuildStart] ->
/// [onPageBuilt] -> [onPageDispose] ))
class GetMiddleware implements _RouteMiddleware {
@override
int priority = 0;
GetMiddleware({this.priority});
@override
List<Bindings> onBindingsStart(List<Bindings> bindings) => bindings;
@override
GetPageBuilder onPageBuildStart(GetPageBuilder page) => page;
@override
Widget onPageBuilt(Widget page) => page;
@override
void onPageDispose() {}
@override
String redirect() => '';
}
class MiddlewareRunner {
MiddlewareRunner(this._middlewares);
final List<GetMiddleware> _middlewares;
List<GetMiddleware> _getMiddlewares() {
if (_middlewares != null) {
_middlewares.sort((a, b) => a.priority.compareTo(b.priority));
return _middlewares;
}
return <GetMiddleware>[];
}
List<GetMiddleware> getMiddlewares() {
if (_middlewares != null) {
_middlewares.sort((a, b) => a.priority.compareTo(b.priority));
return _middlewares;
}
return <GetMiddleware>[];
}
String runOnPageCalled() {
var to = '';
_getMiddlewares().forEach((element) {
to = element.redirect();
});
if (!to.isNullOrBlank) {
Get.log('Redirect to $to');
}
return to;
}
List<Bindings> runOnBindingsStart(List<Bindings> bindings) {
_getMiddlewares().forEach((element) {
bindings = element.onBindingsStart(bindings);
});
return bindings;
}
GetPageBuilder runOnPageBuildStart(GetPageBuilder page) {
_getMiddlewares().forEach((element) {
page = element.onPageBuildStart(page);
});
return page;
}
Widget runOnPageBuilt(Widget page) {
_getMiddlewares().forEach((element) {
page = element.onPageBuilt(page);
});
return page;
}
void runOnPageDispose() =>
_getMiddlewares().forEach((element) => element.onPageDispose());
}