Skip to content

Commit df59869

Browse files
Merge pull request #104 from todbachman-wf/uip-2614_implement_disposable_mgr_v6
UIP-2614 Update UiComponent to implement DisposableManagerV6
2 parents a341ce8 + 74cc883 commit df59869

File tree

3 files changed

+56
-4
lines changed

3 files changed

+56
-4
lines changed

lib/src/component_declaration/component_base.dart

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ typedef TProps BuilderOnlyUiFactory<TProps extends UiProps>();
135135
/// }
136136
///
137137
/// > Related: [UiStatefulComponent]
138-
abstract class UiComponent<TProps extends UiProps> extends react.Component implements DisposableManagerV3 {
138+
abstract class UiComponent<TProps extends UiProps> extends react.Component implements DisposableManagerV6 {
139139
Disposable _disposableProxy;
140140

141141
/// The props for the non-forwarding props defined in this component.
@@ -291,6 +291,9 @@ abstract class UiComponent<TProps extends UiProps> extends react.Component imple
291291
@override
292292
Future<T> getManagedDelayedFuture<T>(Duration duration, T callback()) =>
293293
_getDisposableProxy().getManagedDelayedFuture<T>(duration, callback);
294+
295+
@override
296+
ManagedDisposer getManagedDisposer(Disposer disposer) => _getDisposableProxy().getManagedDisposer(disposer);
294297

295298
@override
296299
Timer getManagedPeriodicTimer(Duration duration, void callback(Timer timer)) =>
@@ -300,6 +303,17 @@ abstract class UiComponent<TProps extends UiProps> extends react.Component imple
300303
Timer getManagedTimer(Duration duration, void callback()) =>
301304
_getDisposableProxy().getManagedTimer(duration, callback);
302305

306+
@override
307+
StreamSubscription<T> listenToStream<T>(
308+
Stream<T> stream, void onData(T event),
309+
{Function onError, void onDone(), bool cancelOnError}) =>
310+
_getDisposableProxy().listenToStream(
311+
stream, onData, onError: onError, onDone: onDone, cancelOnError: cancelOnError);
312+
313+
@override
314+
Disposable manageAndReturnDisposable(Disposable disposable) =>
315+
_getDisposableProxy().manageAndReturnDisposable(disposable);
316+
303317
@override
304318
Completer<T> manageCompleter<T>(Completer<T> completer) =>
305319
_getDisposableProxy().manageCompleter<T>(completer);
@@ -308,20 +322,24 @@ abstract class UiComponent<TProps extends UiProps> extends react.Component imple
308322
void manageDisposable(Disposable disposable) =>
309323
_getDisposableProxy().manageDisposable(disposable);
310324

325+
/// DEPRECATED. Use [getManagedDisposer] instead.
326+
@Deprecated('2.0.0')
311327
@override
312328
void manageDisposer(Disposer disposer) =>
313329
_getDisposableProxy().manageDisposer(disposer);
314-
330+
315331
@override
316332
void manageStreamController(StreamController controller) =>
317333
_getDisposableProxy().manageStreamController(controller);
318334

335+
/// DEPRECATED. Use [listenToStream] instead.
336+
@Deprecated('2.0.0')
319337
@override
320338
void manageStreamSubscription(StreamSubscription subscription) =>
321339
_getDisposableProxy().manageStreamSubscription(subscription);
322340

323341
/// Instantiates a new [Disposable] instance on the first call to the
324-
/// [DisposableManagerV3] method.
342+
/// [DisposableManagerV6] method.
325343
Disposable _getDisposableProxy() {
326344
if (_disposableProxy == null) {
327345
_disposableProxy = new Disposable();

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ dependencies:
1616
react: "^3.4.3"
1717
source_span: "^1.4.0"
1818
transformer_utils: "^0.1.1"
19-
w_common: "^1.6.0"
19+
w_common: "^1.8.0"
2020
w_flux: "^2.7.1"
2121
platform_detect: "^1.3.2"
2222
quiver: ">=0.21.4 <0.26.0"

test/over_react/component_declaration/component_base_test.dart

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -710,6 +710,17 @@ main() {
710710
await unmountAndDisposal();
711711
});
712712

713+
test('should call managed disposer returned by getManagedDisposer', () async {
714+
var disposerCalled = false;
715+
var disposer = component.getManagedDisposer(() async => disposerCalled = true);
716+
expect(disposer, new isInstanceOf<ManagedDisposer>());
717+
718+
expect(disposerCalled, isFalse);
719+
await unmountAndDisposal();
720+
expect(disposerCalled, isTrue);
721+
expect(disposer.isDisposed, isTrue);
722+
});
723+
713724
test('should cancel periodic timer', () async {
714725
var timer = component.getManagedPeriodicTimer(shortDuration,
715726
expectAsync1((_) {}, count: 0, reason: 'Did not expect callback to be invoked.'));
@@ -728,6 +739,29 @@ main() {
728739
expect(timer.isActive, isFalse);
729740
});
730741

742+
test('should cancel stream subscription returned by listenToStream', () async{
743+
var streamController = new StreamController<Null>.broadcast();
744+
// ignore: cancel_subscriptions
745+
var streamSubscription = component.listenToStream(streamController.stream, expectAsync1((_) {},
746+
count: 0,
747+
reason: 'Did not expect event after cancelling subscription'));
748+
expect(streamSubscription, new isInstanceOf<StreamSubscription>());
749+
750+
await unmountAndDisposal();
751+
752+
streamController
753+
..add(null)
754+
..close();
755+
});
756+
757+
test('should dispose managed Disposable returned by manageAndReturnDisposable', () async {
758+
var disposable = new Disposable();
759+
expect(component.manageAndReturnDisposable(disposable), same(disposable));
760+
expect(disposable.isDisposed, isFalse);
761+
await unmountAndDisposal();
762+
expect(disposable.isDisposed, isTrue);
763+
});
764+
731765
test('should complete uncompleted managed Completer with ObjectDisposedException', () async {
732766
var completer = new Completer<Null>();
733767
component.manageCompleter(completer);

0 commit comments

Comments
 (0)