Line data Source code
1 : import 'package:flutter/widgets.dart'; 2 : import 'package:get/src/get_instance.dart'; 3 : import 'package:get/src/root/smart_management.dart'; 4 : import 'package:get/src/rx/rx_interface.dart'; 5 : 6 : class GetxController extends DisposableInterface { 7 : List<Updater> _updaters = []; 8 : 9 : /// Update GetBuilder with update(); 10 1 : void update([List<String> ids, bool condition = true]) { 11 : if (!condition) return; 12 : (ids == null) 13 3 : ? _updaters.forEach((rs) { 14 3 : rs.updater(() {}); 15 : }) 16 1 : : _updaters 17 4 : .where((element) => ids.contains(element.id)) 18 5 : .forEach((rs) => rs.updater(() {})); 19 : } 20 : 21 5 : void onInit() async {} 22 : 23 5 : void onReady() async {} 24 : 25 5 : void onClose() async {} 26 : } 27 : 28 : class GetBuilder<T extends GetxController> extends StatefulWidget { 29 : @required 30 : final Widget Function(T) builder; 31 : final bool global; 32 : final String id; 33 : final String tag; 34 : final bool autoRemove; 35 : final bool assignId; 36 : final void Function(State state) initState, dispose, didChangeDependencies; 37 : final void Function(GetBuilder oldWidget, State state) didUpdateWidget; 38 : final T init; 39 5 : const GetBuilder({ 40 : Key key, 41 : this.init, 42 : this.global = true, 43 : this.builder, 44 : this.autoRemove = true, 45 : this.assignId = false, 46 : this.initState, 47 : this.tag, 48 : this.dispose, 49 : this.id, 50 : this.didChangeDependencies, 51 : this.didUpdateWidget, 52 1 : }) : assert(builder != null), 53 5 : super(key: key); 54 5 : @override 55 5 : _GetBuilderState<T> createState() => _GetBuilderState<T>(); 56 : } 57 : 58 : class _GetBuilderState<T extends GetxController> extends State<GetBuilder<T>> { 59 : T controller; 60 : Updater real; 61 : bool isCreator = false; 62 5 : @override 63 : void initState() { 64 5 : super.initState(); 65 : 66 10 : if (widget.global) { 67 20 : bool isPrepared = GetInstance().isPrepared<T>(tag: widget.tag); 68 20 : bool isRegistred = GetInstance().isRegistred<T>(tag: widget.tag); 69 : 70 : if (isPrepared) { 71 2 : if (GetConfig.smartManagement != SmartManagement.keepFactory) { 72 1 : isCreator = true; 73 : } 74 5 : controller = GetInstance().find<T>(tag: widget.tag); 75 5 : real = Updater(updater: setState, id: widget.id); 76 4 : controller._updaters.add(real); 77 : } else if (isRegistred) { 78 5 : controller = GetInstance().find<T>(tag: widget.tag); 79 1 : isCreator = false; 80 5 : real = Updater(updater: setState, id: widget.id); 81 4 : controller._updaters.add(real); 82 : } else { 83 15 : controller = widget.init; 84 5 : isCreator = true; 85 25 : real = Updater(updater: setState, id: widget.id); 86 20 : controller._updaters.add(real); 87 25 : GetInstance().put<T>(controller, tag: widget.tag); 88 : } 89 : } else { 90 3 : controller = widget.init; 91 1 : isCreator = true; 92 5 : real = Updater(updater: setState, id: widget.id); 93 4 : controller._updaters.add(real); 94 2 : controller?.onStart(); 95 : } 96 19 : if (widget.initState != null) widget.initState(this); 97 15 : if (isCreator && GetConfig.smartManagement == SmartManagement.onlyBuilder) { 98 0 : controller?.onStart(); 99 : } 100 : } 101 : 102 5 : @override 103 : void dispose() { 104 5 : super.dispose(); 105 19 : if (widget.dispose != null) widget.dispose(this); 106 7 : if (isCreator || widget.assignId) { 107 30 : if (widget.autoRemove && GetInstance().isRegistred<T>(tag: widget.tag)) { 108 20 : controller._updaters.remove(real); 109 20 : GetInstance().delete<T>(tag: widget.tag); 110 : } 111 : } else { 112 4 : controller._updaters.remove(real); 113 : } 114 : } 115 : 116 5 : @override 117 : void didChangeDependencies() { 118 5 : super.didChangeDependencies(); 119 10 : if (widget.didChangeDependencies != null) 120 3 : widget.didChangeDependencies(this); 121 : } 122 : 123 2 : @override 124 : void didUpdateWidget(GetBuilder oldWidget) { 125 2 : super.didUpdateWidget(oldWidget); 126 4 : if (widget.didUpdateWidget != null) widget.didUpdateWidget(oldWidget, this); 127 : } 128 : 129 5 : @override 130 : Widget build(BuildContext context) { 131 20 : return widget.builder(controller); 132 : } 133 : } 134 : 135 : class Updater { 136 : final StateSetter updater; 137 : final String id; 138 5 : const Updater({this.updater, this.id}); 139 : }