Jonatas

fix GetWidget

1 import 'package:flutter/widgets.dart'; 1 import 'package:flutter/widgets.dart';
2 import '../../../get_instance/src/get_instance.dart'; 2 import '../../../get_instance/src/get_instance.dart';
3 -import '../rx_flutter/rx_disposable.dart'; 3 +import '../../../instance_manager.dart';
  4 +import 'get_widget_cache.dart';
4 5
5 /// GetView is a great way of quickly access your Controller 6 /// GetView is a great way of quickly access your Controller
6 /// without having to call Get.find<AwesomeController>() yourself. 7 /// without having to call Get.find<AwesomeController>() yourself.
@@ -39,27 +40,6 @@ abstract class GetView<T> extends StatelessWidget { @@ -39,27 +40,6 @@ abstract class GetView<T> extends StatelessWidget {
39 Widget build(BuildContext context); 40 Widget build(BuildContext context);
40 } 41 }
41 42
42 -class _Wrapper<T> {  
43 - T data;  
44 -}  
45 -  
46 -abstract class GetWidget<T extends DisposableInterface>  
47 - extends StatelessWidget {  
48 - GetWidget({Key key}) : super(key: key);  
49 -  
50 - final _value = _Wrapper<T>();  
51 -  
52 - final String tag = null;  
53 -  
54 - T get controller {  
55 - _value.data ??= GetInstance().find<T>(tag: tag);  
56 - return _value.data;  
57 - }  
58 -  
59 - @override  
60 - Widget build(BuildContext context);  
61 -}  
62 -  
63 // abstract class GetView<A, B> extends StatelessWidget { 43 // abstract class GetView<A, B> extends StatelessWidget {
64 // const GetView({Key key}) : super(key: key); 44 // const GetView({Key key}) : super(key: key);
65 // A get controller => GetInstance().find(); 45 // A get controller => GetInstance().find();
@@ -79,46 +59,46 @@ abstract class GetWidget<T extends DisposableInterface> @@ -79,46 +59,46 @@ abstract class GetWidget<T extends DisposableInterface>
79 // Widget build(BuildContext context); 59 // Widget build(BuildContext context);
80 // } 60 // }
81 61
82 -class GetStatelessElement extends ComponentElement {  
83 - GetStatelessElement(GetStatelessWidget widget) : super(widget); 62 +/// GetWidget is a great way of quickly access your individual Controller
  63 +/// without having to call Get.find<AwesomeController>() yourself.
  64 +/// Get save you controller on cache, so, you can to use Get.create() safely
  65 +/// GetWidget is perfect to multiples instance of a same controller. Each
  66 +/// GetWidget will have your own controller, and will be call events as [onInit]
  67 +/// and [onClose] when the controller get in/get out on memory.
  68 +abstract class GetWidget<S extends GetLifeCycleBase> extends GetWidgetCache {
  69 + const GetWidget({Key key}) : super(key: key);
84 70
85 - @override  
86 - GetStatelessWidget get widget => super.widget as GetStatelessWidget; 71 + @protected
  72 + final String tag = null;
87 73
88 - @override  
89 - Widget build() => widget.build(this); 74 + S get controller => GetWidget._cache[this] as S;
90 75
91 - @override  
92 - void update(GetStatelessWidget newWidget) {  
93 - super.update(newWidget);  
94 - markNeedsBuild();  
95 - rebuild();  
96 - } 76 + static final _cache = <GetWidget, GetLifeCycleBase>{};
  77 +
  78 + @protected
  79 + Widget build(BuildContext context);
97 80
98 @override 81 @override
99 - void mount(Element parent, dynamic newSlot) {  
100 - if (widget?.controller?.initialized != null &&  
101 - !widget.controller.initialized) {  
102 - widget?.controller?.onStart();  
103 - } 82 + WidgetCache createWidgetCache() => _GetCache<S>();
  83 +}
104 84
105 - super.mount(parent, newSlot); 85 +class _GetCache<S extends GetLifeCycleBase> extends WidgetCache<GetWidget<S>> {
  86 + S _controller;
  87 + @override
  88 + void onInit() {
  89 + _controller = Get.find<S>(tag: widget.tag);
  90 + GetWidget._cache[widget] = _controller;
  91 + super.onInit();
106 } 92 }
107 93
108 @override 94 @override
109 - void unmount() {  
110 - widget?.controller?.onDelete();  
111 - super.unmount(); 95 + void onClose() {
  96 + GetWidget._cache.remove(widget);
  97 + super.onClose();
112 } 98 }
113 -}  
114 99
115 -abstract class GetStatelessWidget<T extends DisposableInterface>  
116 - extends Widget {  
117 - const GetStatelessWidget({Key key}) : super(key: key);  
118 @override 100 @override
119 - GetStatelessElement createElement() => GetStatelessElement(this);  
120 - @protected  
121 - Widget build(BuildContext context);  
122 -  
123 - T get controller; 101 + Widget build(BuildContext context) {
  102 + return widget.build(context);
  103 + }
124 } 104 }
  1 +import 'package:flutter/widgets.dart';
  2 +
  3 +abstract class GetWidgetCache extends Widget {
  4 + const GetWidgetCache({Key key}) : super(key: key);
  5 +
  6 + @override
  7 + GetWidgetCacheElement createElement() => GetWidgetCacheElement(this);
  8 +
  9 + @protected
  10 + @factory
  11 + WidgetCache createWidgetCache();
  12 +}
  13 +
  14 +class GetWidgetCacheElement extends ComponentElement {
  15 + GetWidgetCacheElement(GetWidgetCache widget)
  16 + : cache = widget.createWidgetCache(),
  17 + super(widget) {
  18 + cache._element = this;
  19 + cache._widget = widget;
  20 + }
  21 +
  22 + @override
  23 + void mount(Element parent, dynamic newSlot) {
  24 + cache.onInit();
  25 + super.mount(parent, newSlot);
  26 + }
  27 +
  28 + @override
  29 + Widget build() => cache.build(this);
  30 +
  31 + final WidgetCache<GetWidgetCache> cache;
  32 +
  33 + @override
  34 + void performRebuild() {
  35 + super.performRebuild();
  36 + }
  37 +
  38 + @override
  39 + void activate() {
  40 + super.activate();
  41 + markNeedsBuild();
  42 + }
  43 +
  44 + @override
  45 + void unmount() {
  46 + super.unmount();
  47 + cache.onClose();
  48 + cache._element = null;
  49 + }
  50 +}
  51 +
  52 +@optionalTypeArgs
  53 +abstract class WidgetCache<T extends GetWidgetCache> {
  54 + T get widget => _widget;
  55 + T _widget;
  56 +
  57 + BuildContext get context => _element;
  58 +
  59 + GetWidgetCacheElement _element;
  60 +
  61 + @protected
  62 + @mustCallSuper
  63 + void onInit() {}
  64 +
  65 + @protected
  66 + @mustCallSuper
  67 + void onClose() {}
  68 +
  69 + @protected
  70 + Widget build(BuildContext context);
  71 +}
