рд╕реНрд╡рд╛рдЧрдд рд╣реИ - рдпрд╣ рдореЗрд░реЗ рд╕реНрдкреНрд▓рд┐рдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд▓реЗрдЦ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рддреАрд╕рд░рд╛ рднрд╛рдЧ рд╣реИред
рдЗрд╕ рдмрд╛рд░ рд╣рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди (Rx) рдХреЗ рдЬрд╛рджреБрдИ рджрд╛рдпрд░реЗ рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рдЧреЛрддрд╛ рд▓рдЧрд╛рдПрдБрдЧреЗред рдореИрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЖрд░рдПрдХреНрд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрдВрдЧрд╛ рдФрд░ рдЙрдирдХреЗ рдЖрд╡реЗрджрди рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░реВрдВрдЧрд╛ред рдпрджрд┐ рдЖрдкрдиреЗ рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдирд╣реАрдВ рдкрдврд╝реА рд╣реИ, рддреЛ рдЕрдм рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдордп рд╣реИред
рдЖрд░рдПрдХреНрд╕рдбрд╛рд░реНрдЯ рдбрд╛рд░реНрдЯ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЖрд░рдПрдХреНрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдлреНрд░реИрдВрдХ рдкреЗрдкрд░рдореИрдиреНрд╕ рдФрд░ рдмреНрд░рд╛рдпрди рдПрдЧрди рдХреЛ рдзрдиреНрдпрд╡рд╛рджред рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ Rx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕рдВрднрд╡рддрдГ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд╛рдордХрд░рдг рдореЗрдВ рдЕрдВрддрд░ рджреЗрдЦреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдЖрдкрдХреЛ рдХреЛрдИ рдХрдард┐рдирд╛рдИ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред
рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХреЛрдб рдпрд╣рд╛рдБ рд╣реИ ред
рдЕрдм рддрдХ, рд╣рдордиреЗ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рд╕реНрдерд╛рди рд╕реЗ рджреВрд╕рд░реЗ рд╕реНрдерд╛рди рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдХреБрдЫ рдРрд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рдЬреЛ Rx рд╕реНрдЯреНрд░реАрдореНрд╕ рдореЗрдВ рдЬреБрдбрд╝рддреА рд╣реИрдВред
рд╡реЗрдзрд╢рд╛рд▓рд╛рдПрдБ рдмрдирд╛рдирд╛
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ , рдСрдмреНрдЬрд░реНрд╡рдмрд▓реНрд╕ рдорд╣рд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдзрд╛рд░рд╛рдУрдВ рдХреЗ рдЖрд░рдПрдХреНрд╕ рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдиреЗ рдХреЗ рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХреЗ рд╣реИрдВ:
рдзрд╛рд░рд╛ рд╕реЗ рдмрд╛рд╣рд░
рдХрд┐рд╕реА рднреА рд╕реНрдЯреНрд░реАрдо рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдмрджрд▓рдХрд░ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
var controller = new StreamController<String>(); var streamObservable = new Observable(controller.stream); streamObservable.listen(print);
рдЖрд╡рд░реНрддреА рдШрдЯрдирд╛рдПрдБ
var timerObservable = Observable.periodic(Duration(seconds: 1), (x) => x.toString() ); timerObservable.listen(print);
рдЗрд╕ рддрд░рд╣, рдПрдХ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрд╡рдзрд┐ рдХреЗ рд╕рд╛рде рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рддреЛ рдЖрдк рдЯрд╛рдЗрдорд░ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рдореВрд▓реНрдп рд╕реЗ
рдХрднреА-рдХрднреА рдПрдХ рдПрдкреАрдЖрдИ рдПрдХ рд╕реНрдЯреНрд░реАрдо / рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрд╕ рдПрдХ рдореВрд▓реНрдп рд╣реИред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдХрд╛ рдПрдХ рдХрд╛рд░рдЦрд╛рдирд╛ рд╣реИред
var justObservable = Observable<int>.just(42); justObservable.listen(print);
рднрд╡рд┐рд╖реНрдп рд╕реЗ
Future<String> asyncFunction() async { return Future.delayed(const Duration(seconds: 1), () => "AsyncRsult"); } test('Create Observable from Future', () async { print('start'); var fromFutureObservable = Observable.fromFuture(asyncFunction()); fromFutureObservable.listen(print);
рдлреНрдпреВрдЪрд░ рд╕реЗ Observable
рдмрдирд╛рдиреЗ рд╕реЗ рдлреНрдпреВрдЪрд░ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдФрд░ рдЙрд╕рдХреЗ рд░рд┐рдЬрд▓реНрдЯ рдХреЗ рд▓рд┐рдП рд╡реИрд▓реНрдпреВ рд▓реМрдЯрд╛рдиреЗ рдпрд╛ рд╡реИрд▓реНрдпреВ рд╡рд╛рдкрд╕ рди рдЖрдиреЗ рдкрд░ null
рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рд╣реЛрдЧрд╛ред Future рд╕реЗ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдиреЗ рдХрд╛ рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐рд╕реА рднреА Future рдХреЗ рд▓рд┐рдП toStream()
рдХреЛ рдХреЙрд▓ toStream()
ред
рдЖрдк рд╕реЛрдЪ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ рдХрд┐ рдлреНрдпреВрдЪрд░ рдХреЛ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ / рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдмрджрд▓рдиреЗ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗред рдирд┐рд╢реНрдЪрд┐рдВрдд рд░рд╣реЗрдВ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рд╣рдо рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд░рд╣рддреЗ рд╣реБрдП рдбреЗрдЯрд╛ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗред
рд╡рд┐рд╖рдп
Subjects
RxDart рдореЗрдВ рд╕реНрдЯреНрд░реАрдордХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╣реИ, рдФрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдмрд╛рдЙрд▓ рдореЗрдВ рдХрд╣реАрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЙрдирдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореВрд▓ StreamControllers рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИ:
- рдЖрдк рд╕реНрдЯреНрд░реАрдо рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдП рдмрд┐рдирд╛ рд╕реАрдзреЗ рдПрдХ рд╡рд┐рд╖рдп рдкрд░
listen()
рдЖрд╡реЗрджрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд╕рджрд╕реНрдпрддрд╛ рдХреА рдХреЛрдИ рднреА рд╕рдВрдЦреНрдпрд╛ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдФрд░ рд╕рднреА рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдХ рд╣реА рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ
- рд╡рд┐рд╖рдп рдХреА рддреАрди рдХрд┐рд╕реНрдореЗрдВ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдиреАрдЪреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
PublishSubjects
рдЕрдиреЗрдХ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЫреЛрдбрд╝рдХрд░, PublishSubjects
рдиреЗ PublishSubjects
рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд┐рдпрд╛:
var subject = new PublishSubject<String>(); subject.listen((item) => print(item)); subject.add("Item1");
рдЗрд╕ рдХреЛрдб рдХреЛ рдЪрд▓рд╛рдПрдВ рдФрд░ рдЖрдкрдХреЛ рдорд┐рд▓реЗрдЧрд╛:
Item1 ITEM2 Item2 ITEM3 Item3
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рджреВрд╕рд░рд╛ рд╢реНрд░реЛрддрд╛ рдЬреЛ рдкрд╛рд░реНрдЯреА рдХреЗ рд▓рд┐рдП рджреЗрд░ рд╕реЗ рдерд╛ (рд╣рдо рдЙрдиреНрд╣реЗрдВ рджреЗрд░ рд╕реЗ рд╕рджрд╕реНрдп рдХрд╣реЗрдВрдЧреЗ) рдкрд╣рд▓реЗ рдмрд┐рдВрджреБ рд╕реЗ рдЪреВрдХ рдЧрдПред рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк BehaviourSubject
рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
BehaviourSubject
BehaviourSubject
рд╕рд╛рде BehaviourSubject
рдкреНрд░рддреНрдпреЗрдХ рдирдП рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдкрд╣рд▓реЗ рдЕрдВрддрд┐рдо рд╕реНрд╡реАрдХреГрдд рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛:
var subject = new BehaviorSubject<String>(); subject.listen((item) => print(item)); subject.add("Item1"); subject.add("Item2"); subject.listen((item) => print(item.toUpperCase())); subject.add("Item3");
рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдкрд░
Item1 ITEM2 ITEM3 Item2 Item3
рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ Item1
рджреВрд╕рд░реЗ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд▓рд┐рдП рдЦреЛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ Item2
рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓рд╛ рдЧреНрд░рд╛рд╣рдХ Item2
рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рджреВрд╕рд░рд╛ рдЧреНрд░рд╛рд╣рдХ Item3
рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рдмрд╕реНрдХреНрд░рд╛рдЗрдмрд░реНрд╕ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рднреА рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд╕рд╣реА рдХреНрд░рдо рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред BehaviourSubject
рдХреЗрд╡рд▓ рджреЗрд░ рд╕реЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдЕрдВрддрд┐рдо рдЖрдЗрдЯрдо рдХреЛ рдХреИрд╢ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рддрддреНрд╡реЛрдВ рдХреЛ рдХреИрд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк ReplaySubject рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред
рдордХреНрдЦреА рдкрд░ рдбреЗрдЯрд╛ рд╣реЗрд░рдлреЗрд░

рдЖрд░рдПрдХреНрд╕ рдХреА рдЕрд╕рд▓реА рддрд╛рдХрдд рдЗрд╕ рддрдереНрдп рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рд╕реНрдЯреНрд░реАрдо рдкрд░ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдХреЗ рджреМрд░рд╛рди рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрд░рдПрдХреНрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рдгрд╛рдореА рдбреЗрдЯрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░) рдХреЗ рд╕рд╛рде рдПрдХ рдирдИ рдзрд╛рд░рд╛ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдПрдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдПрдХ рд╕рд╛рде рдмрд╛рдВрдз рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдЖрд░рдПрдХреНрд╕ рдХреЛ рдПрдХ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рдмрдирд╛рддрд╛ рд╣реИред
рдирдХреНрд╢рд╛
рдпрджрд┐ рдХреЛрдИ рд╕реНрдЯреНрд░реАрдо рдСрдкрд░реЗрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдпрд╛рдж рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ map()
ред map()
рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛ рдЖрдЗрдЯрдо рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рдкрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдпрд╣ рдкрд░рд┐рдгрд╛рдореА рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдбрд╛рд▓рддрд╛ рд╣реИред рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг:

var subject = new PublishSubject<String>(); subject.map((item) => item.toUpperCase()).listen(print); subject.add("Item1"); subject.add("Item2"); subject.add("Item3");
рдкрд░рд┐рдгрд╛рдо:
ITEM1 ITEM2 ITEM3
рд▓реЗрдХрд┐рди map
рдЙрд╕реА рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рд╡рд╣ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рдмрдЬрд╛рдп рдкреВрд░реНрдгрд╛рдВрдХ рд▓реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рд╣рдо рджреЛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ:
var subject = new PublishSubject<int>(); subject.map((intValue) => intValue.toString()) .map((item) => item.toUpperCase()) .listen(print); subject.add(1); subject.add(2); subject.add(3);
рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ:

class DataClass{} class WrapperClass { final DataClass wrapped; WrapperClass(this.wrapped); } var subject = new PublishSubject<WrapperClass>(); subject.map<WrapperClass>((a) => new WrapperClass(a));
.map
рдХреЗ рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЙрдкрдпреЛрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрдм рдЖрдк рдХрд┐рд╕реА REST API рдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдПрдХ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреА рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдП:
class User { final String name; final String adress; final String phoneNumber; final int age;
рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рди рдХреЗрд╡рд▓ рд╕реНрдЯреНрд░реАрдо, рдмрд▓реНрдХрд┐ рдХреЛрдИ рднреА Iterable рдПрдХ map
рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдк рд╕реВрдЪрд┐рдпреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЬрд╣рд╛рдБ
рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рдиреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдиреЗ рд╢реНрд░реЛрддрд╛ рдореЗрдВ if
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп .where()
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдЕрдзрд┐рдХ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рдФрд░ рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИ:
var subject = new PublishSubject<int>(); subject.where((val) => val.isOdd) .listen( (val) => print('This only prints odd numbers: $val')); subject.where((val) => val.isEven) .listen( (val) => print('This only prints even numbers: $val')); subject.add(1); subject.add(2); subject.add(3);
debounce
рдпрд╣ Rx рдХреЗ рдЫреЛрдЯреЗ рдореЛрддреА рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ! рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЦреЛрдЬ рдХреНрд╖реЗрддреНрд░ рд╣реИ рдЬреЛ REST API рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдЗрд╕рдХрд╛ рдкрд╛рда рдмрджрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд░ рдХреАрд╕реНрдЯреНрд░реЛрдХреЗ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХрд░рдирд╛ рдорд╣рдВрдЧрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рдХреЗрд╡рд▓ рддрднреА рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдкрд▓ рдХреЗ рд▓рд┐рдП рд░реБрдХ рдЬрд╛рдПред рдЗрд╕рдХреЗ рд▓рд┐рдП, debounce()
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рднреА рдЖрд╡рдХ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдирд┐рдЧрд▓ рд▓реЗрддрд╛ рд╣реИ рдЕрдЧрд░ рд╡реЗ рдПрдХ рдард╣рд░рд╛рд╡ рдХреЗ рдмрд╛рдж рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред
var subject = new PublishSubject<String>(); subject.debounce(new Duration(milliseconds: 500)).listen((s) => print(s)); subject.add('A'); subject.add('AB'); await Future.delayed(Duration(milliseconds: 200)); subject.add("ABC");
рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк TextField.onChanged
рд╣реИрдВрдбрд▓рд░ рдХреЛ Observable
, рддреЛ рдЖрдкрдХреЛ рдПрдХ рд╕реБрдВрджрд░ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓реЗрдЧрд╛ред
рд╡рд┐рд╕реНрддреГрдд рдХрд░реЗрдВ
рдпрджрд┐ рдЖрдкрдХрд╛ рд╕реНрд░реЛрдд рд╕реНрдЯреНрд░реАрдо рдСрдмреНрдЬреЗрдХреНрдЯреЛрдВ рдХреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрд╡рдпрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк .expand
рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдХреЗрд╡рд▓ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:

рдЖрдк рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЖрд╡реЗрджрди рдиреАрдЪреЗ рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗред
рдорд░реНрдЬ
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдзрд╛рдЧреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЙрдирдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХ рд╕рд╛рде рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк .mergeWith
рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЕрдиреНрдп Rx рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдореЗрдВ рдХреЗрд╡рд▓ merge
), рдЬреЛ рдереНрд░реЗрдбреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдорд░реНрдЬ рдХрд┐рдП рдЧрдП рдереНрд░реЗрдб рджреЗрддрд╛ рд╣реИред

.mergeWith
рдпрд╣ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдзрд╛рд░рд╛рдУрдВ рдореЗрдВ рдХреЛрдИ рднреА рдЖрджреЗрд╢ рдорд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдбреЗрдЯрд╛ рдЗрдирдкреБрдЯ рдХреНрд░рдо рдореЗрдВ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рд╣реЛрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рджреЛ рдШрдЯрдХ рд╣реИрдВ рдЬреЛ рдПрдХ рд╕реНрдЯреНрд░реАрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рдПрдХ рд╕рдВрд╡рд╛рдж рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЫрджреНрдо рдХреЛрдб):
@override initState() { super.initState(); component1.errors.mergeWith([component2.errors]) .listen( (error) async => await showDialog(error.message)); }
рдпрд╛ рдпрджрд┐ рдЖрдк рдХрдИ рд╕рд╛рдорд╛рдЬрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдпреБрдХреНрдд рдкреНрд░рджрд░реНрд╢рди рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ (рд╕реНрдпреВрдбреЛрдХреЛрдб):
final observableTwitter = getTwitterStream().map((data) => new MyAppPost.fromTwitter(data)); final observableFacebook = getFacebookStream().map((data) => new MyAppPost.fromFaceBook(data)); final postStream = observableTwitter.mergeWith([observableFacebook]);
ZipWith
zipWith
рдПрдХ рд╕реНрдЯреНрд░реАрдо рдХреЛ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдорд░реНрдЬ рднреА рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, .mergeWith
рд╡рд┐рдкрд░реАрдд, рдпрд╣ рдбреЗрдЯрд╛ рдирд╣реАрдВ рднреЗрдЬрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдкрдиреЗ рд╕реНрд░реЛрдд рдзрд╛рд░рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ рдПрдХ рддрддреНрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рд╡рд╣ рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рджреЛрдиреЛрдВ рд╕реНрд░реЛрдд рдзрд╛рд░рд╛рдУрдВ рдХреЗ рддрддреНрд╡ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП zipper
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рддреА рд╣реИ:

