рдлрд┐рд╢ рд░рд┐рдбрдХреНрд╕ - рд╕реНрдкрдВрджрди рдХреЗ рд▓рд┐рдП рдиреНрдпреВ рд░реЗрдбрдХреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА

2018 рдХреЗ рдЕрдВрдд рдореЗрдВ, Google рдиреЗ рдУрдкрди-рд╕реЛрд░реНрд╕ рд╕рдореБрджрд╛рдп рдХреА рдорджрдж рд╕реЗ, рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдореЛрдмрд╛рдЗрд▓ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдлреНрд░реЗрдорд╡рд░реНрдХ рдлрд╝реНрд▓рдЯрд░ рдХреЗ рдкрд╣рд▓реЗ рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЬрд╛рд░реА рдХрд░рдХреЗ рдореЛрдмрд╛рдЗрд▓ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд╛рдирджрд╛рд░ рдЙрдкрд╣рд╛рд░ рдмрдирд╛рдпрд╛ред


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


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


рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреБрдЫ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рдкрд╣рд▓реА рдмрд╛рд░ рдлрд┐рд╢ рд░реЗрдбрдХреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдиреЗ рджреЗрдЦрд╛ рдерд╛, рдЬрд┐рд╕реЗ рдЕрд▓реАрдмрд╛рдмрд╛ рдХреЗ рдирд╛рдо рд╕реЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдХреБрдЫ рд╣реА рд╕рдордп рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдХрд╛рдлреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдорд┐рд▓реА, рдкрд╣рд▓реЗ рд╣реА рджрд┐рди рдмреНрд░рд╛рдпрди рдХреЗ рд╕рд┐рддрд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдФрд░ рджреВрд╕рд░реЗ рджрд┐рди рдпрд╣ рдЙрд╕рд╕реЗ рджреЛ рдЧреБрдирд╛ рдЖрдЧреЗ рдерд╛ред


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


рддреЛ рдХреНрдпрд╛ рдмреНрд░рд╛рдпрди рдХреЗ Fish'a рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмреАрдЪ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рд╣реИ? рд╕реНрдкрдВрджрди Redux рдПрдХ рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рдврд╛рдВрдЪрд╛ рд╣реИред рдордЫрд▓реА рдПрдХ рдЖрд╡реЗрджрди рдврд╛рдВрдЪрд╛ рд╣реИ рдЬреЛ рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рдХреЗ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдиреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ Redux рдбрд╛рд▓рддрд╛ рд╣реИред рдпрд╛рдиреА рдордЫрд▓реА рдХреБрдЫ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рддреА рд╣реИ рдФрд░ state management рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИред


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


рдШрдЯрдХ рдореЗрдВ Reducer, рдкреНрд░рднрд╛рд╡ рдФрд░ рджреГрд╢реНрдп рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз


рдЫрд╡рд┐


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

рд░рд╛рдЬреНрдп


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдХреНрд▓рд┐рдХрд░ рд▓реЗрдВред рдЙрд╕рдХреЗ рд░рд╛рдЬреНрдп рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╣реЛрдиреЗ рджреЗрдВ - рдЧрд┐рдирддреА, рдЬреЛ рдХреНрд▓рд┐рдХреЛрдВ рдХреА рд╕рд╣реА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдЧрд╛ред


 class ClickerState implements Cloneable<ClickerState> { int count = 0; @override ClickerState clone() { return ClickerState() ..count = count; } } 

рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп, рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрд▓реЛрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рд░рд╛рдЬреНрдп рдХреА рдкреНрд░рддрд┐рд░рдХреНрд╖рд╛ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрдирд╛рдП рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдЬрдм рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рд░рд╛рдЬреНрдп рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЖрдк рдмрд╕ clone() рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдХрдо рдХрд░рдиреЗ


Reducer рдХрд╛ рд╕рд╛рд░ рдПрдХ рдирдИ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдХреЗ рдХреБрдЫ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдирд╛ рд╣реИред рд░рд┐рдбреНрдпреВрд╕рд░ рдХреЛ рдХреЛрдИ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред


рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд░реЗрдбреНрдпреВрд╕рд░ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХреНрд╢рди (рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдХрдо) рдХреЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рдХреБрдЫ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЧрдгрдирд╛ рдмрдврд╝рд╛рдПрдЧрд╛ред


 ClickerState clickerReducer(ClickerState state, Action action) { //        Action,      . if (action.type == Actions.increase) { // ..       ,   ,       Count. return state.clone() ..count = state.count + action.payload; //        /payload/ count. // payload   . } // if (action.type == ...) { ... } //        . return state; } 

рд╕рд╛рде рд╣реА, рдЗрд╕ рд░рд┐рдбреНрдпреВрд╕рд░ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 Reducer<ClickerState> buildClickerReducer() { asReducer({ Actions.increase: (state, action) => state.clone() ..count = state.count + action.payload, //Actions.anotherAction: ... }); } 

рдХрд╛рд░реНрдп


рдХрд╛рд░реНрд░рд╡рд╛рдИ - рдлрд┐рд╢рд░реЗрдбрдХреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рдЬрд┐рд╕рдореЗрдВ рджреЛ рдлрд╝реАрд▓реНрдб рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
Object type - рдПрдХреНрд╢рди рдкреНрд░рдХрд╛рд░, рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдПрдирдо рдСрдмреНрдЬреЗрдХреНрдЯ
dynamic payload - рдПрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░, рд╡реИрдХрд▓реНрдкрд┐рдХред


рдПрдХ рдЙрджрд╛рд╣рд░рдг:


 enum Actions { increase } //     class ActionsCreate { //      static Action increase(int value) => Action(Actions.increase, payload: value); } 

рд░рд╛рдп


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


рдкреНрд░реЗрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ: рдПрдХ рдХреНрд░рд┐рдпрд╛, рдЬрд┐рд╕рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдерд╛ред
ViewService рдореЗрдВ рд╡рд░реНрддрдорд╛рди BuildContext (рдорд╛рдирдХ рд╕реНрдкрдВрджрди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ) рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВред


рдПрдХ рдЙрджрд╛рд╣рд░рдг:


 Widget clickerView(ClickerState state, Dispatch dispatch, ViewService viewService) { return RaisedButton( child: Text(state.count.toString()), onPressed: () => dispatch(ActionsCreate.increase(1)) //         ); } 

рдЕрдВрдЧ


рд╣рдо рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЛ рдЗрд╕ рд╕рдм рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВрдЧреЗ:


 class ClickerComponent extends Component<ClickerState> { ClickerComponent() : super( reducer: clickerReducer, view: clickerView, ); } 

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


рдкреНрд░рднрд╛рд╡ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрджрд╛рд╣рд░рдг
 import 'package:http/http.dart' as http; //   http   Effect<ClickerState> clickerEffect() { return combineEffects({ Actions.increaseRandomly: increaseRandomly, }); } Future<void> increaseRandomly(Action action, Context<ClickerState> context) async { final response = await http.read('https://www.random.org/integers/?num=1&min=1&max=10&col=1&base=10&format=plain'); //   random.org.      1  10. final value = int.parse(response); context.dispatch(ActionsCreate.increase(value)); } //   increaseRandomly enum Actions { increase, /* new */ increaseRandomly } class ActionsCreate { static Action increase(int value) => Action(Actions.increase, payload: value); static Action increaseRandomly() => const Action(Actions.increaseRandomly); // new } //  ,        . Widget clickerView(ClickerState state, Dispatch dispatch, ViewService viewService) { return Column( mainAxisSize: MainAxisSize.min, children: [ RaisedButton( //   child: Text(state.count.toString()), onPressed: () => dispatch(ActionsCreate.increase(1)) ), RaisedButton( //  child: const Text('Increase randomly'), onPressed: () => dispatch(ActionsCreate.increaseRandomly()) ), ] ); } //     class ClickerComponent extends Component<ClickerState> { ClickerComponent() : super( reducer: clickerReducer, view: clickerView, effect: clickerEffect() ); } 

рдкреЗрдЬ


рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рдкреЗрдЬ <T, P> рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреГрд╖реНрда рдореЗрдВ рджреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝реАрд▓реНрдб рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
T initState(P params) - рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдкреЗрдЬ рдмрдирдиреЗ рдкрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
List<Middleware<T>> middleware - List<Middleware<T>> middleware рдПрдХ рд╕реВрдЪреА - рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЬрд┐рд╕реЗ рд░реАрдбреНрдпреВрд╕рд░ рдХреЗ рд╕рдордХреНрд╖ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдФрд░ рдпрд╣ рднреА рдПрдХ рд╡рд┐рдзрд┐:
Widget buildPage(P params) - рдЬреЛ рдкреГрд╖реНрда рдХреЛ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рдПрдХрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред


рдЖрдЗрдП рдЖрд╡реЗрджрди рдХрд╛ рдореБрдЦреНрдп рдкреГрд╖реНрда рдмрдирд╛рдПрдБ:


 class MainPage extends Page<void, void> { MainPage(): super( initState: (dynamic param) {}, view: (state, dispatch, viewService) => Container(), ); } 

рдПрдХ рдкреГрд╖реНрда рдПрдХ рдШрдЯрдХ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ reducer, рдкреНрд░рднрд╛рд╡, рдФрд░ рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдирд┐рдпрдорд┐рдд рдШрдЯрдХ рд╣реИред


рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдПрдХ рд░рд┐рдХреНрдд рдкреГрд╖реНрда рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рди рддреЛ рд░рд╛рдЬреНрдп рд╣реИ, рди рд╣реА reducers рдпрд╛ рдкреНрд░рднрд╛рд╡ред рд╣рдо рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдареАрдХ рдХрд░ рджреЗрдВрдЧреЗред


рдпрд╣ рд╕рдм рдХреБрдЫ рдЕрд▓рдЧ рд░реВрдк рдореЗрдВ рд╣реИ рдФрд░ рдмреНрд░рд╛рдпрди рдПрдЧрди рдХреЗ рд╕реНрдкрдВрджрди рд░реЗрдбрдХреНрд╕ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд░реЗрдбрдХреНрд╕ рдХреЗ рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╣реИред рдЪрд▓реЛ рдирдИ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ - рдирд┐рд░реНрднрд░рддрд╛рдПрдВред


рдирд┐рд░реНрднрд░рддрд╛


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


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд░рд╛рдЬреНрдп рдХреЛ рд╣рдорд╛рд░реЗ рдкреЗрдЬ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:


 class MainState implements Cloneable<MainState> { ClickerState clicker; @override MainState clone() { return MainState() ..clicker = clicker; } static MainState initState(dynamic params) { return MainState() ..clicker = ClickerState(); } } 

рдЕрдм рд╣рдо рдХрдиреЗрдХреНрдЯрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:


 class ClickerConnector extends ConnOp<MainState, ClickerState> { @override ClickerState get(MainState state) => state.clicker; //        . @override void set(MainState state, ClickerState subState) => state.clicker = subState; } 

рд╡рд╣ рд╕рдм рд╣реИред рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ:


 class MainPage extends Page<MainState, void> { MainPage(): super( initState: MainState.initState, dependencies: Dependencies( slots: { 'clicker': ClickerComponent().asDependent(ClickerConnector()), //    // 'clicker': ClickerComponent() + ClickerConnector(), }, ), view: (state, dispatch, viewService) { //   clicker-. final clickerWidget = viewService.buildComponent('clicker'); return Scaffold( body: Column( mainAxisAlignment: MainAxisAlignment.center, mainAxisSize: MainAxisSize.max, children: [ Center( child: clickerWidget, //   ) ], ) ); }, ); } 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдм рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЛ main.dart рдЬреЛрдбрд╝рдХрд░ рдПрдХ рдкреВрд░реНрдг рдХрд╛рд░реНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 void main() => runApp(MyApp()); class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { @override Widget build(BuildContext context) => MaterialApp(home: MainPage().buildPage(null)); } 

рд╕рднреА рдлрд╝рд╛рдЗрд▓-рдЕрд▓рдЧ рдХреЛрдб рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИ ред рд╕реНрдкрдВрджрди рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд╛рд╕ рдЕрдиреБрднрд╡ рд╣реИред

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


All Articles