RxVMS рдореВрд▓ рдмрд╛рддреЗрдВ: RxCommand рдФрд░ GetIt

рдпрд╣ рдореЗрд░реА рд╕реНрдкрдВрджрди рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдЪреМрдерд╛ рднрд╛рдЧ рд╣реИ:



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


рдЧреЗрдЯ рдЗрдЯ: рдлрд╛рд╕реНрдЯ рд╕рд░реНрд╡рд┐рд╕рд▓реЙрдХрд░


рдЬрдм рдЖрдк рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди RxVMS рддрддреНрд╡реЛрдВ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЖрд░реЗрдЦ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ ...


рдЫрд╡рд┐


... рд╢рд╛рдпрдж рдЖрдк рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдореИрдкрд┐рдВрдЧ, рдкреНрд░рдмрдВрдзрдХ рдФрд░ рд╕реЗрд╡рд╛рдПрдВ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ рдкрддрд╛ рд▓рдЧрд╛рддреА рд╣реИрдВред рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдЖрдк рд╕реЛрдЪ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ рдХрд┐ рдПрдХ рддрддреНрд╡ рджреВрд╕рд░реЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рддрдХ рдХреИрд╕реЗ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИред


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


рдХреЗ рдЙрдкрдпреЛрдЧ


GetIt рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИред рдЖрд╡реЗрджрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдЖрдк рд╕реЗрд╡рд╛рдУрдВ рдФрд░ / рдпрд╛ рдкреНрд░рдмрдВрдзрдХреЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдмрд╛рдж рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдкрдВрдЬреАрдХреГрдд рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдЧреЗрдЯ рдЗрдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред


рдПрдХ рдЕрдЪреНрдЫреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдХрдВрдХреНрд░реАрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддрд░рд╣ рд╣реА рдЗрдВрдЯрд░рдлреЗрд╕ рдпрд╛ рдЕрдореВрд░реНрдд рдХрдХреНрд╖рд╛рдПрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЗрдВрдЯрд░рдлреЗрд╕ / рдЕрдореВрд░реНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЖрд╕рд╛рдиреА рд╕реЗ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЬрдЧрд╣ред рдЗрд╕рд╕реЗ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реЗрд╡рд╛ рдХреЛ рдореЙрдХрд╕реЗрд╡рд╛ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред


рдереЛрдбрд╝рд╛ рд╕рд╛ рдЕрднреНрдпрд╛рд╕


рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╕реЗрд╡рд╛ рдореЗрдВ рдЕрдкрдиреЗ рд╕реЗрд╡рд┐рд╕рд▓реЛрдХреЗрдЯрд░ рдХреЛ рдПрдХ рд╡реИрд░рд┐рдПрдмрд▓ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ service_locator.dart рдирд╛рдо рд╕реЗ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкреВрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред


//    GetIt sl = new GetIt(); void setUpServiceLocator(ErrorReporter reporter) { //  // [registerSingleton]  -  . //   . // sl.get<ErrorReporter>.get()    . sl.registerSingleton<ErrorReporter>(reporter); // [registerLazySingleton]   ,       // sl.get<ImageService>.get()            . sl.registerLazySingleton<ImageService>(() => new ImageServiceImplementation()); sl.registerLazySingleton<MapService>(() => new MapServiceImplementation()); //  sl.registerSingleton<UserManager>(new UserManagerImplementation()); sl.registerLazySingleton<EventManager>(() => new EvenManagerImplementation()); sl.registerLazySingleton<ImageManager>(() => new ImageManagerImplementation()); sl.registerLazySingleton<AppManager>(() => new AppManagerImplementation()); 

рдЬрдм рднреА рдЖрдк рдкрд╣реБрдВрдЪрдирд╛ рдЪрд╛рд╣реЗрдВ, рдмрд╕ рдХреЙрд▓ рдХрд░реЗрдВ


 RegistrationType object = sl.get<RegistrationType>(); //  GetIt  `callable`,   : RegistrationType object2 = sl<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 рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ



 /// Combined execution state of an `RxCommand` /// Will be issued for any state change of any of the fields /// During normal command execution, you will get this item's listening at the command's [.results] observable. /// 1. If the command was just newly created, you will get `null, false, false` (data, error, isExecuting) /// 2. When calling execute: `null, false, true` /// 3. When exceution finishes: `result, false, false` class CommandResult<T> { final T data; final Exception error; final bool isExecuting; const CommandResult(this.data, this.error, this.isExecuting); bool get hasData => data != null; bool get hasError => error != null; @override bool operator ==(Object other) => other is CommandResult<T> && other.data == data && other.error == error && other.isExecuting == isExecuting; @override int get hashCode => hash3(data.hashCode, error.hashCode, isExecuting.hashCode); @override String toString() { return 'Data: $data - HasError: $hasError - IsExecuting: $isExecuting'; } } 

