Kotlin Multiplatform, рднрд╛рдЧ 1 рдореЗрдВ MVI рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ



рд▓рдЧрднрдЧ рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рдореБрдЭреЗ рдирдИ рдХреЛрдЯрд▓рд┐рди рдорд▓реНрдЯреАрдкреНрд▓реЗрдпрд░ рддрдХрдиреАрдХ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реБрдИред рдпрд╣ рдЖрдкрдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЙрдирдХреЗ рдПрдкреАрдЖрдИ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИред рддрдм рд╕реЗ рдореИрдВ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдкреНрд░рдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рд╣рдорд╛рд░реА рдХрдВрдкрдиреА рдореЗрдВ рдЗрд╕ рдЙрдкрдХрд░рдг рдХрд╛ рдкреНрд░рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдПрдХ рдкрд░рд┐рдгрд╛рдо, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реА рд░реЗрдХрдЯрд┐рд╡ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ - рдХреЛрдЯрд▓рд┐рди рдорд▓реНрдЯреАрдкреНрд▓рд╛рдпреНрдЯреНрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдПрдХреНрд╕рдЯреЗрдВрд╢рдиред

рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП Badoo рдФрд░ рдмрдореНрдмрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ, рд╣рдо рдПрдорд╡реАрдЖрдИ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рд╣рдорд╛рд░реА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, Zsolt Kocsi рджреНрд╡рд╛рд░рд╛ рд▓реЗрдЦ рджреЗрдЦреЗрдВ: " рдЖрдзреБрдирд┐рдХ рдХреЛрдЯрд▓рд┐рди -рдЖрдзрд╛рд░рд┐рдд рдПрдорд╡реАрдЖрдИ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛)")ред рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП, рдореИрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдкреНрд░рд╢рдВрд╕рдХ рдмрди рдЧрдпрд╛ред рдмреЗрд╢рдХ, рдореИрдВ рдХреЛрдЯрд▓рд┐рди рдорд▓реНрдЯреАрдкреНрд▓реЗрдЯ рд░рд┐рдХреЙрд░реНрдбрд░ рдореЗрдВ рдПрдорд╡реАрдЖрдИ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдирд╣реАрдВ рдЫреЛрдбрд╝ рд╕рдХрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдорд╛рдорд▓рд╛ рдЙрдкрдпреБрдХреНрдд рдерд╛: рд╣рдореЗрдВ Reaktive рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдореЗрд░реЗ рдЗрди рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдмрд╛рдж, рдореИрдВ рдФрд░ рднреА рдЕрдзрд┐рдХ рдПрдорд╡реАрдЖрдИ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рдерд╛ред

рдореИрдВ рд╣рдореЗрд╢рд╛ рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдХреИрд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛрдЯрд▓рд┐рди рдорд▓реНрдЯреАрдкреНрд▓реЗрдЯ рд░рд┐рдХреЙрд░реНрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡реЗ рдЗрд╕ рддрд░рд╣ рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВред рдореЗрд░реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдФрд╕рдд рдХреЛрдЯрд▓рд┐рди рдорд▓реНрдЯреАрдкреНрд▓реЗрдпрд░ рдбреЗрд╡рд▓рдкрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдПрдВрдбреНрд░реЙрдЗрдб рдбреЗрд╡рд▓рдкрд░ рд╣реИ рдЬреЛ рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ рдПрдорд╡реАрд╡реАрдПрдо рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд "рд╕реНрд╡рдЪреНрдЫ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛" рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, MVI Kotlin Multiplatform рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдФрд░ "рдХреНрд▓реАрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░" рдПрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЬрдЯрд┐рд▓рддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╖рдпреЛрдВ рдкрд░ рддреАрди рд▓реЗрдЦреЛрдВ рдХреА рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛:

  1. MVI рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг, рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди рдФрд░ рдХреЛрдЯрд▓рд┐рди рдорд▓реНрдЯреАрдкреНрд▓рд╛рдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдгред
  2. рдЖрдИрдУрдПрд╕ рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдПрдХреАрдХрд░рдгред
  3. рдЗрдХрд╛рдИ рдФрд░ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдгред

рдиреАрдЪреЗ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдкрд╣рд▓рд╛ рд▓реЗрдЦ рд╣реИред рдпрд╣ рдЙрди рд╕рднреА рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдкреА рдХрд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рд╕рд┐рд░реНрдл рдХреЛрдЯрд▓рд┐рди рдорд▓реНрдЯреАрдкреНрд▓реЗрдпрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред

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

MVI


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдпрд╛рдж рдХрд░реЗрдВ рдХрд┐ MVI рдХреНрдпрд╛ рд╣реИред рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рдореЙрдбрд▓-рд╡реНрдпреВ-рдЗрдВрдЯреЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╣реИред рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рдореБрдЦреНрдп рдШрдЯрдХ рд╣реИрдВ:

  • рдореЙрдбрд▓ - рддрд░реНрдХ рдФрд░ рдбреЗрдЯрд╛ рдХреА рдПрдХ рдкрд░рдд (рдореЙрдбрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ);
  • (View) тАФ UI-, (states) (intents).

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд┐рддреНрд░ рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ:



рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЙрди рдмрд╣реБрдд рд╣реА рдмреБрдирд┐рдпрд╛рджреА рдШрдЯрдХреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ: рдореЙрдбрд▓ рдФрд░ рдкреНрд░рд╕реНрддреБрддрд┐ред рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдбреЗрдЯрд╛ рд╣реИ рдЬреЛ рдЙрдирдХреЗ рдмреАрдЪ рдШреВрдорддрд╛ рд╣реИред

рдпрд╣ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдХреЗрд╡рд▓ рдПрдХ рджрд┐рд╢рд╛ рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИред рд░рд╛рдЬреНрдп рдореЙрдбрд▓ рд╕реЗ рдЖрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдп рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рдЗрд░рд╛рджреЗ рджреГрд╢реНрдп рд╕реЗ рдЖрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рдкрд░рд┐рд╕рдВрдЪрд░рдг рдХреЛ рдпреВрдирд┐рдбрд╛рдпрд░реЗрдХреНрд╢рдирд▓ рдбреЗрдЯрд╛ рдлрд╝реНрд▓реЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

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

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

  • рд╣рдорд╛рд░реЗ Reaktive рдкреБрд╕реНрддрдХрд╛рд▓рдп - Kotlin Multiplatform рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди;
  • рдХреЛрд░рд╛рдЯрд╛рдЗрдиреНрд╕ рдФрд░ рдлреНрд▓реЛ - рдХреЛрдЯрд▓рд┐рди рдХреЛрд░рдЯрд╛рдЗрдиреНрд╕ рдХреЗ рд╕рд╛рде рдардВрдб рдзрд╛рд░рд╛рдУрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдирд┐рд░реВрдкрдг


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

рдПрдорд╡реАрдЖрдИ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдмрд╕реЗ рд╕рд░рд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛:

  • Android рдФрд░ iOS рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди;
  • рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди (рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ, рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ, рдЖрджрд┐) рдХрд╛ рдкреНрд░рджрд░реНрд╢рди;
  • рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб;
  • рдкреНрд░рддреНрдпреЗрдХ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рджреЗрд╢реА рдЯреВрд▓ рдХреЗ рд╕рд╛рде рдпреВрдЖрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди;
  • рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ Rx рдХреА рдХрдореА рд╣реИ (рддрд╛рдХрд┐ рдЖрдкрдХреЛ Rx рдкрд░ "api" рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рди рдХрд░рдиреА рдкрдбрд╝реЗ)ред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪреБрдирд╛: рдПрдХ рдмрдЯрди рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдХреНрд░реАрди, рдЬрд┐рд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдХреА рдордирдорд╛рдиреА рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реВрдЪреА рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рдПрдЧреАред рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЦреБрд▓реЗ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛: https://thecatapi.com ред рдпрд╣ рдЖрдкрдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рд╡реЗрдм рд╕реЗ рд╕реВрдЪреА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреА рд╣реЛрдЧреА рдФрд░ JSON рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЖрдк рд╣рдорд╛рд░реЗ GitHub рдкрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рднреА рд╕реНрд░реЛрдд рдХреЛрдб рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред

рдЖрд░рдВрдн рдХрд░рдирд╛: рдПрдорд╡реАрдЖрдИ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░


рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдПрдорд╡реАрдЖрдИ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдореВрд░реНрддрддрд╛рдПрдВ рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рд╣рдореЗрдВ рдмрд╣реБрдд рдмреБрдирд┐рдпрд╛рджреА рдШрдЯрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА - рдореЙрдбрд▓ рдФрд░ рджреГрд╢реНрдп - рдФрд░ рдЯрд╛рдЗрдкрд┐рдпрд╛рд▓рд┐рд╕ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗред

Typealiases


рдЗрд░рд╛рджреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЕрднрд┐рдиреЗрддрд╛ (рдЕрднрд┐рдиреЗрддрд╛) рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ - рдПрдХ рдРрд╕рд╛ рдХрд╛рд░реНрдп рдЬреЛ рдЗрд░рд╛рджреЗ рдФрд░ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдПрдХ рдзрд╛рд░рд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдкреНрд░рднрд╛рд╡):

рдЯрд╛рдЗрдкреЗрд▓рд┐рдпрд╕ рдПрдХреНрдЯрд░ < рд░рд╛рдЬреНрдп , рдЖрд╢рдп , рдкреНрд░рднрд╛рд╡ > = ( рд░рд╛рдЬреНрдп , рдЖрд╢рдп ) - > рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп < рдкреНрд░рднрд╛рд╡ >
рдХрдЪреНрдЪреЗ рджреЗрдЦреЗрдВ MviKmpActor.kt рджреНрд╡рд╛рд░рд╛ тЭд рдХреЗ рд╕рд╛рде рдХреА рдореЗрдЬрдмрд╛рдиреА рдХреА GitHub

рд╣рдореЗрдВ рдПрдХ reducer (Reducer) рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдкреНрд░рднрд╛рд╡реА рдФрд░ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдирдпрд╛ рд░рд╛рдЬреНрдп рджреЗрддрд╛ рд╣реИ:

typealias рдкреНрд░рд╕рд╛рд░рдг < рд░рд╛рдЬреНрдп , рдкреНрд░рднрд╛рд╡ > = ( рд░рд╛рдЬреНрдп , рдкреНрд░рднрд╛рд╡ ) - > рд░рд╛рдЬреНрдп
рдХрдЪреНрдЪреЗ рджреЗрдЦреЗрдВ MviKmpReducer.kt рджреНрд╡рд╛рд░рд╛ тЭд рдХреЗ рд╕рд╛рде рдХреА рдореЗрдЬрдмрд╛рдиреА рдХреА GitHub

рджреБрдХрд╛рди


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

рдЖрдЗрдП рдЙрдкрдпреБрдХреНрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдВ:

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реНрдЯреЛрд░ < рдореЗрдВ рдЖрд╢рдп : рдХрд┐рд╕реА рднреА , рдмрд╛рд╣рд░ рд░рд╛рдЬреНрдп : рдХрд┐рд╕реА рднреА > : рдЙрдкрднреЛрдХреНрддрд╛ < рдЖрд╢рдп >, рдкреНрд░рддреНрдпрдХреНрд╖ < рд░рд╛рдЬреНрдп >, рдбрд┐рд╕реНрдкреЛрдЬреЗрдмрд▓
рдХрдЪреНрдЪреЗ рджреЗрдЦреЗрдВ MviKmpStoreInterface.kt рджреНрд╡рд╛рд░рд╛ тЭд рдХреЗ рд╕рд╛рде рдХреА рдореЗрдЬрдмрд╛рдиреА рдХреА GitHub

рддреЛ, рд╣рдорд╛рд░реЗ рд╕реНрдЯреЛрд░ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧреБрдг рд╣реИрдВ:

  • рджреЛ рд╕рд╛рдорд╛рдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ: рдЗрдирдкреБрдЯ рдЗрдВрдЯреЗрдВрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреЗрдЯ;
  • рдЗрд░рд╛рджреЛрдВ рдХрд╛ рдЙрдкрднреЛрдХреНрддрд╛ рд╣реИ (рдЙрдкрднреЛрдХреНрддрд╛ <рдЖрд╢рдп>);
  • рдПрдХ рд░рд╛рдЬреНрдп рдзрд╛рд░рд╛ рд╣реИ (рдЕрд╡рд▓реЛрдХрдиреАрдп <рд░рд╛рдЬреНрдп>);
  • рдпрд╣ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА (рдбрд┐рд╕реНрдкреЛрдЬреЗрдмрд▓) рд╣реИред

рдЪреВрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рд╣рд╛рдпрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

рд╡рд░реНрдЧ StoreHelper < рдореЗрдВ рдЖрд╢рдп : рдХрд┐рд╕реА рднреА , рдмрд╛рд╣рд░ рд░рд╛рдЬреНрдп : рдХрд┐рд╕реА рднреА , рдореЗрдВ рдкреНрд░рднрд╛рд╡ : рдХрд┐рд╕реА рднреА > (
рдЖрд░рдВрднрд┐рдХ рд╕реНрдЯреЗрдЯ : рд░рд╛рдЬреНрдп ,
рдирд┐рдЬреА рд╡реИрд▓ рдЕрднрд┐рдиреЗрддрд╛ : рдЕрднрд┐рдиреЗрддрд╛ < рд░рд╛рдЬреНрдп , рдЖрд╢рдп , рдкреНрд░рднрд╛рд╡ >,
private val reducer: Reducer<State, Effect>
) : Observable<State>, DisposableScope by DisposableScope() {
init {
ensureNeverFrozen()
}
private val subject = BehaviorSubject(initialState)
fun onIntent(intent: Intent) {
actor(subject.value, intent).subscribeScoped(isThreadLocal = true, onNext = ::onEffect)
}
рдордЬрд╝рд╛ onEffect ( рдкреНрд░рднрд╛рд╡ : рдкреНрд░рднрд╛рд╡ ) {
subject.onNext (reducer (рд╡рд┐рд╖рдпред рдкреНрд░рднрд╛рд╡, рдкреНрд░рднрд╛рд╡))
}
рдУрд╡рд░рд░рд╛рдЗрдб рдлрди рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди ( рдСрдмреНрдЬрд░реНрд╡рд░ : рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓рдСрдмреНрдЬрд░реНрд╡рд░ < рд╕реНрдЯреЗрдЯ >) {
рд╡рд┐рд╖рдпред рд╕рджрд╕реНрдпрддрд╛ (рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ)
}
}
рдХрдЪреНрдЪреЗ рджреЗрдЦреЗрдВ MviKmpStoreHelper.kt рджреНрд╡рд╛рд░рд╛ тЭд рдХреЗ рд╕рд╛рде рдХреА рдореЗрдЬрдмрд╛рдиреА рдХреА GitHub


StoreHelper рдПрдХ рдЫреЛрдЯрд╛ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рд╕реНрдЯреЛрд░ рдмрдирд╛рдирд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдЧрд╛ред рдЗрд╕рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧреБрдг рд╣реИрдВ:

  • рддреАрди рд╕рд╛рдорд╛рдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ: рдЗрдирдкреБрдЯ рдЖрд╢рдп рдФрд░ рдкреНрд░рднрд╛рд╡ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреЗрдЯ;
  • рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛, рдЕрднрд┐рдиреЗрддрд╛ рдФрд░ рдЧрд┐рдпрд░рдмреЙрдХреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ;
  • рд░рд╛рдЬреНрдпреЛрдВ рдХреА рдПрдХ рдзрд╛рд░рд╛ рд╣реИ;
  • рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА (рдбрд┐рд╕реНрдкреЛрдЬреЗрдмрд▓);
  • рдЧреИрд░-рдлреНрд░реАрдЬрд┐рдВрдЧ (рддрд╛рдХрд┐ рдЧреНрд░рд╛рд╣рдХ рднреА рдЬрдореЗ рд╣реБрдП рди рд╣реЛрдВ );
  • рдФрдЬрд╛рд░ DisposableScope (рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Reaktive рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕);
  • рдЗрд░рд╛рджреЗ рдФрд░ рдкреНрд░рднрд╛рд╡ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред

рд╣рдорд╛рд░реЗ рд╕реНрдЯреЛрд░ рдХреЗ рдЖрд░реЗрдЦ рдХреЛ рджреЗрдЦреЗрдВред рдЗрд╕рдореЗрдВ рдПрдХреНрдЯрд░ рдФрд░ рдЧрд┐рдпрд░рдмреЙрдХреНрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рд╣реИрдВ:



рдЖрдЗрдП рд╣рдо рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдзрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

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

рдЕрдм рдЖрдЗрдпреЗ onEffect рдореЗрдердб рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ:

  • рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рднрд╛рд╡ рд▓реЗрддрд╛ рд╣реИ;
  • рдЧрд┐рдпрд░рдмреЙрдХреНрд╕ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдкреНрд░рднрд╛рд╡ рдФрд░ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ;
  • рдирдпрд╛ рд░рд╛рдЬреНрдп рдмрд┐рд╣реЗрд╡рд┐рдпрд░рд╕реБрдмрд┐рдЬ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рднреА рдЧреНрд░рд╛рд╣рдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирдП рд░рд╛рдЬреНрдп рдХреА рдкреНрд░рд╛рдкреНрддрд┐ рд╣реЛрддреА рд╣реИред

рд░рд╛рдп


рдЕрдм рдкреНрд░рд╕реНрддреБрддрд┐рдХрд░рдг рдореЗрдВ рдЖрддреЗ рд╣реИрдВред рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдШрдЯрдирд╛рдУрдВ рдХреА рдПрдХ рдзрд╛рд░рд╛ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдПрдХ рдЕрд▓рдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рднреА рдмрдирд╛рдПрдВрдЧреЗ:

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ MviView < рдореЗрдВ рдореЙрдбрд▓ : рдХрд┐рд╕реА рднреА , рдмрд╛рд╣рд░ рдШрдЯрдирд╛ : рдХрд┐рд╕реА рднреА > {
рдШрд╛рдЯреА рдХреА рдШрдЯрдирд╛рдУрдВ : рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп < рдШрдЯрдирд╛ >
рдордЬреЗрджрд╛рд░ рд░реЗрдВрдбрд░ ( рдореЙрдбрд▓ : рдореЙрдбрд▓ )
}
рдХрдЪреНрдЪреЗ рджреЗрдЦреЗрдВ MviKmpMviView.kt рджреНрд╡рд╛рд░рд╛ тЭд рдХреЗ рд╕рд╛рде рдХреА рдореЗрдЬрдмрд╛рдиреА рдХреА GitHub


рдПрдХ рджреГрд╢реНрдп рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧреБрдг рд╣реЛрддреЗ рд╣реИрдВ:

  • рджреЛ рд╕рд╛рдорд╛рдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ: рдЗрдирдкреБрдЯ рдореЙрдбрд▓ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдЗрд╡реЗрдВрдЯ;
  • рд░реЗрдВрдбрд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ;
  • рдЗрд╡реЗрдВрдЯ рдкреНрд░реЙрдкрд░реНрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдИрд╡реЗрдВрдЯ рд╕реНрдЯреНрд░реАрдо рднреЗрдЬрдирд╛ред

