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