.results рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИ рдпрджрд┐ рдЖрдк рд╕реАрдзреЗ рд╕реНрдЯреНрд░реАрдордмреНрдпреВрд▓рд░ рдкрд░ рдХрдорд╛рдВрдб рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣ рдХрдорд╛рдВрдб рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛, рдФрд░ рдпрд╣ rx_widgets рдкреИрдХреЗрдЬ рд╕реЗ RxLoader рд╕рд╛рде рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг RxLoader рд╡рд┐рдЬреЗрдЯ рд╣реИ рдЬреЛ .results рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:


 Expanded( /// RxLoader      ///    Stream<CommandResult> child: RxLoader<List<WeatherEntry>>( spinnerKey: AppKeys.loadingSpinner, radius: 25.0, commandResults: sl.get<AppManager>().updateWeatherCommand.results, /// ,  .hasData == true dataBuilder: (context, data) => WeatherListView(data, key: AppKeys.weatherList), /// ,  .isExceuting == true placeHolderBuilder: (context) => Center( key: AppKeys.loaderPlaceHolder, child: Text("No Data")), /// ,  .hasError == true errorBuilder: (context, ex) => Center( key: AppKeys.loaderError, child: Text("Error: ${ex.toString()}")), ), ), 

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() { //    bool         //   Observable switchChangedCommand = RxCommand.createSync<bool, bool>((b) => b); //    switchChangedCommand  canExecute Observable  // updateWeatherCommand updateWeatherCommand = RxCommand.createAsync<String, List<WeatherEntry>>( sl.get<WeatherService>().getWeatherEntriesForCity, canExecute: switchChangedCommand, ); //         textChangedCommand = RxCommand.createSync<String, String>((s) => s); //    ... textChangedCommand //     500ms... .debounce(new Duration(milliseconds: 500)) // ...   updateWeatherCommand .listen(updateWeatherCommand); //     updateWeatherCommand(''); } } 

рдЖрдк рд╡рд┐рднрд┐рдиреНрди 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, ), //    textChangedCommand! onChanged: sl.get<AppManager>().textChangedCommand, ), ), Expanded( /// RxLoader   builders   ///   Stream<CommandResult> child: RxLoader<List<WeatherEntry>>( spinnerKey: AppKeys.loadingSpinner, radius: 25.0, commandResults: sl.get<AppManager>().updateWeatherCommand.results, dataBuilder: (context, data) => WeatherListView(data, key: AppKeys.weatherList), placeHolderBuilder: (context) => Center(key: AppKeys.loaderPlaceHolder, child: Text("No Data")), errorBuilder: (context, ex) => Center(key: AppKeys.loaderError, child: Text("Error: ${ex.toString()}")), ), ), Padding( padding: const EdgeInsets.all(8.0), child: Row( children: <Widget>[ ///  Updatebutton    updateWeatherCommand.canExecute Expanded( //        Streambuilder, //      WidgetSelector child: WidgetSelector( buildEvents: sl .get<AppManager>() .updateWeatherCommand .canExecute, onTrue: RaisedButton( key: AppKeys.updateButtonEnabled, child: Text("Update"), onPressed: () { _controller.clear(); sl.get<AppManager>().updateWeatherCommand(); }, ), onFalse: RaisedButton( key: AppKeys.updateButtonDisabled, child: Text("Please Wait"), onPressed: null, ), ), ), //    canExecuteInput StateFullSwitch( state: true, onChanged: sl.get<AppManager>().switchChangedCommand, ), ], ), ), ], ), ); 

рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдкреИрдЯрд░реНрди


рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА CommandResults рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдХрдорд╛рдВрдб рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рджреЗрдЦрд╛ рд╣реИред рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рд╣рдо рдпрд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдХрдорд╛рдВрдб рд╕рдлрд▓ рдерд╛ (рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ), рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди initState рд╕реНрдЯреЗрдЯрдлреБрд▓рд╡рд┐рдЯрдЧреЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ initState рдХреЛ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред


createEventCommand рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд╛:


  RxCommand<Event, void> createEventCommand; 

рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдИрд╡реЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдЧрд╛ рдФрд░ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рди рдирд╣реАрдВ рд▓реМрдЯрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реАрдЦрд╛ рдерд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ RxCommand рдПрдХ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ void рд╕рд╛рде рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдПрдХрд▓ рдбреЗрдЯрд╛ рдЖрдЗрдЯрдо рд▓реМрдЯрд╛рдПрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХрдорд╛рдВрдб рдкреВрд░рд╛ рд╣реЛрддреЗ рд╣реА рд╣рдо рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 @override void initState() { //      ,        _eventCommandSubscription = _createCommand.listen((_) async { Navigator.pop(context); await showToast('Event saved'); }); //        _errorSubscription = _createEventCommand.thrownExceptions.listen((ex) async { await sl.get<ErrorReporter>().logException(ex); await showMessageDialog(context, 'There was a problem saving event', ex.toString()); }); } 

рдорд╣рддреНрд╡рдкреВрд░реНрдг : рдЬрдм рд╣рдорд╛рд░реА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╕рджрд╕реНрдпрддрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ:


 @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; //       final void Function(TResult value) onValue; //    isExecuting final void Function(bool isBusy) onIsBusyChange; //       final void Function(Exception ex) onError; //    canExecute final void Function(bool state) onCanExecuteChange; //    .results Observable  final void Function(CommandResult<TResult> result) onResult; //     /  final void Function() onIsBusy; final void Function() onNotBusy; //     final Duration debounceDuration; RxCommandListener(this.command,{ this.onValue, this.onIsBusyChange, this.onIsBusy, this.onNotBusy, this.onError, this.onCanExecuteChange, this.onResult, this.debounceDuration,} ) void dispose(); 

рдЖрдкрдХреЛ рд╕рднреА рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЙрдирдореЗрдВ рд╕реЗ рд╕рднреА рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдХреЗрд╡рд▓ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдЕрдкрдиреЗ RxCommandListener рдХреЛ рдЕрдкрдиреЗ RxCommandListener рдореЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕рдм рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рдХреЛ рд░рджреНрдж рдХрд░ рджреЗрдЧрд╛ред


рдЖрдЗрдП рдПрдХ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ RxCommandListener рдХреЗ рд╕рд╛рде рдФрд░ рдмрд┐рдирд╛ рд╕рдорд╛рди рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред selectAndUploadImageCommand рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдБ рдЪреИрдЯ рд╕реНрдХреНрд░реАрди рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЪрд┐рддреНрд░ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рдЖрджреЗрд╢ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:


  • ImagePicker рд╕рдВрд╡рд╛рдж рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рдЫрд╡рд┐ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
  • рдбрд╛рдЙрдирд▓реЛрдб рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдХрдорд╛рдВрдб рдЗрдореЗрдЬ рд╕реНрдЯреЛрд░реЗрдЬ рдПрдбреНрд░реЗрд╕ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдПрдХ рдирдИ рдЪреИрдЯ рдПрдВрдЯреНрд░реА рдмрдирд╛ рд╕рдХреЗрдВред

RxCommandListener рдХреЗ рдмрд┐рдирд╛:


 _selectImageCommandSubscription = sl .get<ImageManager>() .selectAndUploadImageCommand .listen((imageLocation) async { if (imageLocation == null) return; //    sl.get<EventManager>().createChatEntryCommand(new ChatEntry( event: widget.event, isImage: true, content: imageLocation.downloadUrl, )); }); _selectImageIsExecutingSubscription = sl .get<ImageManager>() .selectAndUploadImageCommand .isExecuting .listen((busy) { if (busy) { MySpinner.show(context); } else { MySpinner.hide(); } }); _selectImageErrorSubscription = sl .get<ImageManager>() .selectAndUploadImageCommand .thrownExceptions .listen((ex) => showMessageDialog(context, 'Upload problem', "We cannot upload your selected image at the moment. Please check your internet connection")); 

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 рдкреИрдХреЗрдЬ рдкрдврд╝реЗрдВред

Source: https://habr.com/ru/post/hi449872/


All Articles