Showing
1 changed file
with
30 additions
and
9 deletions
@@ -50,6 +50,7 @@ class GetBuilder<T extends GetxController> extends StatefulWidget { | @@ -50,6 +50,7 @@ class GetBuilder<T extends GetxController> extends StatefulWidget { | ||
50 | final String tag; | 50 | final String tag; |
51 | final bool autoRemove; | 51 | final bool autoRemove; |
52 | final bool assignId; | 52 | final bool assignId; |
53 | + final Object Function(T value) selector; | ||
53 | final void Function(State state) initState, dispose, didChangeDependencies; | 54 | final void Function(State state) initState, dispose, didChangeDependencies; |
54 | final void Function(GetBuilder oldWidget, State state) didUpdateWidget; | 55 | final void Function(GetBuilder oldWidget, State state) didUpdateWidget; |
55 | final T init; | 56 | final T init; |
@@ -62,6 +63,7 @@ class GetBuilder<T extends GetxController> extends StatefulWidget { | @@ -62,6 +63,7 @@ class GetBuilder<T extends GetxController> extends StatefulWidget { | ||
62 | this.autoRemove = true, | 63 | this.autoRemove = true, |
63 | this.assignId = false, | 64 | this.assignId = false, |
64 | this.initState, | 65 | this.initState, |
66 | + this.selector, | ||
65 | this.tag, | 67 | this.tag, |
66 | this.dispose, | 68 | this.dispose, |
67 | this.id, | 69 | this.id, |
@@ -96,14 +98,13 @@ class GetBuilder<T extends GetxController> extends StatefulWidget { | @@ -96,14 +98,13 @@ class GetBuilder<T extends GetxController> extends StatefulWidget { | ||
96 | class _GetBuilderState<T extends GetxController> extends State<GetBuilder<T>> | 98 | class _GetBuilderState<T extends GetxController> extends State<GetBuilder<T>> |
97 | with GetStateUpdaterMixin { | 99 | with GetStateUpdaterMixin { |
98 | T controller; | 100 | T controller; |
99 | - | ||
100 | bool isCreator = false; | 101 | bool isCreator = false; |
101 | VoidCallback remove; | 102 | VoidCallback remove; |
103 | + Object _selector; | ||
102 | 104 | ||
103 | @override | 105 | @override |
104 | void initState() { | 106 | void initState() { |
105 | super.initState(); | 107 | super.initState(); |
106 | - | ||
107 | widget.initState?.call(this); | 108 | widget.initState?.call(this); |
108 | 109 | ||
109 | var isRegistered = GetInstance().isRegistered<T>(tag: widget.tag); | 110 | var isRegistered = GetInstance().isRegistered<T>(tag: widget.tag); |
@@ -127,6 +128,10 @@ class _GetBuilderState<T extends GetxController> extends State<GetBuilder<T>> | @@ -127,6 +128,10 @@ class _GetBuilderState<T extends GetxController> extends State<GetBuilder<T>> | ||
127 | controller?.onStart(); | 128 | controller?.onStart(); |
128 | } | 129 | } |
129 | 130 | ||
131 | + if (widget.selector != null) { | ||
132 | + _selector = widget.selector(controller); | ||
133 | + } | ||
134 | + | ||
130 | _subscribeToController(); | 135 | _subscribeToController(); |
131 | } | 136 | } |
132 | 137 | ||
@@ -136,14 +141,27 @@ class _GetBuilderState<T extends GetxController> extends State<GetBuilder<T>> | @@ -136,14 +141,27 @@ class _GetBuilderState<T extends GetxController> extends State<GetBuilder<T>> | ||
136 | void _subscribeToController() { | 141 | void _subscribeToController() { |
137 | remove?.call(); | 142 | remove?.call(); |
138 | remove = (widget.id == null) | 143 | remove = (widget.id == null) |
139 | - ? controller?.addListener(getUpdate) | ||
140 | - : controller?.addListenerId(widget.id, getUpdate); | 144 | + ? controller?.addListener( |
145 | + _selector != null ? _selectorUpdate : getUpdate, | ||
146 | + ) | ||
147 | + : controller?.addListenerId( | ||
148 | + widget.id, | ||
149 | + _selector != null ? _selectorUpdate : getUpdate, | ||
150 | + ); | ||
151 | + } | ||
152 | + | ||
153 | + void _selectorUpdate() { | ||
154 | + var newSelector = widget.selector(controller); | ||
155 | + if (newSelector != _selector) { | ||
156 | + _selector = newSelector; | ||
157 | + getUpdate(); | ||
158 | + } | ||
141 | } | 159 | } |
142 | 160 | ||
143 | @override | 161 | @override |
144 | void dispose() { | 162 | void dispose() { |
145 | super.dispose(); | 163 | super.dispose(); |
146 | - if (widget.dispose != null) widget.dispose(this); | 164 | + widget.dispose?.call(this); |
147 | if (isCreator || widget.assignId) { | 165 | if (isCreator || widget.assignId) { |
148 | if (widget.autoRemove && GetInstance().isRegistered<T>(tag: widget.tag)) { | 166 | if (widget.autoRemove && GetInstance().isRegistered<T>(tag: widget.tag)) { |
149 | GetInstance().delete<T>(tag: widget.tag); | 167 | GetInstance().delete<T>(tag: widget.tag); |
@@ -151,14 +169,17 @@ class _GetBuilderState<T extends GetxController> extends State<GetBuilder<T>> | @@ -151,14 +169,17 @@ class _GetBuilderState<T extends GetxController> extends State<GetBuilder<T>> | ||
151 | } | 169 | } |
152 | 170 | ||
153 | remove?.call(); | 171 | remove?.call(); |
172 | + | ||
173 | + controller = null; | ||
174 | + isCreator = null; | ||
175 | + remove = null; | ||
176 | + _selector = null; | ||
154 | } | 177 | } |
155 | 178 | ||
156 | @override | 179 | @override |
157 | void didChangeDependencies() { | 180 | void didChangeDependencies() { |
158 | super.didChangeDependencies(); | 181 | super.didChangeDependencies(); |
159 | - if (widget.didChangeDependencies != null) { | ||
160 | - widget.didChangeDependencies(this); | ||
161 | - } | 182 | + widget.didChangeDependencies?.call(this); |
162 | } | 183 | } |
163 | 184 | ||
164 | @override | 185 | @override |
@@ -168,7 +189,7 @@ class _GetBuilderState<T extends GetxController> extends State<GetBuilder<T>> | @@ -168,7 +189,7 @@ class _GetBuilderState<T extends GetxController> extends State<GetBuilder<T>> | ||
168 | if (oldWidget.id != widget.id) { | 189 | if (oldWidget.id != widget.id) { |
169 | _subscribeToController(); | 190 | _subscribeToController(); |
170 | } | 191 | } |
171 | - if (widget.didUpdateWidget != null) widget.didUpdateWidget(oldWidget, this); | 192 | + widget.didUpdateWidget?.call(oldWidget, this); |
172 | } | 193 | } |
173 | 194 | ||
174 | @override | 195 | @override |
-
Please register or login to post a comment