zipWith
рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдбрд░рд╛рд╡рдирд╛ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рдЗрд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ:
рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг:
new Observable.just(1)
рдПрдХ рдЕрдзрд┐рдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЛ Future
рд╡рд╛рдкрд╕ рдЖрдиреЗ рд╡рд╛рд▓реЗ рджреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рджреЛрдиреЛрдВ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реА рдЖрдк рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕ рдереЛрдбрд╝реЗ рд╕реЗ рд╡рдВрдЪрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рджреЛ REST API рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВ: рдПрдХ User
рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ JSON рддрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ Product
рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ рд╣рдо Invoice
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рджреЛрдиреЛрдВ рдХреЙрд▓реЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
class Invoice { final User user; final Product product; Invoice(this.user, this.product); printInvoice() { print(user.toString()); print(product.toString()); } }
рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
Started getting User Started getting product Start listening for invoices Finished getting product Finished getting User Jon Doe - New York - 424242 - 42 Flux compensator - 99999.99
CombineLatest
combineLatest
рднреА рд╕реНрдЯреНрд░реАрдо рдорд╛рди рдХреЛ рдорд░реНрдЬ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди merge
рдФрд░ zip
рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗред рдпрд╣ рдЕрдзрд┐рдХ рдереНрд░реЗрдбреНрд╕ рдХреЗ рд▓рд┐рдП рд╕реБрдирддрд╛ рд╣реИ рдФрд░ рдЬрдм рднреА рдХреЛрдИ рдирдпрд╛ рдереНрд░реЗрдб рдЖрддрд╛ рд╣реИ рддреЛ рд╕рдВрдпреБрдХреНрдд рдореВрд▓реНрдп рдЬрд╛рд░реА рдХрд░рддрд╛ рд╣реИред рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдпрд╣ рди рдХреЗрд╡рд▓ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдореВрд▓реНрдп рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЕрдиреНрдп рд╕рднреА рд╕реНрд░реЛрдд рдзрд╛рд░рд╛рдУрдВ рдХреЗ рдЕрдВрддрд┐рдо рдкреНрд░рд╛рдкреНрдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рднреА рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдПрдиреАрдореЗрд╢рди рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦреЗрдВ:

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ combineLates
рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рдореВрд▓реНрдп combineLates
, рд╕рднреА рд╕реНрд░реЛрдд рдереНрд░реЗрдбреНрд╕ рдХреЛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
рдкрд╣рд▓реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЧрдП рддрд░реАрдХреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, combineLatest
рд╕рдмрд╕реЗ рд╕реНрдерд┐рд░ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪреВрдВрдХрд┐ рдбрд╛рд░реНрдЯ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрд░реЛрдд рдзрд╛рд░рд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ combLastest
рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВ: CombLatest2 ... CombLatest9
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, combineLatest
рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ рд╣реИ, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рджреЛ Observable<bool>
рдпрд╣ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЗ рд╡реНрдпрд╕реНрдд рд╣реИрдВ, рдФрд░ рдЖрдк рд╡реНрдпрд╕реНрдд рд╕реНрдкрд┐рдирд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрджрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╡реНрдпрд╕реНрдд рд╣реИред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ (рдЫрджреНрдо рдХреЛрдб):
class Model { Observable<bool> get isBusy => Observable.combineLatest2(isBusyOne,isBusyTwo, (b1, b2) => b1 || b2); PublishSubject<bool> isBusyOne; PublishSubject<bool> isBusyTwo; }
рдЕрдкрдиреЗ UI рдореЗрдВ, рдЖрдк Spinner
рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП isBusy
рд╕рд╛рде StreamBuilder
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдкрд░рд┐рдгрд╛рдореА рдореВрд▓реНрдп рд╕рд╣реА рд╣реИред
combineLatest
FireStore рд╕реНрдиреИрдкрд╢реЙрдЯ рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ combineLatest
рдмрд╣реБрдд рд╣реА рдЙрдкрдпреБрдХреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред
рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдПрдХ рдРрд╕рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдореМрд╕рдо рдХреЗ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдХреЗ рд╕рд╛рде рд╕рдорд╛рдЪрд╛рд░ рдлрд╝реАрдб рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗред рдЯрд┐рдХрд░ рд╕рдВрджреЗрд╢ рдФрд░ рдореМрд╕рдо рдбреЗрдЯрд╛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред рджреЛрдиреЛрдВ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рд╣реИрдВред рдЖрдк StreamBuilder рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдЕрдкрдбреЗрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред combineLatest
рд╕рд╛рде combineLatest
рдпрд╣ рдЖрд╕рд╛рди рд╣реИ:
class WeatherForecast { final String forecastText; final GeoPoint location; factory WeatherForecast.fromMap(Map<String, dynamic> map) { return WeatherForecast(map['forecastText'], map['location']); } WeatherForecast(this.forecastText, this.location); } class NewsMessage { final String newsText; final GeoPoint location; factory NewsMessage.fromMap(Map<String, dynamic> map) { return NewsMessage(map['newsText'], map['location']); } NewsMessage(this.newsText, this.location); } class CombinedMessage { final WeatherForecast forecast; final NewsMessage newsMessage; CombinedMessage(this.forecast, this.newsMessage); } class Model { CollectionReference weatherCollection; CollectionReference newsCollection; Model() { weatherCollection = Firestore.instance.collection('weather'); newsCollection = Firestore.instance.collection('news'); } Observable<CombinedMessage> getCombinedMessages() { Observable<WeatherForecast> weatherForecasts = weatherCollection .snapshots() .expand((snapShot) => snapShot.documents) .map<WeatherForecast>((document) => WeatherForecast.fromMap(document.data)); Observable<NewsMessage> news = newsCollection .snapshots() .expand((snapShot) => snapShot.documents) .map<NewsMessage>((document) => NewsMessage.fromMap(document.data)); return Observable.combineLatest2( weatherForecasts, news, (weather, news) => CombinedMessage(weather, news)); } }
рдЖрдкрдХреЗ UI рдореЗрдВ, рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛: StreamBuilder<CombinedMessage>(stream: model.getCombinedMessages(),...).
рдЕрд▓рдЧ
рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ, рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ BBusyOne рдФрд░ isBusyTwo рд╕рдорд╛рди рдореВрд▓реНрдп рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЕрджреНрдпрддрди рдЙрд╕реА рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛ред рдЗрд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо .distinct()
рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдХреЗрд╡рд▓ рддрднреА рд╕реНрдЯреНрд░реАрдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдирдП рддрддреНрд╡ рдХрд╛ рдореВрд▓реНрдп рдкрд┐рдЫрд▓реЗ рд╕реЗ рдЕрд▓рдЧ рд╣реЛред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдХреЛрдб рдХреЛ рдЗрд╕рдореЗрдВ рдмрджрд▓ рджреЗрдВрдЧреЗ:
Observable<bool> isBusy => isBusyOne.mergeWith([isBusyTwo]).distinct();
рдФрд░ рдпрд╣ рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдЬрдВрдЬреАрд░реЛрдВ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
AsyncMap
map()
рдЕрд▓рд╛рд╡рд╛ map()
рдПрдХ asyncMap
рдлрд╝рдВрдХреНрд╢рди рднреА рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдлрд╛рдпрд░рд╕реНрдЯреЛрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╕реЗрдЯрд┐рдВрдЧ рдкреЗрд╢ рдХрд░реЗрдВред рдЕрдм рдЖрд╡рд╢реНрдпрдХ WeatherForecast NewsMessage рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рддрднреА рдЕрдкрдбреЗрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдПрдХ рдирдпрд╛ NewsMessage рдкреНрд░рд╛рдкреНрдд рд╣реЛ :
Observable<CombinedMessage> getDependendMessages() { Observable<NewsMessage> news = newsCollection.snapshots().expand((snapShot) { return snapShot.documents; }).map<NewsMessage>((document) { return NewsMessage.fromMap(document.data); }); return news.asyncMap((newsEntry) async { var weatherDocuments = await weatherCollection.where('location', isEqualTo: newsEntry.location).getDocuments(); return new CombinedMessage( WeatherForecast.fromMap(weatherDocuments.documents.first.data), newsEntry); }); }
GetD dependendMessages рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдСрдмреНрдЬрд╝рд░реНрд╡реЗрдмрд▓, рд╣рд░ рдмрд╛рд░ NewsCollection рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рджреМрд░рд╛рди рдПрдХ рдирдпрд╛ CombinedMessage рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред
рдбреАрдмрдЧ рд╡реЗрдзрд╢рд╛рд▓рд╛рдПрдБ
рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг Rx рдХреЙрд▓ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЗрд╕ рддрд░рд╣ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдирд╛ рд▓рдЧрднрдЧ рдЕрд╕рдВрднрд╡ рд▓рдЧрддрд╛ рд╣реИ:
Observable<NewsMessage> news = newsCollection .snapshots() .expand((snapShot) => snapShot.documents) .map<NewsMessage>((document) => NewsMessage.fromMap(document.data));
рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ =>
рдПрдХ рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рд╣реИред рдмреНрд▓реЙрдХ рдмреЙрдбреА рдореЗрдВ рдХрдиреНрд╡рд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдкрдХреЛ рдорд┐рд▓реЗрдЧрд╛:
Observable<NewsMessage> news = newsCollection .snapshots() .expand((snapShot) { return snapShot.documents; }) .map<NewsMessage>((document) { return NewsMessage.fromMap(document.data); });
рдФрд░ рдЕрдм рд╣рдо рдПрдХ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЕрдкрдиреА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рд╣рд░ рдЪрд░рдг рдкрд░ рдкреНрд░рд┐рдВрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯреНрд╕ рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ
рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рдордЬрдмреВрдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП Rx рдХреЛ рднреБрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрд╢рд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ Rx "рдХрдиреНрд╡реЗрдпрд░ рдмреЗрд▓реНрдЯ рдХреЗ рд╕рд╛рде" рдЪрд▓рддреЗ рд╕рдордп рдбреЗрдЯрд╛ рд░реВрдкрд╛рдВрддрд░рдг рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХрднреА рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рди рдХрд░реЗрдВ рдЬреЛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдмрд╛рд╣рд░ рдХрд┐рд╕реА рднреА рдЪрд░ / рд░рд╛рдЬреНрдп рдХреЛ рддрдм рддрдХ рдмрджрд▓рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдЖрдкред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп:
Observable.fromFuture(getProduct()) .map<Product>((jsonString) { var product = Product.fromJson(jsonString); database.save(product); setState((){ _product = product }); return product; }).listen();
рдпрд╣ рдХрд░реЗрдВ:
Observable.fromFuture(getProduct()) .map<Product>((jsonString) => Product.fromJson(jsonString)) .listen( (product) { database.save(product); setState((){ _product = product }); });
map()
рдХрд╛ рдХрд░реНрддрд╡реНрдп map()
рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдмрджрд▓рдирд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ! рдпрджрд┐ рдкрд╛рд░рд┐рдд рдкреНрд░рджрд░реНрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреБрдЫ рдФрд░ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдХреЛрдб рдХреЛ рдкрдврд╝рддреЗ рд╕рдордп рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред
рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдкрд░ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░
рдореЗрдореЛрд░реА рд▓реАрдХ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдмреНрд╕реНрдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ cancel()
, рд╕реНрдЯреНрд░реАрдордХрдВрдЯреНрд░реЛрд▓рд░реНрд╕ рдХреЗ рд▓рд┐рдП рдбрд┐рд╕реНрдкреЛрдЬрд▓ close()
, рд╕рдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП close()
, рдЬреИрд╕реЗ рд╣реА рдЖрдкрдХреЛ рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдмрдзрд╛рдИ рд╣реЛ рдЕрдЧрд░ рдЖрдк рдЗрд╕ рдХреНрд╖рдг рддрдХ рдореЗрд░реЗ рд╕рд╛рде рд░рд╣реЗред рдЕрдм рдЖрдк рди рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП Rx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЙрди рдЕрдЧрд▓реА рдкреЛрд╕реНрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рддреИрдпрд╛рд░реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╣рдо RxVMS рдХреЗ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВрдЧреЗ ред