Jonatas

added experimental states class

1 import 'dart:async'; 1 import 'dart:async';
2 import 'dart:collection'; 2 import 'dart:collection';
  3 +import 'package:meta/meta.dart';
  4 +
3 import '../rx_core/rx_interface.dart'; 5 import '../rx_core/rx_interface.dart';
4 part 'rx_num.dart'; 6 part 'rx_num.dart';
5 7
@@ -230,6 +232,72 @@ class Rx<T> extends _RxImpl<T> { @@ -230,6 +232,72 @@ class Rx<T> extends _RxImpl<T> {
230 dynamic toJson() => (value as dynamic)?.toJson(); 232 dynamic toJson() => (value as dynamic)?.toJson();
231 } 233 }
232 234
  235 +/// It's Experimental class, the Api can be change
  236 +abstract class RxState<T> extends RxInterface<T> {
  237 + RxState(T initial) {
  238 + _value = initial;
  239 + }
  240 +
  241 + T _value;
  242 +
  243 + StreamController<T> subject = StreamController<T>.broadcast();
  244 + final _subscriptions = HashMap<Stream<T>, StreamSubscription>();
  245 +
  246 + bool get canUpdate => _subscriptions.isNotEmpty;
  247 +
  248 + @protected
  249 + T call([T v]) {
  250 + if (v != null) {
  251 + value = v;
  252 + }
  253 + return value;
  254 + }
  255 +
  256 + bool firstRebuild = true;
  257 +
  258 + void addListener(Stream<T> rxGetx) {
  259 + if (_subscriptions.containsKey(rxGetx)) {
  260 + return;
  261 + }
  262 + _subscriptions[rxGetx] = rxGetx.listen((data) {
  263 + subject.add(data);
  264 + });
  265 + }
  266 +
  267 + @protected
  268 + set value(T val) {
  269 + if (_value == val && !firstRebuild) return;
  270 + firstRebuild = false;
  271 + _value = val;
  272 + subject.add(_value);
  273 + }
  274 +
  275 + /// Returns the current [value]
  276 + T get value {
  277 + if (getObs != null) {
  278 + getObs.addListener(subject.stream);
  279 + }
  280 + return _value;
  281 + }
  282 +
  283 + Stream<T> get stream => subject.stream;
  284 +
  285 + StreamSubscription<T> listen(void Function(T) onData,
  286 + {Function onError, void Function() onDone, bool cancelOnError}) =>
  287 + stream.listen(onData, onError: onError, onDone: onDone);
  288 +
  289 + void bindStream(Stream<T> stream) {
  290 + _subscriptions[stream] = stream.listen((va) => value = va);
  291 + }
  292 +
  293 + @protected
  294 + void change(T newState) {
  295 + if (newState != _value) {
  296 + value = newState;
  297 + }
  298 + }
  299 +}
  300 +
233 extension StringExtension on String { 301 extension StringExtension on String {
234 /// Returns a `RxString` with [this] `String` as initial value. 302 /// Returns a `RxString` with [this] `String` as initial value.
235 RxString get obs => RxString(this); 303 RxString get obs => RxString(this);
1 import 'dart:collection'; 1 import 'dart:collection';
2 -  
3 import 'package:flutter/material.dart'; 2 import 'package:flutter/material.dart';
4 import 'package:get_core/get_core.dart'; 3 import 'package:get_core/get_core.dart';
5 import 'package:get_instance/get_instance.dart'; 4 import 'package:get_instance/get_instance.dart';
@@ -271,3 +270,36 @@ class Value<T> extends GetxController { @@ -271,3 +270,36 @@ class Value<T> extends GetxController {
271 update(); 270 update();
272 } 271 }
273 } 272 }
  273 +
  274 +/// It's Experimental class, the Api can be change
  275 +abstract class GetState<T> extends GetxController {
  276 + GetState(T initialValue) {
  277 + _state = initialValue;
  278 + }
  279 +
  280 + // StreamController<T> _subject;
  281 +
  282 + // @override
  283 + // void onClose() {
  284 + // _subject?.close();
  285 + // }
  286 +
  287 + // Stream<T> get stream {
  288 + // if (_subject == null) {
  289 + // _subject = StreamController<T>.broadcast();
  290 + // }
  291 + // return _subject.stream;
  292 + // }
  293 +
  294 + T _state;
  295 +
  296 + T get state => _state;
  297 +
  298 + @protected
  299 + void change(T newState) {
  300 + if (newState != _state) {
  301 + _state = newState;
  302 + update();
  303 + }
  304 + }
  305 +}