1 -//import 'package:flutter/foundation.dart';  
2 -//import 'package:flutter/material.dart';  
3 -//import 'package:get/state_manager.dart';  
4 -//  
5 -//import '../../instance/get_instance.dart';  
6 -//  
7 -//abstract class GetState<T> extends DisposableInterface {  
8 -// GetState(this.initialValue) {  
9 -// _state = initialValue;  
10 -// }  
11 -//  
12 -// final Set<StateSetter> _updaters = <StateSetter>{};  
13 -//  
14 -// @protected  
15 -// void update(T value, [bool condition = true]) {  
16 -// if (!condition) return;  
17 -// _state = value;  
18 -// _updaters.forEach((rs) => rs(() {}));  
19 -// }  
20 -//  
21 -// T _state;  
22 -//  
23 -// final T initialValue;  
24 -//  
25 -// void addListener(StateSetter value) {  
26 -// _updaters.add(value);  
27 -// }  
28 -//  
29 -// void removeListener(StateSetter value) {  
30 -// _updaters.add(value);  
31 -// }  
32 -//  
33 -// // @protected  
34 -// T get state => _state;  
35 -//  
36 -// @protected  
37 -// void updater(void fn(T value)) {  
38 -// fn(_state);  
39 -// update(_state);  
40 -// }  
41 -//}  
42 -//  
43 -//class StateBuilder<T extends GetState> extends StatefulWidget {  
44 -// final Widget Function(dynamic) builder;  
45 -// final bool global;  
46 -// final String tag;  
47 -// final bool autoRemove;  
48 -// final bool assignId;  
49 -// final void Function(State state) initState, dispose, didChangeDependencies;  
50 -// final void Function(StateBuilder oldWidget, State state) didUpdateWidget;  
51 -// final T Function() state;  
52 -//  
53 -// const StateBuilder({  
54 -// Key key,  
55 -// this.state,  
56 -// this.global = true,  
57 -// @required this.builder,  
58 -// this.autoRemove = true,  
59 -// this.assignId = false,  
60 -// this.initState,  
61 -// this.tag,  
62 -// this.dispose,  
63 -// this.didChangeDependencies,  
64 -// this.didUpdateWidget,  
65 -// }) : assert(builder != null),  
66 -// super(key: key);  
67 -//  
68 -// @override  
69 -// _StateBuilderState<T> createState() => _StateBuilderState<T>();  
70 -//}  
71 -//  
72 -//class _StateBuilderState<T extends GetState> extends State<StateBuilder<T>> {  
73 -// T controller;  
74 -//  
75 -// bool isCreator = false;  
76 -//  
77 -// @override  
78 -// void initState() {  
79 -// super.initState();  
80 -// if (widget.initState != null) widget.initState(this);  
81 -// if (widget.global) {  
82 -// final isPrepared = GetInstance().isPrepared<T>(tag: widget.tag);  
83 -// final isRegistred = GetInstance().isRegistred<T>(tag: widget.tag);  
84 -//  
85 -// if (isPrepared) {  
86 -// isCreator = true;  
87 -// } else if (isRegistred) {  
88 -// isCreator = false;  
89 -// } else {  
90 -// isCreator = true;  
91 -// }  
92 -//  
93 -// if (isCreator) {  
94 -// controller?.onStart();  
95 -// }  
96 -//  
97 -// final instance = GetInstance().putOrFind(  
98 -// widget.state,  
99 -// tag: widget.tag,  
100 -// );  
101 -// controller = instance;  
102 -// controller._updaters.add(setState);  
103 -// } else {  
104 -// controller = widget.state();  
105 -// isCreator = true;  
106 -// controller._updaters.add(setState);  
107 -// controller?.onStart();  
108 -// }  
109 -// }  
110 -//  
111 -// @override  
112 -// void dispose() {  
113 -// super.dispose();  
114 -// if (widget.dispose != null) widget.dispose(this);  
115 -// if (isCreator || widget.assignId) {  
116 -// if (widget.autoRemove &&  
117 -// GetInstance().isRegistred<T>(  
118 -// tag: widget.tag,  
119 -// )) {  
120 -// controller._updaters.remove(setState);  
121 -// GetInstance().delete<T>(tag: widget.tag);  
122 -// }  
123 -// } else {  
124 -// controller._updaters.remove(setState);  
125 -// }  
126 -// }  
127 -//  
128 -// @override  
129 -// void didChangeDependencies() {  
130 -// super.didChangeDependencies();  
131 -// if (widget.didChangeDependencies != null) {  
132 -// widget.didChangeDependencies(this);  
133 -// }  
134 -// }  
135 -//  
136 -// @override  
137 -// void didUpdateWidget(StateBuilder oldWidget) {  
138 -// super.didUpdateWidget(oldWidget as StateBuilder<T>);  
139 -// if (widget.didUpdateWidget != null) {  
140 -// widget.didUpdateWidget(oldWidget, this);  
141 -// }  
142 -// }  
143 -//  
144 -// @override  
145 -// Widget build(BuildContext context) {  
146 -// return widget.builder(controller.state);  
147 -// }  
148 -//}