router_outlet.dart
1.81 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
import 'dart:js';
import 'package:flutter/material.dart';
import '../../../get.dart';
class RouterOutlet<TDelegate extends RouterDelegate<T>, T extends Object>
extends StatefulWidget {
final TDelegate routerDelegate;
final Widget Function(
BuildContext context,
TDelegate delegate,
T? currentRoute,
) builder;
//keys
RouterOutlet.builder({
TDelegate? delegate,
required this.builder,
}) : routerDelegate = delegate ?? Get.delegate<TDelegate, T>()!,
super();
RouterOutlet({
TDelegate? delegate,
required List<T> Function(TDelegate routerDelegate) currentNavStack,
required List<T> Function(List<T> currentNavStack) pickPages,
required Widget Function(T? page) pageBuilder,
}) : this.builder(
builder: (context, rDelegate, currentConfig) {
final currentStack = currentNavStack(rDelegate);
final picked = pickPages(currentStack);
if (picked.length == 0) return pageBuilder(null);
return pageBuilder(picked.last);
},
delegate: delegate,
);
@override
_RouterOutletState<TDelegate, T> createState() =>
_RouterOutletState<TDelegate, T>();
}
class _RouterOutletState<TDelegate extends RouterDelegate<T>, T extends Object>
extends State<RouterOutlet<TDelegate, T>> {
TDelegate get delegate => widget.routerDelegate;
@override
void initState() {
super.initState();
delegate.addListener(onRouterDelegateChanged);
}
@override
void dispose() {
delegate.removeListener(onRouterDelegateChanged);
super.dispose();
}
T? currentRoute;
void onRouterDelegateChanged() {
setState(() {
currentRoute = delegate.currentConfiguration;
});
}
@override
Widget build(BuildContext context) {
return widget.builder(context, delegate, currentRoute);
}
}