рдореИрдВрдиреЗ Android рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рднреНрд░рдо рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП MviView рдирд╛рдо рдореЗрдВ Mvi рдЙрдкрд╕рд░реНрдЧ рдЬреЛрдбрд╝рд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдХрдВрдЬреНрдпреВрдорд░ рдФрд░ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдмрд╕ рд╕рдВрдкрддреНрддрд┐ рдФрд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рддрд╛рдХрд┐ рдЖрдк Rx рдХреЛ "рдПрдкреАрдЖрдИ" рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдмрд┐рдирд╛ рдкреНрд░рд╕реНрддреБрддрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (Android рдпрд╛ iOS) рдХреЗ рд▓рд┐рдП рдПрдХ рдордВрдЪ рдкрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХреЗрдВред рдЪрд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реАрдзреЗ "рдИрд╡реЗрдВрдЯ" рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдПрдорд╡реАрдПрд╡реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ, рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреБрд░рдВрдд рдЗрд╕ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдХреЛ рдЬреЛрдбрд╝реЗрдВ:

abstract class AbstractMviView<in Model : Any, Event : Any> : MviView<Model, Event> {
private val subject = PublishSubject<Event>()
override val events: Observable<Event> = subject
protected fun dispatch(event: Event) {
subject.onNext(event)
}
}
view raw MviKmpAbstractMviView.kt рджреНрд╡рд╛рд░рд╛ тЭд рдХреЗ рд╕рд╛рде рдХреА рдореЗрдЬрдмрд╛рдиреА рдХреА GitHub

рдпрд╣ рд╡рд░реНрдЧ рд╣рдореЗрдВ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЬрд╛рд░реА рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛, рд╕рд╛рде рд╣реА рдордВрдЪ рдХреЛ рдЖрд░рдПрдХреНрд╕ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛рдПрдЧрд╛ред

рдпрд╣рд╛рдВ рдПрдХ рдЖрд░реЗрдЦ рд╣реИ рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛:



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

рд╣рдо рд╕рднреА рдХреЛ рдПрдорд╡реАрдЖрдИ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВред

рдЖрдо рдХреЛрдб


рдпреЛрдЬрдирд╛


  1. рд╣рдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдПрдВрдЧреЗ рдЬрд┐рд╕рдХрд╛ рдХрд╛рдо рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдХреА рдЫрд╡рд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реИред
  2. рдпреВрдЖрдИ рд╣рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдо рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрд╛рд╣рд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред
  3. рд╣рдо рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдореБрдЦреМрдЯрд╛ рдХреЗ рдкреАрдЫреЗ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЫрд┐рдкрд╛рдПрдВрдЧреЗред

Kittenstore


рдЪрд▓реЛ рдореБрдЦреНрдп рдмрд╛рдд рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ - рдПрдХ рдмрд┐рд▓реНрд▓реА рдХрд╛ рдмрдЪреНрдЪрд╛ рдмрдирд╛рдПрдВ рдЬреЛ рдЫрд╡рд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЛ рд▓реЛрдб рдХрд░реЗрдЧрд╛:

рдЖрдВрддрд░рд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд┐рдЯрдирд╕реНрдЯреЛрд░ : рд╕реНрдЯреЛрд░ < рдЖрд╢рдп , рд░рд╛рдЬреНрдп > {
рд╕реАрд▓ рд╡рд░реНрдЧ рдЗрд░рд╛рджреЗ {
рдСрдмреНрдЬреЗрдХреНрдЯ рд░реАрд▓реЛрдб : рдЗрд░рд╛рджрд╛ ()
}
рдбреЗрдЯрд╛ рдХреНрд▓рд╛рд╕ рд╕реНрдЯреЗрдЯ (
рд╡реИрд▓ред рд╣реИрдбрд┐рдВрдЧ : рдмреБрд▓рд┐рдпрди = рдЧрд▓рдд ,
рд╡реИрд▓ рдбреЗрдЯрд╛ : рдбреЗрдЯрд╛ = рдбреЗрдЯрд╛ ред рдЫрд╡рд┐рдпрд╛рдБ ()
) {
рд╕реАрд▓ рд╡рд░реНрдЧ рдбреЗрдЯрд╛ {
рдбреЗрдЯрд╛ рд╡рд░реНрдЧ рдЫрд╡рд┐рдпрд╛рдБ ( рд╡реИрд▓ urls : рд╕реВрдЪреА < рд╕реНрдЯреНрд░рд┐рдВрдЧ > = рдЦрд╛рд▓реА рд╕реВрдЪреА ()) : рдбреЗрдЯрд╛ ()
рдСрдмреНрдЬреЗрдХреНрдЯ рддреНрд░реБрдЯрд┐ : рдбреЗрдЯрд╛ ()
}
}
}
рдХрдЪреНрдЪреЗ рджреЗрдЦреЗрдВ MviKmpKittenStoreInterface.kt рджреНрд╡рд╛рд░рд╛ тЭд рдХреЗ рд╕рд╛рде рдХреА рдореЗрдЬрдмрд╛рдиреА рдХреА GitHub


рд╣рдордиреЗ рдЗрд░рд╛рджреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рд░рд╛рдЬреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдЯреЛрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ: рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЖрдВрддрд░рд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдорд╛рд░реЗ KittenStore рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рд╣реИред рд╣рдорд╛рд░рд╛ рдЗрд░рд╛рджрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реИ - рд░реАрд▓реЛрдб, рдпрд╣ рдЫрд╡рд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рд╛рд▓рдд рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ:

  • isLading рдзреНрд╡рдЬ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ;
  • рдбреЗрдЯрд╛ рдкреНрд░реЙрдкрд░реНрдЯреА рджреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд▓реЗ рд╕рдХрддреА рд╣реИ:
    • рдЫрд╡рд┐рдпрд╛рдБ - рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдХреА рдПрдХ рд╕реВрдЪреА;
    • рддреНрд░реБрдЯрд┐ - рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рд╣реИред

рдЕрдм рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕реЗ рдЪрд░рдгреЛрдВ рдореЗрдВ рдХрд░реЗрдВрдЧреЗред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдЦрд╛рд▓реА KittenStoreImpl рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ рдЬреЛ KittenStore рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛:

рдЖрдВрддрд░рд┐рдХ рд╡рд░реНрдЧ KittenStoreImpl (
) : рдмрд┐рд▓реНрд▓реА рдХрд╛ рдмрдЪреНрдЪрд╛ , рдбрд┐рд╕реНрдкреЛрдЬреЗрдмрд▓рд╕реНрдХреЛрдк рджреНрд╡рд╛рд░рд╛ рдбрд┐рд╕реНрдкреЛрдЬреЗрдмрд▓рд╕реНрдХреЛрдк () {
рдУрд╡рд░рд░рд╛рдЗрдб рдордЬрд╝рд╛ onNext ( рдореВрд▓реНрдп : рдЖрд╢рдп ) {
}
рдУрд╡рд░рд░рд╛рдЗрдб рдлрди рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди ( рдСрдмреНрдЬрд░реНрд╡рд░ : рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓рдСрдмреНрдЬрд░реНрд╡рд░ < рд╕реНрдЯреЗрдЯ >) {
}
}
рдХрдЪреНрдЪреЗ рджреЗрдЦреЗрдВ MviKmpKittenStoreImpl1.kt рджреНрд╡рд╛рд░рд╛ тЭд рдХреЗ рд╕рд╛рде рдХреА рдореЗрдЬрдмрд╛рдиреА рдХреА GitHub


