rx_widgets는 반응형 프로그래밍 패턴을 지원하기 위해 스트림 기반 위젯을 제공하는 Flutter 패키지입니다. 개발자들이 데이터 스트림에 선언적으로 반응함으로써 동적이고 반응성이 뛰어난 UI를 구축할 수 있게 해줍니다. 이 패키지는 Dart의 Stream API와 원활하게 통합되어 봐일러플레이트 코드 없이 실시간 업데이트를 가능하게 합니다. 라이브 피드나 실시간 대시보드와 같이 지속적인 상태 변화가 필요한 애플리케이션에 적합하며, 위젯 트리 내에서 비동기 데이터 흐름을 관리하는 것을 간소화합니다.
사용 사례
실시간 데이터 표시
라이브 폼 검증
동적 UI 업데이트
스트림을 사용한 상태 관리
반응형 폼 처리
주요 기능
스트림 인식 위젯
선언적 반응형 구문
최소한의 보일러플레이트
스트림과의 원활한 통합
내장된 오류 및 로딩 상태
적합한 대상
반응형 프로그래밍을 사용하는 개발자
자주 UI가 업데이트되는 앱
기능 반응형 패턴을 선호하는 팀
Dart Streams를 활용하는 프로젝트
고려 사항
스트림 및 비동기 프로그래밍에 대한 이해 필요
간단한 UI에 복잡성을 추가할 수 있음
반응형 패턴을 이미 사용하는 프로젝트에 가장 적합
원본 README
연결된 소스 저장소의 README 원문 스냅샷입니다. 최신 내용은 저장소에서 확인하세요.
RxWidgets
About
A package with stream based Flutter Widgets that facilitate an reactive programming style.
Was built to be used especially in combination with RxDart
and RxCommands.
If you have any ideas for additional stream based Widget, open an issue
PRs are always welcome ;-)
Getting Started
Add to your pubspec.yaml dependencies to rx_widgets
Creates a RaisedButton that has an rxCommand instead of onPressed. It gets disabled if the command has canExecute:false or when isExecuting:true
An extended RaisedButton where the onPressed is replaced with rxCommand and it gets disabled if the rxCommand has the canExecute set to false or when it is executing.
A Text that takes in a Stream<String> and displays it. An example of usage can be when showing status message , or results of some requests.
errorBuilder is a method that is called when the stream receives an error. By default this method returns a Text containing the error.
placeHolderBuilder is a method that is called when the stream has no data. By default this method returns a CircularProgressIndicator.
initialData parameter that can be used to provide a starting value, just like in StreamBuilder.
RxText({
// New parameters.@requiredStream<String> stream,
String initialData,
this.errorBuilder,
this.placeHolderBuilder,
// Normal Text parameters.Key key,
this.style,
this.textAlign,
this.textDirection,
this.locale,
this.softWrap,
this.overflow,
this.textScaleFactor,
this.maxLines,
this.semanticsLabel,
});
RxSpinner
Spinner/Busy indicator that reacts on the output of a Stream<bool> it starts running as soon as a true value is received until the next falseis emitted. If the Spinner should replace another Widget while Spinning this widget can be passed as normal parameter. RxSpinner also adapts to the current or specified platform look. Needless to say that RxSpinner is ideal in combination with RxCommand'sisExecuting Observable
busyEventsStream<bool> that controls the activity of the Spinner. On receiving true it replaces the normal widget and starts running undtil it receives a falsevalue.
platform defines platform style of the Spinner. If this is null or not provided the style of the current platform will be used.
radius is the radius of the Spinner.
normal is a Widget that should be displayed while the Spinner is not active. If this is null a Container will be created instead.
All other parameters please see https://docs.flutter.io/flutter/material/CircularProgressIndicator-class.html.
RxSpinner are ignored if the platform style is iOS.
RxSpinner is great for simple Applications where you just want to show or hide a Spinner. But often especially when loading data you want to deal with errors and show an alternative Widget if no data arrived. Since RxCommand offers not only three separate Observables for state changes and results but is also an Observable<CommandResult<T> itself that emits CommandResult that bundle all state and data in one Object RxLoaderleverage this to support the Flutter update mechanic better.
busyEventsStream<bool> that controls the activity of the Spinner. On receiving true it replaces the normal widget and starts running undtil it receives a falsevalue.
platform defines platorm style of the Spinner. If this is null or not provided the style of the current platform will be used.
radius radius of the Spinner.
dataBuilder Builder that will be called as soon as an event with data is received. It will get passed the data feeld of the CommandResult.
placeHolderBuilder Builder that will be called as soon as an event with data==null is received.
errorBuilder Builder that will be called as soon as an event with an error is received. It will get passed the error feeld of the CommandResult.
All other parameters please see https://docs.flutter.io/flutter/material/CircularProgressIndicator-class.html.
RxLoader are ignored if the platform style is iOS.
WidgetSelectoris a convenience class that will return one of two Widgets based on the output of a Stream<bool> This is pretty handy if you want to react to state change like enable/disable in you ViewModel and update the View accordingly.
If you don't need builders for the alternative child widgets this class offers a more concise expression than WidgetBuilderSelector
buildEventsStream<bool>that signals that the this Widget should be updated.
onTrue Widget that should be returned if an item with value true is received.
onFalse Widget that should be returned if an item with value true is received.
errorBuilder Builder that will be called as soon as an event with an error is received. It will get passed the error feeld of the CommandResult.
placeHolderBuilder Builder that will be called as soon as an event with data==null is
received.
initialData can be used to provide an initial value just as it does in StreamBuilder.
Like WidgetSelector but instead return Widgets it executes one of two provided builder functions.
In comparison to WidgetSelector this is best used if the alternative child widgets are large so that you don't want to have them always created without using them.
RxCommandBuilder
If you are working with RxCommands this is a special Builder that lets you define different builder for the different states an RxCommand can issue.
If you don't specify one of the builders it will create a Container for that state.
commandResultsStream<bool> .Stream<CommandResult<T>> or a RxCommand<T> that issues CommandResults
busyBuilder Builder that will be called as soon as an event with isExecuting==true.
dataBuilder Builder that will be called as soon as an event with data is received. It will get passed the data feeld of the CommandResult. It will get passed the data feeld of the CommandResult.
placeHolderBuilder Builder that will be called as soon as an event with data==null is received. If this is null a Container will be created instead.
errorBuilder Builder that will be called as soon as an event with an error is received. It will get passed the error feeld of the CommandResult.
initialData can be used to provide an initial value just as it does in StreamBuilder.
builder lis a method that will be cal when the stream receive data.
placeHolderBuilder is a method that will be cal when the stream is initialized without data or when receive a null data. By default this method returns a CircularProgressIndicator.
errorBuilder is a method that will be call when the stream receive a error. By default this method returns a Text containing the error.
Similar to ReactiveBuilder but doesn't require BuiltContext in its parameters
streamStream<T> that controls the widget.
initialData can be used to provide an initial value just as it does in StreamBuilder.
widget lis a method that will be cal when the stream receive data.
placeHolderWidget is a method that will be cal when the stream is initialized without data or when receive a null data. By default this method returns a CircularProgressIndicator.
errorWidget is a method that will be call when the stream receive a error. By default this method returns a Text containing the error.
Adds ability to listen om RxCommand events inside Stateless and Stateful Widgets.
Add RxCommandHandlerMixin to your Stateless Widget or RxCommandStatefulHandlerMixin to your Stateful Widget and override
RxCommandListener get commandListener.
It will add your widget to get an ability to listen for events from command and make actions
specified in RxCommandListener when its streams fire events.
Mixin will take care of RxCommandListener init dispose. This way you can keep your widget stateless.
Or if it is already stateful - don't need to write code for that.