bobaflu - рд╕реНрдкрдВрджрди рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕рд╛рдорд╛рди


рдпрд╣ рд▓реЗрдЦ рдлрд╝реНрд▓рдЯрд░ рдореЛрдмрд╛рдЗрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛрдЧрд╛ред


рдХреМрди рд╕рд╛ рдореЛрдмрд╛рдЗрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ?


рдкрд┐рдЫрд▓реЗ рдкреНрд░рдХрд╛рд╢рди рдиреЗ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕рд╛рдорд╛рди рдХреА рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛:
boboskit - рдПрдХреНрд╕реЗрд╕рд░реАрдЬрд╝, dnssd рдФрд░ WebSocket ред


рдПрдХ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЧреМрдг рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд╕реНрддреБ рд╣реИред рд▓рд╛рдЗрдЯ рдмрд▓реНрдм, рд╕реНрд╡рд┐рдЪ, рд╕реАрдбреА / рдХреИрд╕реЗрдЯ рдкреНрд▓реЗрдпрд░, рд░реЗрдбрд┐рдпреЛ рдкреНрд▓реЗрдпрд░, рдерд░реНрдореЛрд╕реНрдЯреЗрдЯ, рддрд╛рдкрдорд╛рди рд╕реЗрдВрд╕рд░, рдореЛрд╢рди рд╕реЗрдВрд╕рд░, рдЖрджрд┐ ... рд╕рд╛рдорд╛рди рдХрд╛ рдПрдХ рд╕реЗрдЯ рдХрд▓реНрдкрдирд╛ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдХрдо рд╕реЗ рдХрдо рд╢рддрд░рдВрдЬ рдХреА рдмрд┐рд╕рд╛рдд рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдмреЛрд░реНрдб рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рдлрд╝реАрд▓реНрдб ( control ) move рд╣реЛрддреА рд╣реИ, рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ { from: "e2", to: "e4" } , рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛ рдлрд╝реАрд▓реНрдбреНрд╕, рдФрд░ рдлрд╝рд┐рдЧрд░ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рд▓реЗ рдЬрд╛рддреА рд╣реИ ... рдПрдХреНрд╕реЗрд╕рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ move рдлрд╝реАрд▓реНрдб рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧреАред рдирд┐рд░реНрдгрдп рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдВрдХрдбрд╝рд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдФрд░ рдкреВрд░реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЖрдВрдХрдбрд╝реЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреА (рдпрд╛ рдирд╣реАрдВ)ред


рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдиреНрдпреВрдирддрдо рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╡рд╛рд▓реЗ рд╕рд╣рд╛рдпрдХ рдЙрдкрдХрд░рдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ: "рд╕реНрд╡рд┐рдЪ", "рддрд╛рдкрдорд╛рди рд╕реЗрдВрд╕рд░", "рдерд░реНрдореЛрд╕реНрдЯреИрдЯ", "рд░реЗрдбрд┐рдпреЛ рдкреНрд▓реЗрдпрд░"ред


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


рддреЛ bobaoskit.worker рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдХрдВрдкреНрдпреВрдЯрд░ рдХреА рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХреНрд╕реЗрд╕рд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдореМрдЬреВрдж рд╣реИрдВ, рдЖрдк рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ WebSocket рдкреЛрд░реНрдЯ рдкрд░ JSON рдЕрдиреБрд░реЛрдз рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдиреЗ рд╡рд╛рд▓реА рдШрдЯрдирд╛рдУрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред


рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдпрд╛ред


рдХреНрдпреЛрдВ рдмрд╣рддрд╛ рд╣реИ?


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


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


рдирддреАрдЬрддрди, рдореИрдВ рддрдм (2016 рдХреЗ рдЕрдВрдд) рдХрд┐рд╕реА рднреА рдирд┐рд░реНрдгрдп рд╕реЗ рдЬреБрдбрд╝рд╛ рдирд╣реАрдВ рдерд╛ред рд╢рд╛рдпрдж рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдирд╣реАрдВ рдерд╛, рд╢рд╛рдпрдж рдЕрдиреНрдп рдХрд╛рд░рдгреЛрдВ рд╕реЗред


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


