Jonatas

added selector to GetBuilder

@@ -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