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