рд╣рдордиреЗ рдкрд░рд┐рдЪрд┐рдд рдбрд┐рд╕реНрдкреЛрдЬреЗрдмрд▓рд╕реНрдХреЛрдк рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рджрд╕реНрдпрддрд╛ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рд╣рдореЗрдВ рд╡реЗрдм рд╕реЗ рдЫрд╡рд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдФрд░ JSON рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЗрд╕реА рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ:

рдЖрдВрддрд░рд┐рдХ рд╡рд░реНрдЧ KittenStoreImpl (
рдирд┐рдЬреА рд╡реИрд▓ рдиреЗрдЯрд╡рд░реНрдХ : рдиреЗрдЯрд╡рд░реНрдХ ,
рдирд┐рдЬреА рд╡рд╛рд▓ рдкрд╛рд░реНрд╕рд░ : рдкрд╛рд░реНрд╕рд░
) : KittenStore, DisposableScope by DisposableScope() {
override fun onNext(value: Intent) {
}
override fun subscribe(observer: ObservableObserver<State>) {
}
interface Network {
fun load(): Maybe<String>
}
interface Parser {
рдлрди рдкрд╛рд░реНрд╕ ( json : рд╕реНрдЯреНрд░рд┐рдВрдЧ ) : рд╣реЛ рд╕рдХрддрд╛ рд╣реИ < рд╕реВрдЪреА < рд╕реНрдЯреНрд░рд┐рдВрдЧ >>
}
}
рдХрдЪреНрдЪреЗ рджреЗрдЦреЗрдВ MviKmpKittenStoreImpl2.kt рджреНрд╡рд╛рд░рд╛ тЭд рдХреЗ рд╕рд╛рде рдХреА рдореЗрдЬрдмрд╛рдиреА рдХреА GitHub

рдиреЗрдЯрд╡рд░реНрдХ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ JSON рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдкрд╛рда рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдЧрд╛, рдФрд░ Parser JSON рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░реЗрдЧрд╛ рдФрд░ рдЫрд╡рд┐ рд▓рд┐рдВрдХ рдХреА рд╕реВрдЪреА рд▓реМрдЯрд╛рдПрдЧрд╛ред рдПрдХ рддреНрд░реБрдЯрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╢рд╛рдпрдж рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд┐рдирд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд╣реИред

рдЕрдм рдкреНрд░рднрд╛рд╡ рдФрд░ reducer рдШреЛрд╖рд┐рдд:

рдЖрдВрддрд░рд┐рдХ рд╡рд░реНрдЧ KittenStoreImpl (
рдирд┐рдЬреА рд╡реИрд▓ рдиреЗрдЯрд╡рд░реНрдХ : рдиреЗрдЯрд╡рд░реНрдХ ,
рдирд┐рдЬреА рд╡рд╛рд▓ рдкрд╛рд░реНрд╕рд░ : рдкрд╛рд░реНрд╕рд░
) : KittenStore, DisposableScope by DisposableScope() {
override fun onNext(value: Intent) {
}
override fun subscribe(observer: ObservableObserver<State>) {
}
private fun reduce(state: State, effect: Effect): State =
when (effect) {
is Effect.LoadingStarted -> state.copy(isLoading = true)
is Effect.LoadingFinished -> state.copy(isLoading = false, data = State.Data.Images(urls = effect.imageUrls))
is Effect.LoadingFailed -> state.copy(isLoading = false, data = State.Data.Error)
}
private sealed class Effect {
object LoadingStarted : Effect()
data class LoadingFinished(val imageUrls: List<String>) : Effect()
object LoadingFailed : Effect()
}
interface Network {
fun load(): Maybe<String>
}
interface Parser {
рдлрди рдкрд╛рд░реНрд╕ ( json : рд╕реНрдЯреНрд░рд┐рдВрдЧ ) : рд╣реЛ рд╕рдХрддрд╛ рд╣реИ < рд╕реВрдЪреА < рд╕реНрдЯреНрд░рд┐рдВрдЧ >>
}
}
рдХрдЪреНрдЪреЗ рджреЗрдЦреЗрдВ MviKmpKittenStoreImpl3.kt рджреНрд╡рд╛рд░рд╛ тЭд рдХреЗ рд╕рд╛рде рдХреА рдореЗрдЬрдмрд╛рдиреА рдХреА GitHub

рдбрд╛рдЙрдирд▓реЛрдб рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо LoadingStarted рдкреНрд░рднрд╛рд╡ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг isLading рдзреНрд╡рдЬ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдбрд╛рдЙрдирд▓реЛрдб рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдпрд╛ рддреЛ LoadingFinished рдпрд╛ LoadingFailed рдЬрд╛рд░реА рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо isLading рдзреНрд╡рдЬ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рджреВрд╕рд░реЗ рдореЗрдВ, рд╣рдо рдзреНрд╡рдЬ рдХреЛ рднреА рд╕рд╛рдлрд╝ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рддреНрд░реБрдЯрд┐ рд╕реНрдерд┐рддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреНрд░рднрд╛рд╡ рд╣рдорд╛рд░реЗ KittenStore рдХреЗ рдирд┐рдЬреА рдПрдкреАрдЖрдИ рд╣реИрдВред

рдЕрдм рд╣рдо рдбрд╛рдЙрдирд▓реЛрдб рдХреЛ рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:

рдЖрдВрддрд░рд┐рдХ рд╡рд░реНрдЧ KittenStoreImpl (
private val network: Network,
private val parser: Parser
) : KittenStore, DisposableScope by DisposableScope() {
override fun onNext(value: Intent) {
}
override fun subscribe(observer: ObservableObserver<State>) {
}
private fun reload(network: Network, parser: Parser): Observable<Effect> =
network
.load()
.flatMap(parser::parse)
.map(Effect::LoadingFinished)
.observeOn(mainScheduler)
.asObservable()
.defaultIfEmpty(Effect.LoadingFailed)
.startWithValue(Effect.LoadingStarted)
private fun reduce(state: State, effect: Effect): State =
// Omitted code
private sealed class Effect {
// Omitted code
}
interface Network {
fun load(): Maybe<String>
}
interface Parser {
fun parse(json: String): Maybe<List<String>>
}
}
view raw MITKmpKittenStoreImpl4.kt рдХреЛ GitHub рджреНрд╡рд╛рд░рд╛ рд╣реЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛

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