рдЗрд╕реА рд╕рдордп, рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рд╛рдордЧреНрд░реА рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ flutter рдмрд╛рд░реЗ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреАред рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ред рд╕реНрдерд╛рдкрдирд╛ рд╕рд░рд▓ рд╣реИ: git clone рдФрд░ PATH рдЬреЛрдбрд╝реЗрдВред рдмрд╛рдХреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдВрдбреНрд░реЙрдЗрдб рдПрд╕рдбреАрдХреЗ / рдПрдХреНрд╕рдХреЛрдб рд╕реЗрдЯ рдХрд░ рд░рд╣рд╛ рд╣реИ (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдВрдбреНрд░реЙрдЗрдб рдПрд╕рдбреАрдХреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд╕реЗрдЯ рд╣реИред рдореИрдВ iOS рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╕рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдПрдХ рдореИрдХрдУрдПрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╣реАрдВ рд╣реВрдВ) рдФрд░ рдбрд╛рд░реНрдЯ рдПрд╕рдбреАрдХреЗ (рдЗрд╕реЗ рдЕрд▓рдЧ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд░реВрд░реА рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдкрдВрджрди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ)ред


рдХрд╛рд░реНрдп рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд / рдпреЛрдЬрдирд╛


  • рдЬрдм рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрд╡реЗрджрди flutter_mdns рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдерд╛рдиреАрдп рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ _bobaoskit._tcp рд╕реЗрд╡рд╛рдУрдВ рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХреЗ рдХрдИ рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВ, рд╕рднреА рдкреНрд░рдХрд╛рд╢рд┐рдд рдПрдХ рд╕реЗ рдЕрдкрдиреА рдЬрдбрд╝реЗрдВ рд▓реЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдбрд╛рд░реНрдЯ рдПрд╕рдбреАрдХреЗ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИ, рдХреНрд░рдорд╢рдГ, рдХрдИ рдХрд╛рдВрдЯреЗ рдФрд░ рдЬреЛрдбрд╝рд╛ рд╕рдВрдЧрддрддрд╛ред рдореИрдВрдиреЗ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЪреБрдирд╛ рдХреНрдпреЛрдВрдХрд┐ рджреВрд╕рд░реЛрдВ рдиреЗ рдПрдХ рд╕рд╛рде рдХрдИ рдЦреЛрдЬреА рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдореЗрдЬрдмрд╛рдиреЛрдВ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ред
    рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдФрд░ рдирд┐рд░реНрдзрд╛рд░рдг (onResolve) рдкрд░, рд╣реЛрд╕реНрдЯ рдХреЛ рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
    рдЦреЛрдЬ рдХреА рдЧрдИ рд╕реЗрд╡рд╛рдУрдВ рдХреА рд╕реВрдЪреА рд╡рд╛рд▓рд╛ рдкреГрд╖реНрда рдХреНрд░рдорд╢рдГ StatefulWidget рд╣реИ, рдЬрдм рд╡рд╣ рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ / setState() {...} , рддреЛ setState() {...} рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
  • рдЬрдм рд╕реВрдЪреА рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдЬрдмрд╛рди рдЪреБрдирддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдирдпрд╛ рдкреГрд╖реНрда рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╣ рднреА StatefulWidget ), рдЬрд┐рд╕рдореЗрдВ рдЪрдпрдирд┐рдд рд╕реЗрд╡рд╛ рдХреЗ host рдФрд░ port рдХреЛ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
    BobaosKit рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрд╡рд╛рдм рдХреЙрд▓рдмреИрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЬрдмрдХрд┐ рдореИрдВрдиреЗ рдЬреНрдпрд╛рджрд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдбрд╛рд░реНрдЯ рдХрд╛ рдЕрдзреНрдпрдпрди рдирд╣реАрдВ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рд╕реНрдХреИрди рдХрд┐рдП рдЧрдП рдкреНрд░рд▓реЗрдЦрди рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, Futures рдЬреЗрдПрд╕ рдореЗрдВ Promise рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИред
    рдЖрдиреЗ рд╡рд╛рд▓реА рдШрдЯрдирд╛рдУрдВ (рдХреЛрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ) рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдбрд╛рд░реНрдЯ рдХреЗ рд▓рд┐рдП EventEmitter ред рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд▓рд┐рдЦрд╛ рд╣реИред

  void registerListener(String name, Function cb) { this._events.add(new BobaosKitCallback(name, cb)); } void removeAllListeners() { this._events = []; } void emitEvent(String name, dynamic params) { // call all listeners List<BobaosKitCallback> foundCallbacks = this._events.where((t) => t.name == name).toList(); foundCallbacks.forEach((f) => f.cb(params)); } ... ... void listen() { this.ws.listen((text) { var json = jsonDecode(text); if (json.containsKey('response_id')) { .... } else { //   response_id -  this.emitEvent(json['method'], json['payload']); } }); } 

рдЖрдиреЗ рд╡рд╛рд▓реА рдШрдЯрдирд╛рдПрдВ - рдпрджрд┐ рдПрдХреНрд╕реЗрд╕рд░реА рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЕрджреНрдпрддрди рд╕реНрдерд┐рддрд┐ред рдпрд╛ рдЕрдЧрд░ рд╕рднреА рд╕рд╛рдорд╛рди рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ ( clear accessories )ред


рдкрдВрдЬреАрдХреГрдд рдХрд╛рд░реНрдп - рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрд┐рдпреЛрдВ, рдЗрди рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЧреЗрдЯреНрд╕ред


  • рд╕рднреА рд╕рд╛рдорд╛рдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкреНрд░рддреНрдпреЗрдХ рдЧреМрдг рдХреЗ рд▓рд┐рдП рдПрдХ AccessoryInfo рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


 import 'package:scoped_model/scoped_model.dart'; // AccessoryInfo extends Model // so, when accessory value is updated it descends down to // all widgets inside ScopedModelDescendant class AccessoryInfo extends Model { dynamic id; dynamic type; String name; String job_channel; List control; List status; bool selected; Map<dynamic, dynamic> currentState; AccessoryInfo(Map<dynamic, dynamic> obj) { this.id = obj['id']; this.type = obj['type']; this.name = obj['name']; this.job_channel = obj['job_channel']; this.control = obj['control']; this.status = obj['status']; this.currentState = {}; } void updateCurrentState(key, value) { currentState[key] = value; notifyListeners(); } void notify() { notifyListeners(); } } 

рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдореЙрдбрд▓ рд╣реИред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдореИрдВрдиреЗ StatefulWidget рдФрд░ setState() {} рд╣рд░ рдЬрдЧрд╣ рд▓рд┐рдЦрд╛ рдерд╛, рд▓реЗрдХрд┐рди setState() {} рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдЬреЗрдЯ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдЕрдВрджрд░ рд╢реНрд░реЛрддрд╛ рдкрдВрдЬреАрдХреГрдд рд╣реЛрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╡рд┐рд╕реНрддреГрдд рдЧреМрдг рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╢реБрд░реВ рдореЗрдВ рдирдП Stateful рдкреЗрдЬ рдмрдирд╛рдП, рдФрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдХрд┐ рд╕реНрдЯреЗрдЯрд╕ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рд╣реИред рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ - ScopedModel рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред


рд╕рд╛рдорд╛рди рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд╣рдо рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рднреЗрдЬрддреЗ рд╣реИрдВ рдФрд░ рд╕реВрдЪреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ List <AccessoryInfo> ред рдХреЙрд▓ setState() {} , рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рд╕рд╣рд╛рдпрдХ рдПрдХреНрд╕реЗрд╕рд░реА рдХреЛ рдЬреЛрдбрд╝рдирд╛ред рд╕рдорд░реНрдерд┐рдд рдЕрдиреБрд╖рдВрдЧреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ ./lib/widgets/*.dart рдФрд░ ./lib/widgets/*.dart рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдорд░реНрдерд┐рдд switch/temperature sensor/radio player/thermostat ред рдЖрдЧреЗ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рдо рдирдП рд▓реЛрдЧреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдореМрдЬреВрджрд╛ рд╡рд┐рдЧреЗрдЯреНрд╕ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рд╣реИред


  • рдЕрдм рдкреНрд░рддреНрдпреЗрдХ рдЧреМрдг рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрддреНрд╡ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реНрд╡рд┐рдЪ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

  @override Widget build(BuildContext context) { return new ScopedModel<AccessoryInfo>( model: info, child: ScopedModelDescendant<AccessoryInfo>( builder: (context, child, model) { var cardColor = Theme.of(context).cardColor; dynamic switchState = model.currentState['state']; if (switchState is bool) { if (switchState) { cardColor = Colors.deepPurple; } else { cardColor = Theme.of(context).cardColor; } } return Card( color: cardColor, child: ListTile( selected: false, leading: new Icon(Icons.lightbulb_outline), title: new Text("${model.name}"), onTap: () { // to control accessory value // get status value at first bobaos.getStatusValue( model.id, "state", (bool err, Object payload) { if (err) { return print('error ocurred $payload'); } if (payload is Map) { dynamic currentValue = payload['status']['value']; bool newValue; if (currentValue is bool) { // invert newValue = !currentValue; } else { newValue = false; } // then send new value bobaos.controlAccessoryValue( model.id, {"state": newValue}, (bool err, Object payload) { if (err) { return print('error ocurred $payload'); } }); } }); }, onLongPress: () { // TODO: dialog with additional funcs }, )); })); } 

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


рдЗрд╕ рдЧреМрдг рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рдВрдмрд╛ рдХреНрд▓рд┐рдХ рд╣реИрдВрдбрд▓рд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдПрдХ рд░реЗрдбрд┐рдпреЛ рдкреНрд▓реЗрдпрд░ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


  onLongPress: () { Navigator.of(context).push(MaterialPageRoute( builder: (context) => AccRadioPlayerControl( info: info, bobaos: bobaos, ))); }, 

AccRadioPlayerControl рдкреЗрдЬ AccRadioPlayerControl , рдЬреЛ рд░рд╛рдЬреНрдп рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ScopedModel рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред


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


рд╕рдорд╕реНрдпрд╛рдУрдВ


рдореИрдВ рдЕрдм рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред рдореБрдЭреЗ рдЕрднреА рднреА рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЯреВрдЯреЗ рд╣реБрдП WebSocket рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рдХреИрд╕реЗ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдПред


рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ: WebSocket рд╡рд░реНрдЧ ред


рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдбрд┐рд╡рд╛рдЗрд╕ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕реНрд▓реАрдк рдореЛрдб рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдХрдиреЗрдХреНрд╢рди рдХрд╛рдЯ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдкреГрд╖реНрда рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЦреЛрдЬ рдХреА рдЧрдИ рд╕реЗрд╡рд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдирд╛ рд╣реЛрдЧрд╛ред


рдЕрдВрддрднрд╛рд╖рдг


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


рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдЗрдпрд╛рдБ: рд╡рд┐рдЧреЗрдЯреНрд╕ рдХрд╛ рдмрдбрд╝рд╛ рдШреЛрдВрд╕рд▓рд╛ рдмрдирд╛рдирд╛ред рд╕реНрдкрдВрджрди рдХреЗ рдмрд╛рдж рдкреНрд░рд╕рд┐рджреНрдз рдХреЙрд▓рдмреИрдХ рдирд░рдХ рдЕрд▓рдЧ рджрд┐рдЦрддрд╛ рд╣реИред рд╡рд┐рдо-рдореЛрдб рдФрд░ % рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред


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


рдЖрд╡рд╛рдЬ рд╕рд╣рд╛рдпрдХред рдпреИрдВрдбреЗрдХреНрд╕ рдХреЗ рдПрд▓рд┐рд╕ рдХреЛ рдЙрд╕рдХреЗ рдХреНрд▓рд╛рдЙрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдкрд╛рда рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдореЗрдЬрд╝рди рдХрд╛ рдПрд▓реЗрдХреНрд╕рд╛ рдХреБрдЫ рдЗрд╕реА рдЕрдВрджрд╛рдЬ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред


рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╕рдмрд╕реЗ рд╕рдлрд▓, Apple HomeKit рджреНрд╡рд╛рд░рд╛ рд╕рд┐рд░реА рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреНрд▓рд╛рдЙрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯреЗрдХреНрд╕реНрдЯ рд░рд┐рдХрдЧреНрдирд┐рд╢рди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛ - рд╕реНрдерд╛рдиреАрдп рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВред


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


рд╕рдВрджрд░реНрдн


  1. рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА
  2. Bobaoskit рдкреНрд░рд▓реЗрдЦрди - bobaoskit.worker рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ radio player рдЧреМрдг рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрддрд╛рддрд╛ рд╣реИред

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


All Articles