рдлрд╝реНрд▓рдЯрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рддрд╛ рдкреИрдХреЗрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╡рд░рдг

рд╣реЗрд▓реЛ, рд╣реЗрдмреНрд░!

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

рдкреНрд░рджрд╛рддрд╛ рдПрдХ рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рдкреИрдХреЗрдЬ рд╣реИ рдЬрд┐рд╕реЗ рд░реЗрдореА рд░рд╕реЗрд▓ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ 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рдПрдХ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓рддрд╛ рд╣реИ ред рдпрд╣ рд╡рд┐рдЬреЗрдЯ рд╣рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рджреЗрддрд╛ рд╣реИ ред рдЕрдм, рдпрджрд┐ рд╣рдо рдЕрдкрдиреЗ рдореЙрдбрд▓ рдореЗрдВ рдбреЗрдЯрд╛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдФрд░ рд╡рд┐рдЬреЗрдЯ рд╣реИ, рдЬрдм рдПрдХ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП :MyModelbuildervalue

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рд╣реИрдВред

ValueListenableProvider

ValueListenable 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(...), 
)

ProxyProvider

ProxyProvider рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕реЗ рддреАрд╕рд░реЗ рдкреИрдХреЗрдЬ рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ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) {
    //value  MyModel
    //value2  int
  },
);

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


рдЬрдм рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ InheritedWidget Providerрдпрд╣ рдЖрдкрдХреЛ рдлрд╝реНрд▓рдЯрд░ рдореЗрдВ рдкреНрд░рдерд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╛рдЬреНрдп рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдЧреЗрдЯреНрд╕ рдХреЛ рд░рд╛рдЬреНрдп рдХреА рд╡рд╕реНрддреБрдУрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕реБрдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЕрдзрд┐рд╕реВрдЪрдирд╛ рддрдВрддреНрд░ рд╕рд╛рд░ рд╣реИред рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдмрдирд╛рдиреЗ рдФрд░ рдЙрдирд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдВрдЧрд░ рдмрд┐рдВрджреБ рдмрдирд╛рдХрд░ рд░рд╛рдЬреНрдп рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдЬрдм рдЬрд░реВрд░рдд рд╣реЛ рддреЛ рдЙрдирд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВред рдЗрд╕ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рднреАред Google рдХреЗ рдЖрд╢реАрд░реНрд╡рд╛рдж рдФрд░ рд╕реНрдкрдВрджрди рд╕рдореБрджрд╛рдп рдореЗрдВ рдмрдврд╝рддреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде, рдпрд╣ Providerрдмрд┐рдирд╛ рдХрд┐рд╕реА рджреЗрд░реА рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХреЗ рд▓рд╛рдпрдХ рдкреИрдХреЗрдЬ рдмрди рдЧрдпрд╛ рд╣реИ!

All Articles