рдЦреИрд░, рдЕрдВрдд рдореЗрдВ, StoreHelper рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ KittenStore рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ:

рдЖрдВрддрд░рд┐рдХ рд╡рд░реНрдЧ KittenStoreImpl (
рдирд┐рдЬреА рд╡реИрд▓ рдиреЗрдЯрд╡рд░реНрдХ : рдиреЗрдЯрд╡рд░реНрдХ ,
рдирд┐рдЬреА рд╡рд╛рд▓ рдкрд╛рд░реНрд╕рд░ : рдкрд╛рд░реНрд╕рд░
) : рдмрд┐рд▓реНрд▓реА рдХрд╛ рдмрдЪреНрдЪрд╛ , рдбрд┐рд╕реНрдкреЛрдЬреЗрдмрд▓рд╕реНрдХреЛрдк рджреНрд╡рд╛рд░рд╛ рдбрд┐рд╕реНрдкреЛрдЬреЗрдмрд▓рд╕реНрдХреЛрдк () {
private val helper = StoreHelper(State(), ::handleIntent, ::reduce).scope()
override fun onNext(value: Intent) {
helper.onIntent(value)
}
override fun subscribe(observer: ObservableObserver<State>) {
helper.subscribe(observer)
}
private fun handleIntent(state: State, intent: Intent): Observable<Effect> =
when (intent) {
is Intent.Reload -> reload(network, parser)
}
private fun reload(network: Network, parser: Parser): Observable<Effect> =
// Omitted code
private fun reduce(state: State, effect: Effect): State =
// Omitted code
private sealed class Effect {
// Omitted code
}
interface Network {
рдордЬрд╝рд╛ рд▓реЛрдб () : рд╣реЛ рд╕рдХрддрд╛ рд╣реИ < рд╕реНрдЯреНрд░рд┐рдВрдЧ >
}
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд╛рд░реНрд╕рд░ {
рдлрди рдкрд╛рд░реНрд╕ ( json : рд╕реНрдЯреНрд░рд┐рдВрдЧ ) : рд╣реЛ рд╕рдХрддрд╛ рд╣реИ < рд╕реВрдЪреА < рд╕реНрдЯреНрд░рд┐рдВрдЧ >>
}
}
рдХрдЪреНрдЪреЗ рджреЗрдЦреЗрдВ MviKmpKittenStoreImpl5.kt рджреНрд╡рд╛рд░рд╛ тЭд рдХреЗ рд╕рд╛рде рдХреА рдореЗрдЬрдмрд╛рдиреА рдХреА GitHub

рд╣рдорд╛рд░рд╛ рдХрд┐рдЯрдирд╕реНрдЯреЛрд░ рддреИрдпрд╛рд░ рд╣реИ! рд╣рдо рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред

Kittenview


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ:

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ KittenView : MviView < рдореЙрдбрд▓ , рдИрд╡реЗрдВрдЯ > {
рдбреЗрдЯрд╛ рд╡рд░реНрдЧ рдореЙрдбрд▓ (
рд╡реИрд▓ред рд╣реИрдбрд┐рдВрдЧ : рдмреБрд▓рд┐рдпрди ,
рд╡реИрд▓ рдИрд╢рд░ : рдмреБрд▓рд┐рдпрди ,
рд╡реИрд▓ рдЗрдореЗрдЬрд░рд▓реНрд╕ : рд╕реВрдЪреА < рд╕реНрдЯреНрд░рд┐рдВрдЧ >
)
рд╕реАрд▓ рд╡рд░реНрдЧ рдШрдЯрдирд╛ {
рдСрдмреНрдЬреЗрдХреНрдЯ рддрд╛рдЬрд╝рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ : рдШрдЯрдирд╛ ()
}
}
рдХрдЪреНрдЪреЗ рджреЗрдЦреЗрдВ MviKmpKittenViewInterface.kt рджреНрд╡рд╛рд░рд╛ тЭд рдХреЗ рд╕рд╛рде рдХреА рдореЗрдЬрдмрд╛рдиреА рдХреА GitHub

рд╣рдордиреЗ рд▓реЛрдб рдФрд░ рддреНрд░реБрдЯрд┐ рдЭрдВрдбреЗ рдФрд░ рдЫрд╡рд┐ рд▓рд┐рдВрдХ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдПрдХ рджреГрд╢реНрдп рдореЙрдбрд▓ рдХреА рдШреЛрд╖рдгрд╛ рдХреАред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рдШрдЯрдирд╛ рд╣реИ - RefreshTriggeredред рдпрд╣ рд╣рд░ рдмрд╛рд░ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕реА рдЕрдкрдбреЗрдЯ рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред KittenView рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рд╣реИред

KittenDataSource


рдЗрд╕ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХрд╛ рдХрд╛рд░реНрдп рд╡реЗрдм рд╕реЗ JSON рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдкрд╛рда рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╣реИред рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ:

рдЖрдВрддрд░рд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ KittenDataSource {
рдордЬрд╝рд╛ рд▓реЛрдб ( рд╕реАрдорд╛ : рдЗрдВрдЯ , рдСрдлрд╕реЗрдЯ : рдЗрдВрдЯ ) : рд╢рд╛рдпрдж < рд╕реНрдЯреНрд░рд┐рдВрдЧ >
}
рдХрдЪреНрдЪреЗ рджреЗрдЦреЗрдВ MviKmpKittenDataSourceInterface.kt рджреНрд╡рд╛рд░рд╛ тЭд рдХреЗ рд╕рд╛рде рдХреА рдореЗрдЬрдмрд╛рдиреА рдХреА GitHub

рдкреНрд░рддреНрдпреЗрдХ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╕реЗ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрдкреЗрдХреНрд╖рд╛ / рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдХрд╛рд░рдЦрд╛рдирд╛ рд╡рд┐рдзрд┐ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдЖрдВрддрд░рд┐рдХ рдЙрдореНрдореАрдж рдордЬрд╝рд╛ KittenDataSource () : KittenDataSource
рдХрдЪреНрдЪреЗ рджреЗрдЦреЗрдВ MviKmpKittenDataSourceFactory.kt рджреНрд╡рд╛рд░рд╛ тЭд рдХреЗ рд╕рд╛рде рдХреА рдореЗрдЬрдмрд╛рдиреА рдХреА GitHub

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

