Line data Source code
1 : import 'package:flutter/widgets.dart'; 2 : import 'package:get/src/get_main.dart'; 3 : import 'package:get/src/root/smart_management.dart'; 4 : import 'rx_impl.dart'; 5 : import 'rx_interface.dart'; 6 : 7 : class GetX<T extends DisposableInterface> extends StatefulWidget { 8 : final Widget Function(T) builder; 9 : final bool global; 10 : // final Stream Function(T) stream; 11 : // final StreamController Function(T) streamController; 12 : final bool autoRemove; 13 : final bool assignId; 14 : final void Function(State state) initState, dispose, didChangeDependencies; 15 : final T init; 16 1 : const GetX({ 17 : this.builder, 18 : this.global = true, 19 : this.autoRemove = true, 20 : this.initState, 21 : this.assignId = false, 22 : // this.stream, 23 : this.dispose, 24 : this.didChangeDependencies, 25 : this.init, 26 : // this.streamController 27 : }); 28 2 : GetImplXState<T> createState() => GetImplXState<T>(); 29 : } 30 : 31 : class GetImplXState<T extends DisposableInterface> extends State<GetX<T>> { 32 : RxInterface _observer; 33 : T controller; 34 : bool isCreator = false; 35 : 36 1 : GetImplXState() { 37 2 : _observer = Rx(); 38 : } 39 : 40 1 : @override 41 : void initState() { 42 1 : bool isPrepared = Get.isPrepared<T>(); 43 1 : bool isRegistred = Get.isRegistred<T>(); 44 2 : if (widget.global) { 45 : if (isPrepared) { 46 3 : if (Get.smartManagement != SmartManagement.keepFactory) { 47 1 : isCreator = true; 48 : } 49 2 : controller = Get.find<T>(); 50 : } else if (isRegistred) { 51 2 : controller = Get.find<T>(); 52 1 : isCreator = false; 53 : } else { 54 3 : controller = widget.init; 55 1 : isCreator = true; 56 2 : Get.put<T>(controller); 57 : } 58 : } else { 59 3 : controller = widget.init; 60 1 : isCreator = true; 61 2 : controller?.onStart(); 62 : } 63 2 : if (widget.initState != null) widget.initState(this); 64 4 : if (isCreator && Get.smartManagement == SmartManagement.onlyBuilder) { 65 0 : controller?.onStart(); 66 : } 67 7 : _observer.subject.stream.listen((data) => setState(() {})); 68 1 : super.initState(); 69 : } 70 : 71 1 : @override 72 : void dispose() { 73 2 : if (widget.dispose != null) widget.dispose(this); 74 3 : if (isCreator || widget.assignId) { 75 3 : if (widget.autoRemove && Get.isRegistred<T>()) { 76 1 : Get.delete<T>(); 77 : } 78 : } 79 : 80 2 : _observer.close(); 81 1 : controller = null; 82 1 : isCreator = null; 83 1 : super.dispose(); 84 : } 85 : 86 1 : @override 87 : Widget build(BuildContext context) { 88 : final observer = getObs; 89 1 : getObs = this._observer; 90 4 : final result = widget.builder(controller); 91 : getObs = observer; 92 : return result; 93 : } 94 : }