рд╣реЗрд▓реЛ, рд╣реЗрдмреНрд░!рд╣рдорд╛рд░реА рдордзреНрдпрдо рдЕрд╡рдзрд┐ рдХреА рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдлрд╝реНрд▓рдЯрд░ рдкреБрд╕реНрддрдХ рдХрд╛ рд╡рд┐рдореЛрдЪрди рд╢рд╛рдорд┐рд▓ рд╣реИред рдПрдХ рд╡рд┐рд╖рдп рдХреЗ рд░реВрдк рдореЗрдВ рдбрд╛рд░реНрдЯ рдХреА рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рд╣рдо рдЕрднреА рднреА рдЕрдзрд┐рдХ рд╕рддрд░реНрдХ рд╕реНрдерд┐рддрд┐ рд▓реЗрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЗрд╕рдХреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдкреНрд░рджрд╛рддрд╛ рдкреИрдХреЗрдЬ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╕реНрдкрдВрджрди рдореЗрдВ рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рдкрд░редрдкреНрд░рджрд╛рддрд╛ рдПрдХ рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рдкреИрдХреЗрдЬ рд╣реИ рдЬрд┐рд╕реЗ рд░реЗрдореА рд░рд╕реЗрд▓ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ Google рдФрд░ рд╕реНрдкрдВрджрди рд╕рдореБрджрд╛рдп рджреНрд╡рд╛рд░рд╛ рдЕрдкрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рдХреНрдпрд╛ рд╣реИ? рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рдПрдХ рд╢рд░реНрдд рдХреНрдпрд╛ рд╣реИ? рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ UI рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╛рдЬреНрдп рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рд╣реИред рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдмрдирд╛рдиреЗ, рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ, рд╕рдВрднрд╛рд▓рдиреЗ рдФрд░ рдирд┐рдкрдЯрд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рдкреНрд░рджрд╛рддрд╛ рдкреИрдХреЗрдЬ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВред1. StatefulWidget
рд╕реНрдЯреЗрдЯрд▓реЗрд╕рд╡рд┐рдЬреЗрдЯ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдпреВрдЖрдИ рдШрдЯрдХ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рддрднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЙрд╕рдореЗрдВ рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИред рдирд╣реАрдВ рд╣реИ StatelessWidget
рдХреЛрдИ "рд╕реНрдореГрддрд┐"; рдЗрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдФрд░ рдирд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдкрдВрджрди рдореЗрдВ рдПрдХ рд╕реНрдЯреЗрдЯрдлреБрд▓рдЧреЗрдЯ рднреА рд╣реИ , рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдореЗрдореЛрд░реА рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЬреАрд╡рд┐рдд рдЙрдкрдЧреНрд░рд╣ - рд╕реНрдЯреЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ ред рдЗрд╕ рд╡рд░реНрдЧ рдХреА рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ setState()
, рдЬрдм рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рд╡рд┐рдЬреЗрдЯ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд░рд╛рдЬреНрдп рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рдирдП рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдлрд╝реНрд▓рдЯрд░ рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд░реВрдк рд╣реИред рдпрд╣рд╛рдВ рдПрдХ рдмрдЯрди рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрд╢рд╛ рдЙрд╕ рд╕рдордп рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЕрдВрддрд┐рдо рдмрд╛рд░ рджрдмрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛:class _MyWidgetState extends State<MyWidget> {
DateTime _time = DateTime.now(); @override
Widget build(BuildContext context) {
return FlatButton(
child: Text(_time.toString()),
onPressed: () {
setState(() => _time = DateTime.now());
},
);
}
}
рддреЛ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рд╣реИ? рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдХреБрдЫ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рдирд┐рд╣рд┐рдд рд╣реИ StatefulWidget
ред рдЗрд╕рдореЗрдВ рд╡рд╣ рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдпреВрдЖрдИ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдбреЗрдЯрд╛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЪрд╛рдЗрд▓реНрдб рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рд╕рд╛рдЭрд╛ рдФрд░ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕реА рдХреЛрдИ рднреА рдШрдЯрдирд╛ рдЬрд┐рд╕ рдкрд░ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ рддреЛ рдХреЙрд▓рдмреИрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреЙрдк рдЕрдк рдХрд░реЗрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рднреА рдордзреНрдпрд╡рд░реНрддреА рд╡рд┐рдЧреЗрдЯреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдХреЙрд▓рдмреИрдХ рд╕рдВрдЪрд╛рд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдЬрд▓реНрдж рд╣реА рднреНрд░рдо рдкреИрджрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░, рдЙрдкрд░реНрдпреБрдХреНрдд рд░реВрдЯ рдХреЗ рдХрд┐рд╕реА рднреА рдЕрдкрдбреЗрдЯ рд╕реЗ рдкреВрд░реЗ рд╡рд┐рдЬреЗрдЯ рдЯреНрд░реА рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рд╣реЛрдЧрд╛, рдЬреЛ рдЕрдХреНрд╖рдо рд╣реИред2. рдЗрдирд╣реЗрд░рд┐рдЯрдбреАрдбрдЧреЗрдЯ
InheritedWidget рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдЬреЗрдЯ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╡рдВрд╢рдЬ рд╕реАрдзреЗ рд▓рд┐рдВрдХ рдХреЗ рдмрд┐рдирд╛ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП InheritedWidget
, рдПрдХ рдЦрдкрдд рд╡рд┐рдЬреЗрдЯ рдПрдХ рд╕реНрд╡рдд: рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдкреВрд░реНрд╡рдЬ рд╡рд┐рдЬреЗрдЯ рдХреЗ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди рд╣реЛрдЧрд╛ред рдпрд╣ рддрдХрдиреАрдХ рдЖрдкрдХреЛ UI рдХреЗ рдЕрдкрдбреЗрдЯ рдХреЛ рдЕрдзрд┐рдХ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рд░рд╛рдЬреНрдп рдореЗрдВ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдмрджрд▓рд╛рд╡ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдЖрд╡реЗрджрди рдХреЗ рд╡рд┐рд╢рд╛рд▓ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдЪреБрдирд┐рдВрджрд╛ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рдЙрди рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдЧреЗрдЯреНрд╕ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред InheritedWidget
рдЬрдм рднреА рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ MediaQuery.of(context)
рдпрд╛ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ Theme.of(context)
ред рд╕рдЪ рд╣реИ, рдпрд╣ рдХрдо рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рд░рд╛рдЬреНрдп рд╕рдВрд░рдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ InheritedWidget рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реЛред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред3. рд╕реНрдХреЛрдкреНрдбрдореЙрдбрд▓
ScopedModel рдмреНрд░рд╛рдпрди рдПрдЧрди рджреНрд╡рд╛рд░рд╛ 2017 рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдПрдХ рдкреИрдХреЗрдЬ рд╣реИ, рдЬреЛ InheritedWidget
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдЯреЗрдЯ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ ред рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдПрдХ рд░рд╛рдЬреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рдореЙрдбрд▓ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИ , рдФрд░ рдлрд┐рд░ notifyListeners()
рдЬрдм рдЗрд╕рдХреЗ рдЧреБрдг рдмрджрд▓рддреЗ рд╣реИрдВ рддреЛ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВ ред рд╕реНрдерд┐рддрд┐ Java рдореЗрдВ PropertyChangeListener рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддреА рд╣реИ редclass MyModel extends Model {
String _foo; String get foo => _foo;
void set foo(String value) {
_foo = value;
notifyListeners();
}
}
рдЕрдкрдиреА рд░рд╛рдЬреНрдп рд╡рд╕реНрддреБ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕ рд╡рд╕реНрддреБ ScopedModel
рдХреЛ рдЕрдкрдиреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдореВрд▓ рдореЗрдВ рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ :ScopedModel<MyModel>(
model: MyModel(),
child: MyApp(...)
)
рдЕрдм рдХреЛрдИ рднреА рд╡рдВрд╢рдЬ рд╡рд┐рдЬреЗрдЯ ScopedModelDescendersMyModel
рд╡рд┐рдЬреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ ред рдореЙрдбрд▓ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ :builder
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ScopedModelDescendant<MyModel>(
builder: (context, child, model) => Text(model.foo),
);
}
}
рдХреЛрдИ рднреА рд╡рдВрд╢рдЬ рд╡рд┐рдЬреЗрдЯ рднреА рдореЙрдбрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛, рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рдХреЗ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░реЗрдЧрд╛ ScopedModelDescendants
(рдмрд╢рд░реНрддреЗ рдХрд┐ рд╣рдорд╛рд░рд╛ рдореЙрдбрд▓ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ notifyListeners()
:class OtherWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FlatButton(
child: Text('Update'),
onPressed: () {
final model = ScopedModel.of<MyModel>(context);
model.foo = 'bar';
},
);
}
}
ScopedModel
рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдлреНрд▓рдЯрд░ рдореЗрдВ рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рд╣рд╛рд╕рд┐рд▓ рдХреА, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреНрд░рд╛рд╡рдзрд╛рди рддрдХ рд╕реАрдорд┐рдд рд╣реИ рдЬреЛ рд╡рд░реНрдЧ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ Model
рдФрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЗ рдЗрд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред4. рдмреАрдПрд▓рдУрд╕реА
Google I / O '18
рд╕рдореНрдореЗрд▓рди рдореЗрдВ, рдмрд┐рдЬрдиреЗрд╕ рд▓реЙрдЬрд┐рдХ рдХрдВрдкреЛрдиреЗрдВрдЯ (BLoC) рдкреИрдЯрд░реНрди рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ , рдЬреЛ рд╡рд┐рдЧреЗрдЯреНрд╕ рд╕реЗ рд╕реНрдЯреЗрдЯ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рддрдХ рдПрдХ рдЕрдиреНрдп рдЯреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдмреАрдПрд▓рдУрд╕реА рд╡рд░реНрдЧ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЧреИрд░-рдпреВрдЖрдИ рдШрдЯрдХ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рд░рд╛рдЬреНрдп рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдзрд╛рд░рд╛рдУрдВ рдФрд░ рд░рд┐рд╕реАрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдЬрд╛рдЧрд░ рдХрд░рддреЗ рд╣реИрдВред рдпреВрдЖрдИ рд╕реЗ рдкрд░реЗ рд░рд╛рдЬреНрдп рдФрд░ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдЖрдк рд╡рд┐рдЬреЗрдЯ рдХреЛ рд╕рд░рд▓ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ StatelessWidget
рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░реАрдордмреНрдпреВрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдирддреАрдЬрддрди, рд╡рд┐рдЬреЗрдЯ "рдЧреВрдВрдЧрд╛" рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИредрдЙрджрд╛рд╣рд░рдг рдмреАрдПрд▓рдУрд╕реА рд╡рд░реНрдЧ:class MyBloc {
final _controller = StreamController<MyType>(); Stream<MyType> get stream => _controller.stream;
StreamSink<MyType> get sink => _controller.sink;
myMethod() {
sink.add(foo);
} dispose() {
_controller.close();
}
}
, BLoC:
@override
Widget build(BuildContext context) {
return StreamBuilder<MyType>(
stream: myBloc.stream,
builder: (context, asyncSnapshot) {
});
}
рдмреАрдПрд▓рдУрд╕реА рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдмреАрдПрд▓рдУрд╕реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдФрд░ рдирд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПред myBloc
рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ ? рд╣рдо dispose()
рдЙрд╕рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ? рдзрд╛рд░рд╛рдУрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ StreamController
, рдЬреЛ closed
рдХрд┐ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реЛрддреЗ рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдпрд╣ рдореЗрдореЛрд░реА рд▓реАрдХ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред (рдбрд╛рд░реНрдЯ рдореЗрдВ рд╡рд░реНрдЧ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдРрд╕реА рдХреЛрдИ рдЪреАрдЬ рдирд╣реАрдВ рд╣реИ; рдХреЗрд╡рд▓ рдПрдХ рд╡рд░реНрдЧ State
рдореЗрдВ StatefulWidget
рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ dispose()
)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рдмреАрдПрд▓рдУрд╕реА рдХреЛ рдХрдИ рд╡рд┐рдЬреЗрдЯреНрд╕ рдХреЗ рдмреАрдЪ рдХреИрд╕реЗ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдмреАрдПрд▓рдУрд╕реА рдореЗрдВ рдорд╛рд╕реНрдЯрд░ рдХрд░рдирд╛ рдЕрдХреНрд╕рд░ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддрд╛ рд╣реИред рдХрдИ рдкреИрдХреЗрдЬ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред5. рдкреНрд░рджрд╛рддрд╛
Provider
рд░реЗрдореА рд░рд╕реЗрд▓ рджреНрд╡рд╛рд░рд╛ 2018 рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдПрдХ рдкреИрдХреЗрдЬ рд╣реИ ScopedModel
, рдЬрд┐рд╕рдХреЗ рд╕рдорд╛рди , рд▓реЗрдХрд┐рди рдЬрд┐рдирдХреЗ рдХрд╛рд░реНрдп рдХреЗрд╡рд▓ рдореЙрдбрд▓ рдХреЗ рдЙрдкрд╡рд░реНрдЧ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рднреА рдПрдХ рдЖрд╡рд░рдг рд╣реИ рдЬреЛ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ InheritedWidget
, рд▓реЗрдХрд┐рди рдкреНрд░рджрд╛рддрд╛ рдХрд┐рд╕реА рднреА рд░рд╛рдЬреНрдп рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдмреАрдПрд▓рдУрд╕реА, рдзрд╛рд░рд╛рдПрдВ, рд╡рд╛рдпрджрд╛ рдФрд░ рдЕрдиреНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЪреВрдВрдХрд┐ рдкреНрд░рджрд╛рддрд╛ рдЗрддрдирд╛ рд╕рд░рд▓ рдФрд░ рд▓рдЪреАрд▓рд╛ рд╣реИ, Google рдиреЗ Google I / O '19 рд╕рдореНрдореЗрд▓рди рдореЗрдВ рдШреЛрд╖рдгрд╛ рдХреА рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдпрд╣ Provider
рдкреНрд░рдмрдВрдз рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП рдкрд╕рдВрджреАрджрд╛ рдкреИрдХреЗрдЬ рд╣реЛрдЧрд╛ред рдмреЗрд╢рдХ, рдЕрдиреНрдп рдкреИрдХреЗрдЬреЛрдВ рдХреА рднреА рдЕрдиреБрдорддрд┐ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЛ рдХреЛрдИ рд╕рдВрджреЗрд╣ рд╣реИ, рддреЛ Google рд░реБрдХрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реИ Provider
редProvider
рдмрдирд╛рдпрд╛ "рд╡рд┐рдЧреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде, рд╡рд┐рдЧреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдПред"Provider
рдЖрдкрдХреЛ рд╡рд┐рдЬреЗрдЯ рдЯреНрд░реА рдореЗрдВ рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдХреЛ рд░рдЦрдиреЗ рдФрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд┐рдЬреЗрдЯ (рдмрдЪреНрдЪреЗ) рдХреЗ рд▓рд┐рдП рдЙрд╕ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ Provider
рд╡рд┐рдЬреЗрдЯ рдХреЗ рдкреЗрдбрд╝ рд╕реЗ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдЙрдиреНрд╣реЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд░рдХреЗ рдФрд░ рдХреНрд▓реАрдирдЕрдк рдХрд░рдХреЗ рд░рд╛рдЬреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рднреА рдорджрдж рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ Provider
рдмреАрдПрд▓рдУрд╕реА рдШрдЯрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреБрдХреНрдд рд╣реИ рдпрд╛ рдЕрдиреНрдп рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ! рдпрд╛ рдмрд╕ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдПрдХ рдлреИрдВрд╕реА рд╢рдмреНрдж рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдХреЛ рд╡рд┐рдЧреЗрдЯреНрд╕ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдХрд┐ рдЖрдк рдХрдиреЗрдХреНрд╢рди рдХреЛ рдвреАрд▓рд╛ рдХрд░ рд╕рдХреЗрдВ рдФрд░ рдХреЛрдб рдХреА рдкрд░реАрдХреНрд╖рдг рдХреНрд╖рдорддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХреЗрдВред рдЖрдЦрд┐рд░рдХрд╛рд░,Provider
рд╡рд┐рд╢реЗрд╖ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ, рдзрдиреНрдпрд╡рд╛рдж рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рднреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдЕрдЧрд▓рд╛, рд╣рдо рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдкрд░ рдПрдХ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВрдЧреЗред- рдореВрд▓ рдкреНрд░рджрд╛рддрд╛
- ChangeNotifierProvider
- StreamProvider
- Futureprovider
- ValueListenableProvider
- MultiProvider
- Proxyprovider
рд╕реНрдерд╛рдкрдирд╛
рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Provider
, рдкрд╣рд▓реЗ рд╣рдорд╛рд░реА рдлрд╝рд╛рдЗрд▓ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝реЗрдВ pubspec.yaml
:provider: ^3.0.0
рдлрд┐рд░ рд╣рдо рдЙрд╕ рдкреИрдХреЗрдЬ рдХреЛ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ Provider
рдЬрд╣рд╛рдБ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:import 'package:provider/provider.dart';
рдЖрдзрд╛рд░ рдкреНрд░рджрд╛рддрд╛ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреА рдЬрдбрд╝ рдореЗрдВрдЖрдзрд╛рд░ Provide
рдЖрд░ рдмрдирд╛рдПрдБ ; рдЗрд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдЧрд╛:Provider<MyModel>(
builder: (context) => MyModel(),
child: MyApp(...),
)
рдкреИрд░рд╛рдореАрдЯрд░ builder
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИ MyModel
ред рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдореМрдЬреВрджрд╛ рдЙрджрд╛рд╣рд░рдг рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ Provider.value
редрддрдм рдЖрдк MyApp
рд╡рд┐рдЬреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╣реАрдВ рднреА рдореЙрдбрд▓ рдХреЗ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ Consumer
:class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Consumer<MyModel>(
builder: (context, value, child) => Text(value.foo),
);
}
}
рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╡рд░реНрдЧ рдХреЛ рдЙрдкрднреЛрдХреНрддрд╛ рд╡рд┐рдЬреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ MyWidget
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓рддрд╛ рд╣реИ ред рдпрд╣ рд╡рд┐рдЬреЗрдЯ рд╣рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рджреЗрддрд╛ рд╣реИ ред рдЕрдм, рдпрджрд┐ рд╣рдо рдЕрдкрдиреЗ рдореЙрдбрд▓ рдореЗрдВ рдбреЗрдЯрд╛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдФрд░ рд╡рд┐рдЬреЗрдЯ рд╣реИ, рдЬрдм рдПрдХ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП :MyModel
builder
value
foo
class OtherWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FlatButton(
child: Text('Update'),
onPressed: () {
final model = Provider.of<MyModel>(context);
model.foo = 'bar';
},
);
}
}
рдЙрджрд╛рд╣рд░рдг рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ MyModel
ред рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ, рдпрд╣ рд╡рд┐рдЬреЗрдЯ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ Consumer
ред рд╡рд┐рдЬреЗрдЯ Consumer
рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬрдм рдХреЛрдб рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ BuildContext
редрдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ MyWidget
рдХрд┐ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рдмрдирд╛рдП рдЧрдП рдореВрд▓ рд╡рд┐рдЬреЗрдЯ рдХрд╛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ ? рдХреНрдпрд╛ рдЗрд╕рдореЗрдВ рдПрдХ рдирдпрд╛ рдЕрд░реНрде рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ bar
? рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдирд╣реАрдВ ред рдкреБрд░рд╛рдиреА рдкрд╛рд░рдВрдкрд░рд┐рдХ рдбрд╛рд░реНрдЯ рд╡рд╕реНрддреБрдУрдВ (рдХрдо рд╕реЗ рдХрдо рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдмрд┐рдирд╛, рдЬреЛ рдлрд╝реНрд▓рдЯрд░ рдореЗрдВ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ) рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╕реБрдирдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, Provider
рдпрд╣ "рджреЗрдЦрдиреЗ" рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдордиреЗ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдареАрдХ рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИ foo
рдФрд░ рд╡рд┐рдЬреЗрдЯ рдХреЛ MyWidget
рдЬрд╡рд╛рдм рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдЖрджреЗрд╢ рджрд┐рдпрд╛ рд╣реИ редChangeNotifierProviderрд▓реЗрдХрд┐рди рдЖрд╢рд╛ рд╣реИ! рдЖрдк рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ MyModel
рдХреЛ рдПрдХ рдЕрд╢реБрджреНрдзрддрд╛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ChangeNotifier
ред рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓рдиреЗ рдФрд░ notifyListeners()
рд╣рдорд╛рд░реЗ рдЧреБрдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рдордп рд▓рдЧреЗрдЧрд╛ ред рдпрд╣ рд▓рдЧрднрдЧ рдЙрд╕реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ScopedModel
, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдореЙрдбрд▓ рдХреЗ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ ChangeNotifier
ред рдпрд╣рд╛рдБ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:class MyModel with ChangeNotifier {
String _foo; String get foo => _foo;
void set foo(String value) {
_foo = value;
notifyListeners();
}
}
рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдЕрдкрдиреА рд╕рдВрдкрддреНрддрд┐ рдХреА рдЬрдЧрд╣ foo
рдХреЗ рд╕рд╛рде getter
рдФрд░ setter
, _foo рдирд┐рдЬреА рдЪрд░ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рддред рдЗрд╕ рддрд░рд╣ рд╣рдо foo рдкреНрд░реЙрдкрд░реНрдЯреА рдореЗрдВ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рдмрджрд▓рд╛рд╡ рдХреЛ "рд░реЛрдХ" рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рдмрджрд▓ рдЧрдИ рд╣реИредрдЕрдм, рдмрд╛рд╣рд░ рд╕реЗ Provider
, рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рд╡рд╣ рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗ ChangeNotifierProvider
:ChangeNotifierProvider<MyModel>(
builder: (context) => MyModel(),
child: MyApp(...),
)
рдРрд╢реЗ рд╣реА! рдЕрдм, рдЬрдм рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ OtherWidget
рд╕рдВрдкрддреНрддрд┐ foo
рдХреЛ рдЕрджреНрдпрддрди рдХрд░рддрд╛ рд╣реИ MyModel
, рддреЛ MyWidget
рдпрд╣ рд╕реНрд╡рддрдГ рд╣реА рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрджреНрдпрддрди рдХрд░реЗрдЧрд╛ред рдмрд┐рд▓реНрдХреБрд▓ рд╕рдЯреАрдХ?рд╡реИрд╕реЗред рдЖрдкрдиреЗ рд╢рд╛рдпрдж рдПрдХ рдмрдЯрди рд╣реИрдВрдбрд▓рд░ рджреЗрдЦрд╛ рд╣реИ OtherWidget
рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдордиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ:final model = Provider.of<MyModel>(context);
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд OtherWidget
рд░реВрдк рд╕реЗ рдореЙрдбрд▓ рдХреЗ рдмрджрд▓рддреЗ рд╣реА рдЙрджрд╛рд╣рд░рдг рдХреЗ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд╛ рдХрд╛рд░рдг рдмрдиреЗрдЧрд╛ MyModel
ред рд╢рд╛рдпрдж рд╣рдореЗрдВ рдЗрд╕рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдЕрдВрдд рдореЗрдВ, рдЗрд╕рдореЗрдВ OtherWidget
рдмрд╕ рдПрдХ рдмрдЯрди рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдореВрд▓реНрдп рдмрджрд▓рдиреЗ рдкрд░ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ MyModel
ред рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдкрдВрдЬреАрдХрд░рдг рдХрд┐рдП рдмрд┐рдирд╛ рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:final model = Provider.of<MyModel>(context, listen: false);
рдпрд╣ рдкреИрдХреЗрдЬ рдХреА Provider
рддрд░рд╣ рд╣реА рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рдФрд░ рдЖрдХрд░реНрд╖рдг рд╣реИредрд╕реНрдЯреНрд░реАрдордкреНрд░реЙрдЗрдбрд░рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ StreamProvider
ред рдЕрдВрдд рдореЗрдВ, рдЖрдк рдмрд╕ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ StreamBuilder
рдпрджрд┐ рдЖрдкрдХреЛ рдлрд╝реНрд▓рдЯрд░ рдореЗрдВ рдПрдХ рдзрд╛рд░рд╛ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ рд╣рдо рдзрд╛рд░рд╛ рдХреЛ рд╕реБрдирдиреЗ рдХреЗ onAuthStateChanged
рджреНрд╡рд╛рд░рд╛ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдИ рдЧрдИ FirebaseAuth
:@override
Widget build(BuildContext context {
return StreamBuilder(
stream: FirebaseAuth.instance.onAuthStateChanged,
builder: (BuildContext context, AsyncSnapshot snapshot){
...
});
}
рдорджрдж рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Provider
, рд╣рдо StreamProvider
рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рдореВрд▓ рдореЗрдВ рдЕрдкрдиреА рд╕реНрдЯреНрд░реАрдо рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ :StreamProvider<FirebaseUser>.value(
stream: FirebaseAuth.instance.onAuthStateChanged,
child: MyApp(...),
}
рдлрд┐рд░ рдмрдЪреНрдЪреЗ рдХреЗ рд╡рд┐рдЬреЗрдЯ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░реЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ Provider
:@override
Widget build(BuildContext context) {
return Consumer<FirebaseUser>(
builder: (context, value, child) => Text(value.displayName),
);
}
рди рдХреЗрд╡рд▓ рд╣рдорд╛рд░рд╛ рд╡рд┐рдЬреЗрдЯ рдХреЛрдб рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреНрд▓реАрдирд░ рдмрди рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЛ рднреА рд╕рд╛рд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдЖрдпрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдХрднреА рднреА рдЖрдзрд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП FutureProvider
, рддреЛ рд╡рд┐рдЬреЗрдЯ рдХреЛрдб рдореЗрдВ рдХрд┐рд╕реА рднреА рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ, рдпрд╣ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдП рдЧрдП рдЕрдиреНрдп рд╕рднреА рдкреНрд░рджрд╛рддрд╛рдУрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИредFutureProviderрдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди, рдпрд╣ рд╡рд┐рдЧреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп FutureProvider
рдорд╛рдирдХ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ FutureBuilder
ред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:FutureProvider<FirebaseUser>.value(
value: FirebaseAuth.instance.currentUser(),
child: MyApp(...),
);
рдмрд╛рд▓ рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рдЗрд╕ рдорд╛рди рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдКрдкрд░ рджрд┐рдП Consumer
рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЙрд╕реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ StreamProvider
рд╣реИрдВредValueListenableProviderValueListenable ValueNotifier рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдПрдХ рдбрд╛рд░реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬреЛ рдПрдХ рдорд╛рди рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЬрдм рдпрд╣ рджреВрд╕рд░реЗ рдорд╛рди рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИ рддреЛ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд░рд▓ рдореЙрдбрд▓ рд╡рд░реНрдЧ рдореЗрдВ рдкреВрд░реНрдгрд╛рдВрдХ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рд▓рдкреЗрдЯрдирд╛ рд╕рдВрднрд╡ рд╣реИ:class MyModel {
final ValueNotifier<int> counter = ValueNotifier(0);
}
рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдСрдмреНрдЬреЗрдХреНрдЯ ValueNotifier
рдХреЗ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ ==
рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдореВрд▓реНрдп рдмрджрд▓ рдЧрдпрд╛ рд╣реИредрдЖрдЗрдП рд╕рдмрд╕реЗ рд╕рд░рд▓ рдмрдирд╛рдПрдВ Provider
, рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░рд╛ рдореБрдЦреНрдп рдореЙрдбрд▓ рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж рдПрдХ Consumer
рдиреЗрд╕реНрдЯреЗрдб ValueListenableProvider
рд╕реБрдирдиреЗ рдХреА рд╕рдВрдкрддреНрддрд┐ рд╣реЛрдЧреА counter
:Provider<MyModel>(
builder: (context) => MyModel(),
child: Consumer<MyModel>(builder: (context, value, child) {
return ValueListenableProvider<int>.value(
value: value.counter,
child: MyApp(...)
}
}
}
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдиреЗрд╕реНрдЯреЗрдб рдкреНрд░рджрд╛рддрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ int
ред рдФрд░ рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдИ рдкреНрд░рджрд╛рддрд╛ рдкрдВрдЬреАрдХреГрдд рд╣реИрдВ, рддреЛ рдкреНрд░рджрд╛рддрд╛ "рдирд┐рдХрдЯрддрдо" (рдирд┐рдХрдЯрддрдо рдкреВрд░реНрд╡рдЬ) рдХреЛ рд▓реМрдЯрд╛ рджреЗрдЧрд╛редрдпрд╣рд╛рдВ counter
рдХрд┐рд╕реА рднреА рдмрдЪреНрдЪреЗ рдХреЗ рд╡рд┐рдЬреЗрдЯ рд╕реЗ рд╕рдВрдкрддреНрддрд┐ рд╕реБрдирдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ :class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Consumer<int>(
builder: (context, value, child) {
return Text(value.toString());
},
);
}
}
рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдПрдХ рд╕рдВрдкрддреНрддрд┐ counter
рдХреЛ рджреВрд╕рд░реЗ рд╡рд┐рдЬреЗрдЯ рд╕реЗ рдХреИрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдП ред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ: рд╣рдореЗрдВ рдореВрд▓ рдкреНрд░рддрд┐ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ MyModel
редclass OtherWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FlatButton(
child: Text('Update'),
onPressed: () {
final model = Provider.of<MyModel>(context);
model.counter.value++;
},
);
}
}
рдорд▓реНрдЯреАрдкреНрд░реЙрдЗрдбрд░рдпрджрд┐ рдЖрдк рдХрдИ рд╡рд┐рдЬреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВProvider
, рддреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдЬрдбрд╝ рдореЗрдВ рдЖрдкрдХреЛ рдХрдИ рдЕрдЯреИрдЪрдореЗрдВрдЯ рд╕реЗ рдПрдХ рдмрджрд╕реВрд░рдд рд╕рдВрд░рдЪрдирд╛ рдорд┐рд▓рддреА рд╣реИ:Provider<Foo>.value(
value: foo,
child: Provider<Bar>.value(
value: bar,
child: Provider<Baz>.value(
value: baz ,
child: MyApp(...)
)
)
)
MultiProvider
рдЖрдкрдХреЛ рдЙрди рд╕рднреА рдХреЛ рд╕рдорд╛рди рд╕реНрддрд░ рдкрд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╢реБрдЧрд░ рд╣реИ: рдЗрдВрдЯреНрд░рд╛-рд╕рд┐рд╕реНрдЯрдо рд╕реНрддрд░ рдкрд░, рд╡реЗ рд╕рднреА рд╡реИрд╕реЗ рднреА рдирд┐рд╣рд┐рдд рд╣реИрдВредMultiProvider(
providers: [
Provider<Foo>.value(value: foo),
Provider<Bar>.value(value: bar),
Provider<Baz>.value(value: baz),
],
child: MyApp(...),
)
ProxyProviderProxyProvider
рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕реЗ рддреАрд╕рд░реЗ рдкреИрдХреЗрдЬ рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИProvider
ред рдпрд╣ рдЖрдкрдХреЛ рдЙрди рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╕реНрд╡рдпрдВ рдЕрдиреНрдп рдкреНрд░рджрд╛рддрд╛рдУрдВ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдкрд░ рдЫрд╣ рддрдХред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдмрд╛рд░ рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИFoo
ред рдпрд╣ рдЙрди рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд░реВрдЯ рд╕реЗрдЯ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╕реНрд╡рдпрдВ рдПрдХ-рджреВрд╕рд░реЗ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрддреЗ рд╣реИрдВредMultiProvider (
providers: [
Provider<Foo> (
builder: (context) => Foo(),
),
ProxyProvider<Foo, Bar>(
builder: (context, value, previous) => Bar(value),
),
],
child: MyApp(...),
)
рдкрд╣рд▓рд╛ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рддрд░реНрдХ рд╡рд╣ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдЖрдкрдХрд╛ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ ProxyProvider
, рдФрд░ рджреВрд╕рд░рд╛ рд╡рд╣ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╡рд╣ рд╡рд╛рдкрд╕ рд▓реМрдЯрддрд╛ рд╣реИредрдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдИ рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рд╕реБрдирдирд╛ рд╣реИ
рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рдПрдХ рд╣реА рд╡рд┐рдЬреЗрдЯ рдХреЛ рдХрдИ рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХреЛ рд╕реБрдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЛ рдмрджрд▓рдиреЗ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдЖрдк рд╡рд┐рдЬреЗрдЯ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЕрдзрд┐рдХрддрдо 6 рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХреЛ рд╕реБрди рд╕рдХрддреЗ рд╣реИрдВ Consumer
ред рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдзрд┐ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ builder
редConsumer2<MyModel, int>(
builder: (context, value, value2, child) {
},
);
рдирд┐рд╖реНрдХрд░реНрд╖
рдЬрдм рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ InheritedWidget
Provider
рдпрд╣ рдЖрдкрдХреЛ рдлрд╝реНрд▓рдЯрд░ рдореЗрдВ рдкреНрд░рдерд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╛рдЬреНрдп рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдЧреЗрдЯреНрд╕ рдХреЛ рд░рд╛рдЬреНрдп рдХреА рд╡рд╕реНрддреБрдУрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕реБрдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЕрдзрд┐рд╕реВрдЪрдирд╛ рддрдВрддреНрд░ рд╕рд╛рд░ рд╣реИред рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдмрдирд╛рдиреЗ рдФрд░ рдЙрдирд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдВрдЧрд░ рдмрд┐рдВрджреБ рдмрдирд╛рдХрд░ рд░рд╛рдЬреНрдп рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдЬрдм рдЬрд░реВрд░рдд рд╣реЛ рддреЛ рдЙрдирд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВред рдЗрд╕ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рднреАред Google рдХреЗ рдЖрд╢реАрд░реНрд╡рд╛рдж рдФрд░ рд╕реНрдкрдВрджрди рд╕рдореБрджрд╛рдп рдореЗрдВ рдмрдврд╝рддреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде, рдпрд╣ Provider
рдмрд┐рдирд╛ рдХрд┐рд╕реА рджреЗрд░реА рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХреЗ рд▓рд╛рдпрдХ рдкреИрдХреЗрдЬ рдмрди рдЧрдпрд╛ рд╣реИ!