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