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

рд╣рд╛рдВ, рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рдмрд╛рд░ рд▓рд┐рдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реИрд╕реЗ рднреА, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢ рдФрд░ рдирд┐рдпрдо рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдЕрдХреНрд╕рд░ рдпрд╣ рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ рдХрд┐ рдЖрд╡реЗрджрди рдореЗрдВ рддрд░реНрдХ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЕрдкрдиреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЙрдореНрдореАрдж рд╣реИ, рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдПред
рдЗрд╕рд▓рд┐рдП, рдкреИрдЯрд░реНрди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛, рдЬреИрд╕рд╛ рдХрд┐ Google рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╛рдЬ рджреА рдЧрдИ рдереА - BLOC рдПрдХ рд╕рд░рд▓ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ:
- рд╕рднреА рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо
- рд╕рднреА рдЗрдирдкреБрдЯ рдзрд╛рд░рд╛рдПрдБ рд╣реИрдВ
- рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рд╡рд┐рдЬрд╝реБрдЕрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рддрд░реНрдХ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП
рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, rxdart рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдХреЛ рдирд╣реАрдВ рд╣рдЯрд╛рдПрдЧрд╛ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдкреИрдХреЗрдЬ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, rxdart рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдбрд╛рд░реНрдЯ рднрд╛рд╖рд╛ рдХреА рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рд╕рдореГрджреНрдз рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
рдЖрд╡реЗрджрди

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

рдпрд╣ рд╣рдореЗрдВ рд╕реВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдХрдХреНрд╖рд╛ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдирд┐рдпрдо рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИред
рд╕рдорд╛рдзрд╛рди:
- рд╣рдо рд╡рд┐рдЧреЗрдЯреНрд╕ рд╕реЗ рд╕рднреА рд▓реЙрдЬрд┐рдХ рдХреЛ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВред рд╣рдо рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рдХреНрд▓рд╛рд╕ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕реЗрдЯрд╕реНрдЯреЗрдЯ рдХреЗ рд╕рд╛рде рд╕реНрдЯреЗрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВред
- рд╣рдо рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рдЬреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдореАрдЯрд░ рд░реАрдбрд┐рдВрдЧ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реНрдЯреНрд░реАрдо - рд╕реНрдЯреНрд░реАрдордмреНрдпреВрд▓рд░ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдИ рдЧрдИ рд╣реИред
class MyHomePage extends StatelessWidget { CounterBloc counterBloc = CounterBloc(); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: StreamBuilder<int>( stream: counterBloc.pressedCount, builder: (context, snapshot) { return Text( 'Flutter Counter Bloc Example - ${snapshot.data.toString()}', ); }), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text( 'You have pushed the button this many times:', ), StreamBuilder<int>( stream: counterBloc.pressedCount, builder: (context, snapshot) { return Text( '${snapshot.data.toString()}', style: Theme.of(context).textTheme.display1, ); }), ], ), ), floatingActionButton: Container( width: 100.0, height: 100.0, child: FloatingActionButton( onPressed: () { counterBloc.incrementCounter.add(null); }, tooltip: 'Increment', child: Text( "+ \n send \n to BLoC", textAlign: TextAlign.center, ), ), ), ); } }
- рд╣рдо рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рд╣рдо рдмреАрдПрд▓рдУрд╕реА рдкреИрдЯрд░реНрди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:
3.1 рд╕рднреА рд╡рд░реНрдЧ рдЧреБрдг рдФрд░ рд╡рд┐рдзрд┐рдпрд╛рдБ рдЫрд┐рдкреА рд╣реБрдИ рд╣реИрдВред
3.2 рд░рд╛рдЬреНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрди рдзрд╛рд░рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЧреЗрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рд╣рд░ рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ (рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рд▓реЗрдЦ рд╣реИ )ред
class CounterBloc { int _counter; CounterBloc() { _counter = 1; _actionController.stream.listen(_increaseStream); } final _counterStream = BehaviorSubject<int>.seeded(1); Stream get pressedCount => _counterStream.stream; Sink get _addValue => _counterStream.sink; StreamController _actionController = StreamController(); StreamSink get incrementCounter => _actionController.sink; void _increaseStream(data) { _counter += 1; _addValue.add(_counter); } void dispose() { _counterStream.close(); _actionController.close(); } }
рдпрд╣ рд╕рдм рд╣реИ, рд╣рдореЗрдВ рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓рд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╕реНрдЯреНрд░реАрдо рджреНрд╡рд╛рд░рд╛ рд░рд╛рдЬреНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреГрд╢реНрдп рднрд╛рдЧ рдореЗрдВ рдХрд┐рд╕реА рднреА рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдП рдмрд┐рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рд╕рднреА рдЧрдгрдирд╛, рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЖрджрд┐ рдХреЛ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдорд╛рддреНрд░рд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд╛рдЙрдВрдЯрд░ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓реЗрдмрд▓ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рдмрд╛рд╣рд░реА рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рдм рддрд░реНрдХ рдкрд╣рд▓реЗ рд╣реА BLoC рд╕реЗ рдЧреБрдЬрд░ рдЬрд╛рдПрдЧрд╛ - рд╣рдорд╛рд░реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдкрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдиреЛрдЯ 1: рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ> рдХрд╛рдЙрдВрдЯрд░рдмреНрд▓реЙрдХ рдХрд╛рдЙрдВрдЯрд░рдмреЙрдХ = рдХрд╛рдЙрдВрдЯрд░рдмреЛрд▓реЛрдХ (); рдФрд░ рдлрд┐рд░ рд╣рдо рдЗрд╕рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЕрдЧрд░ рд╣рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдХреНрд░реАрдиреЛрдВ рдкрд░ (рд╕реНрдкреЗрд╕рд▓ рдХреНрд▓рд╛рд╕реЗрд╕ рдореЗрдВ) рдЗрд╕ рдбреЗрдЯрд╛ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рддреЛ рд╣рдо рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХреЗ рд▓рд┐рдП рдЗрдирд╣реЗрд░рд┐рдЯреЗрдб рд╡рд┐рдЬреЗрдЯреНрд╕ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЕрдкрдиреА рдХреНрд▓рд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЧрд▓рдЯрди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
Github рдЙрджрд╛рд╣рд░рдг рдХреЛрдб
рд╕рднреА рдХреЛ рдЕрдЪреНрдЫрд╛ рдХреЛрдбрд┐рдВрдЧ!
рд╡рд┐рд╕реНрддрд╛рд░
рдЕрдЧрд▓реА рдХрдбрд╝реА рдореЗрдВ, рд╣рдо рд╡рд┐рднрд┐рдиреНрди рд╕реНрдХреНрд░реАрди рдкрд░ рд░рд╛рдЬреНрдп рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдлреЛрди рдХреА рд╕реНрдерд╛рдпреА рдореЗрдореЛрд░реА рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ, BLoC https://habr.com/en/post/485002/ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВред