рдпрд╣ рдореЗрд░реА рд╕реНрдкрдВрджрди рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдЪреМрдерд╛ рднрд╛рдЧ рд╣реИ:
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкрд┐рдЫрд▓реЗ 2 рднрд╛рдЧ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ RxVMS рдкреИрдЯрд░реНрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рдереЗ, рд╡реЗ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рд╕реНрдкрд╖реНрдЯ рд╕рдордЭ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдереЗред рдЕрдм рд╣рдо рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреИрдХреЗрдЬреЛрдВ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдЖрд░рдПрдХреНрд╕рд╡реАрдПрдордПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЧреЗрдЯ рдЗрдЯ: рдлрд╛рд╕реНрдЯ рд╕рд░реНрд╡рд┐рд╕рд▓реЙрдХрд░
рдЬрдм рдЖрдк рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди RxVMS рддрддреНрд╡реЛрдВ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЖрд░реЗрдЦ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ ...

... рд╢рд╛рдпрдж рдЖрдк рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдореИрдкрд┐рдВрдЧ, рдкреНрд░рдмрдВрдзрдХ рдФрд░ рд╕реЗрд╡рд╛рдПрдВ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ рдкрддрд╛ рд▓рдЧрд╛рддреА рд╣реИрдВред рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдЖрдк рд╕реЛрдЪ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ рдХрд┐ рдПрдХ рддрддреНрд╡ рджреВрд╕рд░реЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рддрдХ рдХреИрд╕реЗ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИред
рдЗрддрдиреЗ рд╕рд╛рд░реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ (рдЬреИрд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдб рд╡рд┐рдЬреЗрдЯ, рдЖрдИрдУрд╕реА рдХрдВрдЯреЗрдирд░, рдбреАрдЖрдИ ...) рдХреЗ рд╕рд╛рде, рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕рд░реНрд╡рд┐рд╕ рд▓реЛрдХреЗрдЯрд░ рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореЗрд░реЗ рдкрд╛рд╕ GetIt рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд▓реЗрдЦ рд╣реИ - рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдореЗрд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдореИрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдереЛрдбрд╝рд╛ рд╕реНрдкрд░реНрд╢ рдХрд░реВрдВрдЧрд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдк рдПрдХ рдмрд╛рд░ рдЗрд╕ рд╕реЗрд╡рд╛ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреВрд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддрдХ рдЙрдирдХреА рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИред рдпрд╣ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреА рддрд░рд╣ рд╣реИ ... рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗрдкрди рдХреЗ рд╕рд╛рдеред
рдХреЗ рдЙрдкрдпреЛрдЧ
GetIt рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИред рдЖрд╡реЗрджрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдЖрдк рд╕реЗрд╡рд╛рдУрдВ рдФрд░ / рдпрд╛ рдкреНрд░рдмрдВрдзрдХреЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдмрд╛рдж рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдкрдВрдЬреАрдХреГрдд рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдЧреЗрдЯ рдЗрдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред
рдПрдХ рдЕрдЪреНрдЫреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдХрдВрдХреНрд░реАрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддрд░рд╣ рд╣реА рдЗрдВрдЯрд░рдлреЗрд╕ рдпрд╛ рдЕрдореВрд░реНрдд рдХрдХреНрд╖рд╛рдПрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЗрдВрдЯрд░рдлреЗрд╕ / рдЕрдореВрд░реНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЖрд╕рд╛рдиреА рд╕реЗ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЬрдЧрд╣ред рдЗрд╕рд╕реЗ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реЗрд╡рд╛ рдХреЛ рдореЙрдХрд╕реЗрд╡рд╛ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдереЛрдбрд╝рд╛ рд╕рд╛ рдЕрднреНрдпрд╛рд╕
рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╕реЗрд╡рд╛ рдореЗрдВ рдЕрдкрдиреЗ рд╕реЗрд╡рд┐рд╕рд▓реЛрдХреЗрдЯрд░ рдХреЛ рдПрдХ рд╡реИрд░рд┐рдПрдмрд▓ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ service_locator.dart рдирд╛рдо рд╕реЗ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкреВрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред
рдЬрдм рднреА рдЖрдк рдкрд╣реБрдВрдЪрдирд╛ рдЪрд╛рд╣реЗрдВ, рдмрд╕ рдХреЙрд▓ рдХрд░реЗрдВ
RegistrationType object = sl.get<RegistrationType>();
рдЕрддреНрдпрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдиреЛрдЯ: GetIt рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, ALWAYS рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╕рдордп рдПрдХ рд╣реА рд╢реИрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - рдпрд╛ рддреЛ рдкреИрдХреЗрдЬ (рдЕрдиреБрд╢рдВрд╕рд┐рдд) рдпрд╛ рд░рд┐рд╢реНрддреЗрджрд╛рд░ рдкрде, рд▓реЗрдХрд┐рди рджреЛрдиреЛрдВ рдПрдХ рд╕рд╛рде рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдбрд╛рд░реНрдЯ рдЕрдкрдиреА рдкрд╣рдЪрд╛рди рдХреЗ рдмрд╛рд╡рдЬреВрдж рдРрд╕реА рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрд▓рдЧ рдорд╛рдирддреЗ рд╣реИрдВред
рдпрджрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдмреНрд▓реЙрдЧ рдкрд░ рдЬрд╛рдПрдВ ред
RxCommand
рдЕрдм рдЬрдм рд╣рдо GetIt рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрдиреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╣рд░ рдЬрдЧрд╣ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рд╣рд┐рдд) рддрдХ рдкрд╣реБрдВрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдпрд╣ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо UI рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдкреНрд░рдмрдВрдзрдХреЛрдВ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
class SearchManager { void lookUpZip(String zip); }
рдФрд░ рдлрд┐рд░ UI рдореЗрдВ
TextField(onChanged: sl.get<SearchManager>().lookUpZip,)
рдпрд╣ TextField
рдореЗрдВ рд╣рд░ рдмрджрд▓рд╛рд╡ рдкрд░ lookUpZip
рдХреЛ lookUpZip
рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рдХреИрд╕реЗ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ? рдЪреВрдБрдХрд┐ рд╣рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╣рдо рдЕрдкрдиреЗ SearchManager
рдПрдХ StreamController
рдЬреЛрдбрд╝реЗрдВрдЧреЗ:
abstract class SearchManager { Stream<String> get nameOfCity; void lookUpZip(String zip); } class SearchManagerImplementation implements SearchManager{ @override Stream<String> get nameOfCity => cityController.stream; StreamController<String> cityController = new StreamController(); @override Future<void> lookUpZip(String zip) async { var cityName = await sl.get<ZipApiService>().lookUpZip(zip); cityController.add(cityName); } }
рдФрд░ UI рдореЗрдВ:
StreamBuilder<String>( initialData:'', stream: sl.get<SearchManager>().nameOfCity, builder: (context, snapshot) => Text(snapShot.data);
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЗрд╖реНрдЯрддрдо рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:
- рдирд┐рд░рд░реНрдердХ рдХреЛрдб - рд╣рдореЗрдВ рд╣рдореЗрд╢рд╛ рдПрдХ рд╡рд┐рдзрд┐, рд╕реНрдЯреНрд░реАрдордХрдВрдЯреНрд░реЛрд▓рд░ рдФрд░ рдЕрдкрдиреА рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреЗрдЯрд░ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛, рдЕрдЧрд░ рд╣рдо рдЗрд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдбреЛрдореЗрди рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
- рд╡реНрдпрд╕реНрдд рдЕрд╡рд╕реНрдерд╛ - рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рд╕реНрдкрд┐рдирд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрдмрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдЕрдкрдирд╛ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ?
- рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ - рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ?
рдмреЗрд╢рдХ, рд╣рдо рд░рд╛рдЬреНрдпреЛрдВ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ StreamControllers рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ ... рд▓реЗрдХрд┐рди рдЬрд▓реНрдж рд╣реА рдпрд╣ рдердХрд╛рдК рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ rx_command рдкреИрдХреЗрдЬ рдпрд╣рд╛рдВ рдХрд╛рдо рдЖрддрд╛ рд╣реИ ред
RxCommand
рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рдХреБрдЫред RxCommand
рдПрдХ рдлрд╝рдВрдХреНрд╢рди (рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдпрд╛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕) рдХреЛ RxCommand
рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкреЛрд╕реНрдЯ рдХрд░рддрд╛ рд╣реИред
RxCommand рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЕрдкрдиреЗ рдкреНрд░рдмрдВрдзрдХ рдХреЛ рдЗрд╕ рддрд░рд╣ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
abstract class SearchManager { RxCommand<String,String> lookUpZipCommand; } class SearchManagerImplementation implements SearchManager{ @override RxCommand<String,String> lookUpZipCommand; SearchManagerImplementation() { lookUpZipCommand = RxCommand.createAsync((zip) => sl.get<ZipApiService>().lookUpZip(zip)); } }
рдФрд░ UI рдореЗрдВ:
TextField(onChanged: sl.get<SearchManager>().lookUpZipCommand,) ... StreamBuilder<String>( initialData:'', stream: sl.get<SearchManager>().lookUpZipCommand, builder: (context, snapshot) => Text(snapShot.data);
рдЬреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рдкрдардиреАрдп рд╣реИред
RxCommand рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ

RxCommand рдореЗрдВ рдПрдХ рдЗрдирдкреБрдЯ рдФрд░ рдкрд╛рдВрдЪ рдЖрдЙрдЯрдкреБрдЯ рд╡реЗрдзрд╢рд╛рд▓рд╛рдПрдБ рд╣реИрдВ:
canExecuteInput рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ Observable<bool>
рдЬрд┐рд╕реЗ рдЖрдк RxCommand рдмрдирд╛рддреЗ рд╕рдордп рдлреИрдХреНрдЯреНрд░реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ RxCommand рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдкреНрд░рд╛рдкреНрдд рдЕрдВрддрд┐рдо рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред
isExecuting рдПрдХ Observable<bool>
рдЬреЛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХрдорд╛рдВрдб рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдкрдирд╛ рдХрд╛рд░реНрдп рдХрд░ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЬрдм рдХреЛрдИ рдЯреАрдо рд╡реНрдпрд╕реНрдд рд╣реЛрддреА рд╣реИ, рддреЛ рдЙрд╕реЗ рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд╕реНрдкрд┐рдирд░ рдХреЛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ isExecuting
рдХреЛ isExecuting
canExecute рдПрдХ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ Observable<bool>
рдЬреЛ рдПрдХ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред рдпрд╣, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪрд╛рд▓реВ / рдмрдВрдж рд░рд╛рдЬреНрдп рдХреЗ рдмреАрдЪ рдПрдХ рдмрдЯрди рдХреЗ рд░реВрдк рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░реАрдордмреНрдпреВрд▓рд░ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рдХрд╛ рдЕрд░реНрде рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
Observable<bool> canExecute = Observable.combineLatest2<bool,bool>(canExecuteInput,isExecuting) => canExecuteInput && !isExecuting).distinct.
рдЬрд┐рд╕рдХрд╛ рдорддрд▓рдм рд╣реИ
- рдЕрдЧрд░ рд╕рд╣реА рд░рд┐рдЯрд░реНрди рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╣реЛ рддреЛ
false
рд╣реЛрдЧрд╛ - рдпрд╣ рддрднреА
true
рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рд╡рд┐рджреЗрд╢реА рд░рд┐рдЯрд░реНрди false
ред
thrownException рдПрдХ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ Observable<Exception>
ред рд╕рднреА рдЕрдкрд╡рд╛рдж рдЬреЛ рдПрдХ рдкреИрдХреЗрдЬреНрдб рдлрдВрдХреНрд╢рди рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдкрдХрдбрд╝рдХрд░ рдЗрд╕ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рдЙрд╕реЗ рд╕реБрдирдирд╛ рдФрд░ рдПрдХ рд╕рдВрд╡рд╛рдж рдмреЙрдХреНрд╕ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
(рдЯреАрдо рд╣реА) рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рднреА рд╣реИред рд╡рд░реНрдХрд┐рдВрдЧ рдлрдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рдиреЛрдВ рдХреЛ рдЗрд╕ рдЪреИрдирд▓ рдкрд░ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддрд╛рдХрд┐ рдЖрдк рд╕реАрдзреЗ RxCommand рдХреЛ рд╕реНрдЯреНрд░реАрдорд▓рд╛рдЗрдирд░ рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕ рдХрд░ рд╕рдХреЗрдВ
рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рд╕рднреА рдХрдорд╛рдВрдб Observable<CommandResult>
рдПрдХ Observable<CommandResult>
, рдЬрд╣рд╛рдБ CommandResult
рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
.results
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИ рдпрджрд┐ рдЖрдк рд╕реАрдзреЗ рд╕реНрдЯреНрд░реАрдордмреНрдпреВрд▓рд░ рдкрд░ рдХрдорд╛рдВрдб рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣ рдХрдорд╛рдВрдб рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛, рдФрд░ рдпрд╣ rx_widgets рдкреИрдХреЗрдЬ рд╕реЗ RxLoader
рд╕рд╛рде рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг RxLoader рд╡рд┐рдЬреЗрдЯ рд╣реИ рдЬреЛ .results
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:
Expanded(
RxCommands рдмрдирд╛рдирд╛
RxCommands рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ:
- рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реИ рдФрд░ рдПрдХ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ;
- рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ;
- рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реИ рдФрд░ рдПрдХ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рддрд╛ рд╣реИ;
- рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ рдФрд░ рдПрдХ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рддрд╛ рд╣реИ;
рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП, RxCommand рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдФрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╣реИрдВрдбрд▓рд░реНрд╕ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдХрдИ рдлреИрдХреНрдЯреНрд░реА рд╡рд┐рдзрд┐рдпрд╛рдБ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
static RxCommand<TParam, TResult> createSync<TParam, TResult>(Func1<TParam, TResult> func,... static RxCommand<void, TResult> createSyncNoParam<TResult>(Func<TResult> func,... static RxCommand<TParam, void> createSyncNoResult<TParam>(Action1<TParam> action,... static RxCommand<void, void> createSyncNoParamNoResult(Action action,... static RxCommand<TParam, TResult> createAsync<TParam, TResult>(AsyncFunc1<TParam, TResult> func,... static RxCommand<void, TResult> createAsyncNoParam<TResult>(AsyncFunc<TResult> func,... static RxCommand<TParam, void> createAsyncNoResult<TParam>(AsyncAction1<TParam> action,... static RxCommand<void, void> createAsyncNoParamNoResult(AsyncAction action,...
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдкрдХрд╛ рдкреИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдорд╛рди рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж RxCommand рдПрдХ рдЦрд╛рд▓реА рдорд╛рди рд▓реМрдЯрд╛рдПрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рд╢реНрд░реЛрддрд╛ рдХреЛ рдРрд╕реА рдХрдорд╛рдВрдб рдкрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░реЗред
рдирд╡реАрдирддрдо рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢
RxCommand.lastResult
рдЖрдкрдХреЛ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЕрдВрддрд┐рдо рд╕рдлрд▓ рдореВрд▓реНрдп рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ initialData
рдореЗрдВ рдЖрд░рдВрднрд┐рдХ initialData
рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рд░рди рдЯрд╛рдЗрдо рдореЗрдВ рдпрд╛ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ CommandResult рдЗрд╡реЗрдВрдЯреНрд╕ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХрдорд╛рдВрдб рдмрдирд╛рддреЗ рд╕рдордп рдЖрдк emitInitialCommandResult = true
рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк .lastResult
рд▓рд┐рдП рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЗрд╕реЗ initialData
рдореЗрдВ initialData рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХрдорд╛рдВрдб рдмрдирд╛рддреЗ рд╕рдордп рдЗрд╕реЗ initialLastResult
рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг - рд╕реНрдкрдВрджрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдмрдирд╛рдирд╛
рдЙрджрд╛рд╣рд░рдг рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЛ RxVMS рдХреЗ рд▓рд┐рдП рдкреБрдирд░реНрдЧрдард┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИ, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдмрдВрдзрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
class AppManager { RxCommand<String, List<WeatherEntry>> updateWeatherCommand; RxCommand<bool, bool> switchChangedCommand; RxCommand<String, String> textChangedCommand; AppManager() {
рдЖрдк рд╡рд┐рднрд┐рдиреНрди RxCommands рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ switchedChangedCommand
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ updateWeatherCommand рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рд╣реИ ред
рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдкреНрд░рдмрдВрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
return Scaffold( appBar: AppBar(title: Text("WeatherDemo")), resizeToAvoidBottomPadding: false, body: Column( children: <Widget>[ Padding( padding: const EdgeInsets.all(16.0), child: TextField( key: AppKeys.textField, autocorrect: false, controller: _controller, decoration: InputDecoration( hintText: "Filter cities", ), style: TextStyle( fontSize: 20.0, ),
рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдкреИрдЯрд░реНрди
рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА CommandResults рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдХрдорд╛рдВрдб рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рджреЗрдЦрд╛ рд╣реИред рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рд╣рдо рдпрд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдХрдорд╛рдВрдб рд╕рдлрд▓ рдерд╛ (рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ), рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди initState
рд╕реНрдЯреЗрдЯрдлреБрд▓рд╡рд┐рдЯрдЧреЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ initState
рдХреЛ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред
createEventCommand
рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд╛:
RxCommand<Event, void> createEventCommand;
рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдИрд╡реЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдЧрд╛ рдФрд░ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рди рдирд╣реАрдВ рд▓реМрдЯрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реАрдЦрд╛ рдерд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ RxCommand рдПрдХ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ void
рд╕рд╛рде рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдПрдХрд▓ рдбреЗрдЯрд╛ рдЖрдЗрдЯрдо рд▓реМрдЯрд╛рдПрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХрдорд╛рдВрдб рдкреВрд░рд╛ рд╣реЛрддреЗ рд╣реА рд╣рдо рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
@override void initState() {
рдорд╣рддреНрд╡рдкреВрд░реНрдг : рдЬрдм рд╣рдорд╛рд░реА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╕рджрд╕реНрдпрддрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ:
@override void dispose() { _eventCommandSubscription?.cancel(); _errorSubscription?.cancel(); super.dispose(); }
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдк рд╡реНрдпрд╕реНрдд рдХрд╛рдЙрдВрдЯрд░ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
initState
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ isExecuting
рдпреЛрдЧреНрдп рдЖрджреЗрд╢реЛрдВ рдХреЛ isExecuting
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрдиреЛ;- рд╕рджрд╕реНрдпрддрд╛ рдореЗрдВ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рджрд┐рдЦрд╛рдирд╛ / рдЫрд┐рдкрд╛рдирд╛; рд╕рд╛рде рд╣реА
- StreamBuilder рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
RxCommandListeners рдХреЗ рд╕рд╛рде рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдирд╛
рдпрджрд┐ рдЖрдк рдХрдИ рдЕрд╡рд▓реЛрдХрдиреАрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕рдВрднрд╡рддрдГ рдХрдИ рд╕рджрд╕реНрдпрддрд╛ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЛ рд╕реБрдирдиреЗ рдФрд░ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рдирд┐рдпрдВрддреНрд░рдг рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреЛрдб рдХреЛ рдХрдо рдкрдардиреАрдп рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдЬреЛрдЦрд┐рдо рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреВрд░реНрдг рд╣реЛрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ cancel
рднреВрд▓ рдЬрд╛рддрд╛ рд╣реИ)ред
Rx_command рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ RxCommandListener рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЗрд╕ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдирд┐рд░реНрдорд╛рддрд╛ рд╡рд┐рднрд┐рдиреНрди рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдФрд░ рд╣реИрдВрдбрд▓рд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ:
class RxCommandListener<TParam, TResult> { final RxCommand<TParam, TResult> command;
рдЖрдкрдХреЛ рд╕рднреА рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЙрдирдореЗрдВ рд╕реЗ рд╕рднреА рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдХреЗрд╡рд▓ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдЕрдкрдиреЗ RxCommandListener
рдХреЛ рдЕрдкрдиреЗ RxCommandListener
рдореЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕рдм рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рдХреЛ рд░рджреНрдж рдХрд░ рджреЗрдЧрд╛ред
рдЖрдЗрдП рдПрдХ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ RxCommandListener
рдХреЗ рд╕рд╛рде рдФрд░ рдмрд┐рдирд╛ рд╕рдорд╛рди рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред selectAndUploadImageCommand
рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдБ рдЪреИрдЯ рд╕реНрдХреНрд░реАрди рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЪрд┐рддреНрд░ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рдЖрджреЗрд╢ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
- ImagePicker рд╕рдВрд╡рд╛рдж рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдЫрд╡рд┐ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
- рдбрд╛рдЙрдирд▓реЛрдб рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдХрдорд╛рдВрдб рдЗрдореЗрдЬ рд╕реНрдЯреЛрд░реЗрдЬ рдПрдбреНрд░реЗрд╕ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдПрдХ рдирдИ рдЪреИрдЯ рдПрдВрдЯреНрд░реА рдмрдирд╛ рд╕рдХреЗрдВред
RxCommandListener рдХреЗ рдмрд┐рдирд╛:
_selectImageCommandSubscription = sl .get<ImageManager>() .selectAndUploadImageCommand .listen((imageLocation) async { if (imageLocation == null) return;
RxCommandListener рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:
selectImageListener = RxCommandListener( command: sl.get<ImageManager>().selectAndUploadImageCommand, onValue: (imageLocation) async { if (imageLocation == null) return; sl.get<EventManager>().createChatEntryCommand(new ChatEntry( event: widget.event, isImage: true, content: imageLocation.downloadUrl, )); }, onIsBusy: () => MySpinner.show(context), onNotBusy: MySpinner.hide, onError: (ex) => showMessageDialog(context, 'Upload problem', "We cannot upload your selected image at the moment. Please check your internet connection"));
рдЖрдо рддреМрд░ рдкрд░, рдореИрдВ рд╣рдореЗрд╢рд╛ рдПрдХ RxCommandListener рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ рдпрджрд┐ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рд╣реЛред
RxCommands рдЖрдЬрд╝рдорд╛рдПрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рдЬреАрд╡рди рдХреЛ рдХреИрд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред
рд╡реИрд╕реЗ, рдЖрдкрдХреЛ RxCommands рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП RxVMS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
RxCommand
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП RxCommand
readme рдкреИрдХреЗрдЬ рдкрдврд╝реЗрдВред