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) {
рд╕рд╛рде рд╣реА, рдЗрд╕ рд░рд┐рдбреНрдпреВрд╕рд░ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
Reducer<ClickerState> buildClickerReducer() { asReducer({ Actions.increase: (state, action) => state.clone() ..count = state.count + action.payload,
рдХрд╛рд░реНрдп
рдХрд╛рд░реНрд░рд╡рд╛рдИ - рдлрд┐рд╢рд░реЗрдбрдХреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рдЬрд┐рд╕рдореЗрдВ рджреЛ рдлрд╝реАрд▓реНрдб рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
Object type
- рдПрдХреНрд╢рди рдкреНрд░рдХрд╛рд░, рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдПрдирдо рдСрдмреНрдЬреЗрдХреНрдЯ
dynamic payload
- рдПрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░, рд╡реИрдХрд▓реНрдкрд┐рдХред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
enum Actions { increase }
рд░рд╛рдп
рддрд░реНрдХ рддреИрдпрд╛рд░ рд╣реИ, рдпрд╣ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рджреГрд╢реНрдп рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐, рдкреНрд░реЗрд╖рдг, 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;
рдкреЗрдЬ
рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рдкреЗрдЬ <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;
рд╡рд╣ рд╕рдм рд╣реИред рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ:
class MainPage extends Page<MainState, void> { MainPage(): super( initState: MainState.initState, dependencies: Dependencies( slots: { 'clicker': ClickerComponent().asDependent(ClickerConnector()),
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдм рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЛ 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)); }
рд╕рднреА рдлрд╝рд╛рдЗрд▓-рдЕрд▓рдЧ рдХреЛрдб рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИ ред рд╕реНрдкрдВрджрди рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд╛рд╕ рдЕрдиреБрднрд╡ рд╣реИред