рдПрдХреАрдХрд░рдг


рдЕрдВрддрд┐рдо рдЪрд░рдг рд╕рднреА рдШрдЯрдХреЛрдВ рдХрд╛ рдПрдХреАрдХрд░рдг рд╣реИред

рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

рдЖрдВрддрд░рд┐рдХ рд╡рд░реНрдЧ KittenStoreNetwork (
рдирд┐рдЬреА рд╡реИрд▓ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд : рдмрд┐рд▓реНрд▓реА рдХрд╛ рдмрдЪреНрдЪрд╛ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд
) : рдмрд┐рд▓реНрд▓реА рдХрд╛ рдмрдЪреНрдЪрд╛ StoreImpl ред рдиреЗрдЯрд╡рд░реНрдХ {
рдордЬрд╝реЗрджрд╛рд░ рднрд╛рд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВ () : рд╣реЛ рд╕рдХрддрд╛ рд╣реИ < string > = dataSource.load (рд╕реАрдорд╛ = 50 , рдСрдлрд╕реЗрдЯ = 0 )
}
рдХрдЪреНрдЪреЗ рджреЗрдЦреЗрдВ KittenStoreNetwork.kt рджреНрд╡рд╛рд░рд╛ тЭд рдХреЗ рд╕рд╛рде рдХреА рдореЗрдЬрдмрд╛рдиреА рдХреА GitHub


рдкрд╛рд░реНрд╕рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

рдЖрдВрддрд░рд┐рдХ рд╡рд╕реНрддреБ KittenStoreParser : KittenStoreImpl ред рдкрд╛рд░реНрд╕рд░ {
рдлрди рдкрд╛рд░реНрд╕ ( рдЬрд░реНрд╕рди : рд╕реНрдЯреНрд░рд┐рдВрдЧ ) рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВ : рд╣реЛ рд╕рдХрддрд╛ рд╣реИ < рд╕реВрдЪреА < рд╕реНрдЯреНрд░рд┐рдВрдЧ >> =
рд╢рд╛рдпрджFromFunction {
Json ( JsonConfiguration ред Stable )
.parseJson (json)
.jsonArray
.map {it.jsonObject.getPrimitive ( " url " ) .content}
}
.subscribeOn (рд╕рдВрдЧрдгрдирд╛ рд▓реЗрдЦрдХ)
.onErrorComplete ()
}
рдХрдЪреНрдЪреЗ рджреЗрдЦреЗрдВ KittenStoreParser.kt рдХреЛ GitHub рджреНрд╡рд╛рд░рд╛ рд╣реЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛

рдпрд╣рд╛рдБ рд╣рдордиреЗ kotlinx.serialization рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ ред рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдореБрдЦреНрдп рд╕реВрддреНрд░ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдЧрдгрдирд╛ рдЕрдиреБрд╕реВрдЪрдХ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд░рд╛рдЬреНрдп рдХреЛ рдореЙрдбрд▓ рдореЗрдВ рдмрджрд▓реЗрдВ:

рдЖрдВрддрд░рд┐рдХ рдордЬрд╝рд╛ рд░рд╛рдЬреНрдпред .рдореЙрдбрд▓ () : рдореЙрдбрд▓ =
рдореЙрдбрд▓ (
isLoading = isLading,
isError = рдЬрдм ( рдбреЗрдЯрд╛ ) {
рд╣реИ рд░рд╛рдЬреНрдп ред рдбреЗрдЯрд╛ ред рдЪрд┐рддреНрд░ - > рдЕрд╕рддреНрдп
рд╣реИ рд░рд╛рдЬреНрдп ред рдбреЗрдЯрд╛ ред рддреНрд░реБрдЯрд┐ - > рд╕рддреНрдп
},
imageUrls = рдЬрдм ( рдбреЗрдЯрд╛ ) {
рд╣реИ рд░рд╛рдЬреНрдп ред рдбреЗрдЯрд╛ ред рдЪрд┐рддреНрд░ - > рдбреЗрдЯрд╛ .urls
рд╣реИ рд░рд╛рдЬреНрдп ред рдбреЗрдЯрд╛ ред рддреНрд░реБрдЯрд┐ - > рд░рд┐рдХреНрдд рд╕реВрдЪреА ()
}
)
рдХрдЪреНрдЪреЗ рджреЗрдЦреЗрдВ MITKmpStateToModel.kt рдХреЛ GitHub рджреНрд╡рд╛рд░рд╛ рд╣реЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛

рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЗрд░рд╛рджреЛрдВ рдореЗрдВ рдмрджрд▓реЗрдВ:

рдЖрдВрддрд░рд┐рдХ рдордЬрд╝рд╛ рдШрдЯрдирд╛ред рдЕрдиреБрдкрд╕реНрдерд┐рдд () : рдЖрд╢рдп =
рдЬрдм ( рдпрд╣ ) {
рд╣реИ рдШрдЯрдирд╛ ред RefreshTriggered - > рдЖрд╢рдп ред рдкреБрдирдГ рд▓реЛрдб рдХрд░реЗрдВ
}
рдХрдЪреНрдЪреЗ рджреЗрдЦреЗрдВ MviKmpEventToIntent.kt рджреНрд╡рд╛рд░рд╛ тЭд рдХреЗ рд╕рд╛рде рдХреА рдореЗрдЬрдмрд╛рдиреА рдХреА GitHub

рдореБрдЦреМрдЯрд╛ рддреИрдпрд╛рд░реА:

рд╡рд░реНрдЧ KittenComponent {
рдордЬрд╝рд╛ onViewCreated ( рджреЗрдЦреЗрдВ : KittenView ) {
}
рдордЬрд╝рд╛ onStart () {
}
рдордЬрд╝рд╛ onStop () {
}
рдордЬрд╝рд╛ onViewDestroyed () {
}
рдордЬрд╝рд╛ onDestroy () {
}
}
рдХрдЪреНрдЪреЗ рджреЗрдЦреЗрдВ MviKmpKittenComponent1.kt рджреНрд╡рд╛рд░рд╛ тЭд рдХреЗ рд╕рд╛рде рдХреА рдореЗрдЬрдмрд╛рдиреА рдХреА GitHub

рдХрдИ Android рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдЪрд┐рддред рдпрд╣ iOS рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╣рд▓реВ рдХреЗ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЗ рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдХреНрд░рдордг рдХрд╛ рдЖрд░реЗрдЦ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ: рдореИрдВ


рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╕рдордЭрд╛рдКрдВрдЧрд╛ рдХрд┐ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ:

  • рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдСрдирдХреНрд░реИрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рдж - рдСрди рд╡реНрдпреВрдХреНрд░рд┐рдПрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛, рдФрд░ рдлрд┐рд░ - рдСрдирд╕реНрдЯрд╛рд░реНрдЯ: рдпрд╣ рдХрд╛рд░реНрдпрд╢реАрд▓ рд╕реНрдерд┐рддрд┐ (рд╢реБрд░реВ) рдореЗрдВ рдореБрдЦреМрдЯрд╛ рдбрд╛рд▓рддрд╛ рд╣реИ;
  • рдЗрд╕рдХреЗ рдмрд╛рдж рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, onStop рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ: рдпрд╣ рдореБрдЦреМрдЯрд╛ рдХреЛ рдПрдХ рдмрдВрдж рдЕрд╡рд╕реНрдерд╛ (рд░реЛрдХрд╛) рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реИ;
  • рдПрдХ рд░реЛрдХрд╛ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рджреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: onStart рдпрд╛ onViewDestroyed, рдЕрд░реНрдерд╛рдд, рдпрд╛ рддреЛ рдореБрдЦреМрдЯрд╛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдЗрд╕рдХрд╛ рджреГрд╢реНрдп рдирд╖реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ;
  • рдЬрдм рджреГрд╢реНрдп рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╛ рддреЛ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (onViewCreated), рдпрд╛ рдкреВрд░реЗ рдореБрдЦреМрдЯрд╛ рдХреЛ рдирд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (onDestroy)ред

рдореБрдЦреМрдЯрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ:

рд╡рд░реНрдЧ KittenComponent {
рдирд┐рдЬреА рд╡реИрд▓ рд╕реНрдЯреЛрд░ =
KittenStoreImpl (
network = KittenStoreNetwork (dataSource = KittenDataSource ()),
parser = KittenStoreParser
)
рдирд┐рдЬреА var рджреГрд╢реНрдп : KittenView = рдЕрд╢рдХреНрдд
рдирд┐рдЬреА var startStopScope : рдбрд┐рд╕реНрдкреЛрдЬреЗрдмрд▓рд╕реНрдХреЛрдк? = рдЕрд╢рдХреНрдд
рдордЬрд╝рд╛ onViewCreated ( рджреЗрдЦреЗрдВ : KittenView ) {
рдпрд╣ .view = рджреГрд╢реНрдп
}
fun onStart() {
val view = requireNotNull(view)
startStopScope = disposableScope {
store.subscribeScoped(onNext = view::render)
view.events.map(Event::toIntent).subscribeScoped(onNext = store::onNext)
}
}
fun onStop() {
startStopScope?.dispose()
}
fun onViewDestroyed() {
view = null
}
fun onDestroy() {
store.dispose()
}
}

рдпрд╣ рдХрд╛рдо рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ:

  • рдкрд╣рд▓реЗ рд╣рдо рдмрд┐рд▓реНрд▓реА рдХреЗ рдмрдЪреНрдЪреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ;
  • onViewCreated рдкрджреНрдзрддрд┐ рдореЗрдВ рд╣рдореЗрдВ KittenView рдХрд╛ рд▓рд┐рдВрдХ рдпрд╛рдж рд╣реИ;
  • onStart рдореЗрдВ рд╣рдо рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП KittenStore рдФрд░ KittenView рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рддреЗ рд╣реИрдВ;
  • onStop рдореЗрдВ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рджрд░реНрдкрдг;
  • onViewDestroyed рдореЗрдВ рд╣рдо рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рддреЗ рд╣реИрдВ;
  • onDestroy рдореЗрдВ, KittenStore рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрдВред

рдирд┐рд╖реНрдХрд░реНрд╖


рдХреЛрдЯрд▓рд┐рди рдорд▓реНрдЯреАрдкреНрд▓реЗрдпрд░ рдореЗрдВ рдореЗрд░реА рдПрдорд╡реАрдЖрдИ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдпрд╣ рдкрд╣рд▓рд╛ рд▓реЗрдЦ рдерд╛ред рдЗрд╕рдореЗрдВ рд╣рдо:

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

рд╣рдорд╛рд░реЗ рд╕рд╛рдорд╛рдиреНрдп рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЧреБрдгреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ:

  • рд╣рдордиреЗ UI рдХреЛрдб рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдХреЛрдб рдХреЛ рдорд▓реНрдЯреАрдкреНрд▓рд╛рдпрд░ рд░рд┐рдХреЙрд░реНрдбрд░ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛; рд╕рднреА рддрд░реНрдХ, рдкреНрд▓рд╕ рддрд░реНрдХ рдФрд░ рдпреВрдЖрдИ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдФрд░ рд░реВрдкрд╛рдВрддрд░рдг рдЖрдо рд╣реИрдВ;
  • рддрд░реНрдХ рдФрд░ рдпреВрдЖрдИ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ;
  • рдпреВрдЖрдИ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЖрдиреЗ рд╡рд╛рд▓реЗ рджреГрд╢реНрдп рдореЙрдбрд▓ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдФрд░ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ;
  • рдореЙрдбреНрдпреВрд▓ рдПрдХреАрдХрд░рдг рднреА рд╕рд░рд▓ рд╣реИ: рдЖрдк рд╕рднреА рдХреА рдЬрд░реВрд░рдд рд╣реИ:
    • KittenView рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдкреНрд░реЛрдЯреЛрдХреЙрд▓) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛;
    • KittenComponent рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВ;
    • рд╕рд╣реА рд╕рдордп рдкрд░ рдЙрд╕рдХреЗ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдмреБрд▓рд╛рдУ;
  • рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрд░рдПрдХреНрд╕ (рдпрд╛ рдХреЛрд░рдЯрд╛рдЗрди) рдХреЗ "рдкреНрд░рд╡рд╛рд╣" рдХреЛ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдореЗрдВ рдмрдЪрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЖрд╡реЗрджрди рд╕реНрддрд░ рдкрд░ рдХрд┐рд╕реА рднреА рд╕рджрд╕реНрдпрддрд╛ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ;
  • рд╕рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрдХреНрд╖рд╛рдПрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдкрд░реАрдХреНрд╖рдг рджреНрд╡рд╛рд░рд╛ рдЕрдореВрд░реНрдд рд╣реИрдВред

рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдореИрдВ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ KittenComponent рдПрдХреАрдХрд░рдг iOS рдФрд░ Android рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдЯреНрд╡рд┐рдЯрд░

рдкрд░ рдореБрдЭреЗ рдлреЙрд▓реЛ рдХрд░реЗрдВ рдФрд░ рдЬреБрдбрд╝реЗ рд░рд╣реЗрдВ!

All Articles