您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
84 行
2.7 KiB
84 行
2.7 KiB
using System;
|
|
|
|
namespace Unity.UIWidgets.async {
|
|
|
|
/**
|
|
* Stream.multi is not supported by flutter 1.17.5 yet, but it might be useful for developers. To address this issue, we put all the necessary codes for this feature
|
|
* in this single file.
|
|
*
|
|
* [TODO] remove this code when we eventually upgrade UIWidgets to above 2.0
|
|
*/
|
|
public class StreamMultiUtils<T>
|
|
{
|
|
public static Stream<T> multi(Action<MultiStreamController<T>> onListen, bool isBroadcast = false) {
|
|
return new _MultiStream<T>(onListen, isBroadcast);
|
|
}
|
|
}
|
|
|
|
public interface MultiStreamController<T> : IStreamController<T> {
|
|
void addSync(T value);
|
|
|
|
void addErrorSync(object error, string trackStack);
|
|
|
|
void closeSync();
|
|
}
|
|
|
|
class _MultiStream<T> : Stream<T> {
|
|
public override bool isBroadcast {
|
|
get {
|
|
return _isBroadcast;
|
|
}
|
|
}
|
|
|
|
bool _isBroadcast;
|
|
|
|
/// The callback called for each listen.
|
|
public readonly Action<MultiStreamController<T>> _onListen;
|
|
|
|
public _MultiStream(Action<MultiStreamController<T>> _onListen, bool isBroadcast) {
|
|
_isBroadcast = isBroadcast;
|
|
this._onListen = _onListen;
|
|
}
|
|
|
|
public override StreamSubscription<T> listen(Action<T> onData, Action<object, string> onError = null,
|
|
Action onDone = null, bool cancelOnError = false) {
|
|
var controller = new _MultiStreamController<T>();
|
|
controller.onListen = () => {
|
|
_onListen(controller);
|
|
};
|
|
return controller._subscribe(
|
|
onData, onError, onDone, cancelOnError);
|
|
}
|
|
}
|
|
|
|
class _MultiStreamController<T> : _AsyncStreamController<T>, MultiStreamController<T> {
|
|
public _MultiStreamController() : base(null, null, null, null)
|
|
{
|
|
}
|
|
|
|
public void addSync(T value) {
|
|
if (!_mayAddEvent) throw _badEventState();
|
|
if (hasListener) _subscription._add(value);
|
|
}
|
|
|
|
public void addErrorSync(object error, string trackStack) {
|
|
if (!_mayAddEvent) throw _badEventState();
|
|
if (hasListener) {
|
|
_subscription._addError(error, trackStack ?? "");
|
|
}
|
|
}
|
|
|
|
public void closeSync() {
|
|
if (isClosed) return;
|
|
if (!_mayAddEvent) throw _badEventState();
|
|
_state |= _StreamController<T>._STATE_CLOSED;
|
|
if (hasListener) _subscription._close();
|
|
}
|
|
|
|
public override Stream<T> stream {
|
|
get {
|
|
throw new Exception("Not available");
|
|
}
|
|
}
|
|
}
|
|
}
|