LiveValue

구독자를 거느린 살아 있는 "현재 값": 늦게 온 구독자는 즉시 최신 값을 받고, 그 뒤의 모든 갱신을 이어 받습니다.

class LiveValue<T> { LiveValue(); // empty — subscribers wait for the first add LiveValue.seeded(T value); // starts with a current value LiveValue.from(Stream<T> source); // hot, fed by source LiveValue.seededFrom(T seed, Stream<T> src); // hot, seeded T get value; // latest value; StateError when none set bool get hasValue; bool get isClosed; void add(T value); // set + deliver to subscribers FxEvents<T> get live; // replay the latest, then live updates Stream<T> get stream; // plain-Stream view of live Future<void> close(); } LiveValue<T> Stream<T>.fxLive // = LiveValue.from(stream) LiveValue<T> Stream<T>.fxLiveSeeded(T seed) // = LiveValue.seededFrom(seed, stream)

강의

평범한 Stream에는 기억이 없습니다: 늦게 구독하면 다음 이벤트가 올 때까지 아무것도 받지 못하고, 상태 — 현재 사용자, 현재 온도, 현재 줌 — 에서 이것은 새 화면마다 빈 채로 시작한다는 뜻이 됩니다. LiveValue<T>는 이벤트 소스로 구현한 상태입니다: 현재 값을 보관하고, add가 값을 갱신하며 구독자에게 알리고, 모든 늦은 구독자는 최신 값을 먼저 재생받은 다음 라이브 갱신에 올라탑니다. 공백도, 빈 시작도, "다음 틱을 기다리세요"도 없습니다.

API는 의도적으로 작습니다. 빈 채로(LiveValue()) 또는 시드와 함께(LiveValue.seeded(value)) 생성합니다. .value로 동기적으로 읽는데 — 아무것도 설정된 적이 없으면 StateError를 던지니 .hasValue를 확인하거나 시드를 주세요. 상태인 척하는 조용한 null은 없습니다. 구독은 .live를 통해 하는데 이것은 FxEvents 체인이고(map하고, debounce하고, 결합할 수 있습니다), 같은 피드의 평범한 Stream 뷰가 필요하면 .stream입니다.

close()는 피드를 끝냅니다: 구독자들의 스트림이 닫히고, 이후의 add는 던집니다 — 다만 닫힌 LiveValue도 늦은 구독자에게는 마지막 값을 재생해 준 뒤에 그 스트림을 닫습니다. Rx를 아신다면, 이것은 BehaviorSubject를 그 본질적 동작만 남기고 줄인 것입니다. fxdart 이벤트 계층이며, FxTS의 일부가 아닙니다.

데모 1 · 늦은 구독자는 최신 값에서 시작한다

데모 2 · value, hasValue, 그리고 close

메서드 표기

Stream에서 두 생성자를 멤버로 부를 수 있습니다. source.fxLiveLiveValue.from(source)이고, source.fxLiveSeeded(v)LiveValue.seededFrom(v, source)입니다. 둘 다 여전히 hot이라 구독이 즉시 열립니다.

final price = ticker.fxLive;
final count = taps.fxLiveSeeded(0);   // has a value before the first tap

직접 해 보기

연습: 라이브 상태로부터 레이블 피드 파생하기.

관련 항목: fxEvents.live는 이 체인을 그대로 말함 · combineLatest — 두 라이브 피드로부터 상태 파생하기 · Stream 다리 — 피드를 pull 세계로 옮기기