RxDart рд╕рдмрд╕реЗ рдЫреЛрдЯреА ... рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП


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


рдиреАрдЪреЗ, рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ 50 рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ, рдореИрдВ рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рдЙрджрд╛рд╣рд░рдг рджреНрд╡рд╛рд░рд╛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдЬреЛ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рд╣реИ


a) рдпрд╣ рдСрдлрд╝рд▓рд╛рдЗрди / рдСрдирд▓рд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ
b) рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ
рдЧ) рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ


рдореЗрд░реЗ рдЬрд▓реНрджрдмрд╛рдЬреА рдХреЗ рдЖрд▓реЛрдЪрдХреЛрдВ рдХреЛ
рдЬреЛ рдмрд┐рдирд╛ рд╕реЛрдЪреЗ-рд╕рдордЭреЗ рдпреБрджреНрдз рдореЗрдВ рднрд╛рдЧ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ BlocProvider рдПрдХ рдкреНрд░рджрд╛рддрд╛ рд╣реИ , рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдореВрд▓ рд▓реЗрдЦ , рдПрдХ рд▓рд┐рдВрдХ, рдЬреЛ рдлрд╝реНрд▓рдЯрд░_рдмреНрд▓реЙрдХ рдкреГрд╖реНрда рдкрд░ рд╣реИ, рд╡рд░реНрдгрди рдХреА рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред


рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рдЙрджрд╛рд╣рд░рдг "рдХрд╛рдЙрдВрдЯрд░" рдЬреЛ рдПрдХ рд╕реНрдкрдВрджрди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╕рдордп рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ рдЪрд╛рдмреБрдХ рдорд╛рд░рдиреЗ рд╡рд╛рд▓рд╛ рд▓рдбрд╝рдХрд╛ рдХрдИ рдкреНрд░рдерд╛рдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБред
рддреЛ, рдЗрд╕рдореЗрдВ MyHomePage extends StatefulWidget рд╢рд╛рдорд┐рд▓ MyHomePage extends StatefulWidget , рд╡реГрджреНрдзрд┐рд╢реАрд▓ рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП _incrementCounter рд╡рд┐рдзрд┐ рдФрд░ рдкреВрд░реЗ рд╡рд┐рдЬреЗрдЯ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рдлрд┐рд░ рд╕реЗ setState рд▓рд┐рдП setState ред


рд╣рдо rxdart рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдХреБрдЫ рд╕рд░рд▓ рдЪрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп rxdart :


Pubspec.yaml рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЬреЛрдбрд╝реЗрдВ


 dependencies: ... rxdart: 0.22.2 

рдХрд╛рдЙрдВрдЯрд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдмрджрд▓реЗрдВ рдФрд░ рдИрд╡реЗрдВрдЯ рдЬреЛрдбрд╝реЗрдВ


 class _Counter { int _count; int get count => _count; _Counter(this._count) : this.onCounterUpd = BehaviorSubject<int>.seeded(_count); ///  . final BehaviorSubject<int> onCounterUpd; ///     ,   . Future incrementCounter() async { onCounterUpd.add(++_count); } } final _counter = _Counter(5); 

рдХрдХреНрд╖рд╛ рдХреЛ рд╕реНрдЯреЗрдЯрд▓реЗрд╕рд╡рд┐рдЬреЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ


 ///   " " class MyHomeRxPage extends StatelessWidget { final title; /// ! -     const MyHomeRxPage({Key key, this.title}) : super(key: key); ... 

StreamBuilder рдореЗрдВ рдбрд┐рд╕реНрдкреНрд▓реЗ рд╡рд┐рдЬреЗрдЯ рд▓рдкреЗрдЯреЗрдВ рдФрд░ рдХреЙрд▓ рдХреЛ рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рд╡рд┐рдзрд┐ рдореЗрдВ рдмрджрд▓реЗрдВ


  StreamBuilder<int>( stream: _counter.onCounterUpd, builder: (context, snapshot) { return Text( '${snapshot.data}', style: Theme.of(context).textTheme.display1, ); }), ... floatingActionButton: FloatingActionButton( onPressed: _counter.incrementCounter, ... 

рд╡рд╣ рд╕рдм рд╣реИред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ


 import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:rxdart/rxdart.dart'; class _Counter { int _count; int get count => _count; _Counter(this._count) : this.onCounterUpd = BehaviorSubject<int>.seeded(_count); ///  . final BehaviorSubject<int> onCounterUpd; ///     ,   . Future incrementCounter() async { onCounterUpd.add(++_count); } } final _counter = _Counter(5); /// class MyHomeRxPage extends StatelessWidget { final title; /// ! -     const MyHomeRxPage({Key key, this.title}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( // Here we take the value from the MyHomePage object that was created by // the App.build method, and use it to set our appbar title. title: Text(title), ), body: Center( // Center is a layout widget. It takes a single child and positions it // in the middle of the parent. child: Column( // Column is also a layout widget. It takes a list of children and // arranges them vertically. By default, it sizes itself to fit its // children horizontally, and tries to be as tall as its parent. // // Invoke "debug painting" (press "p" in the console, choose the // "Toggle Debug Paint" action from the Flutter Inspector in Android // Studio, or the "Toggle Debug Paint" command in Visual Studio Code) // to see the wireframe for each widget. // // Column has various properties to control how it sizes itself and // how it positions its children. Here we use mainAxisAlignment to // center the children vertically; the main axis here is the vertical // axis because Columns are vertical (the cross axis would be // horizontal). mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ StreamBuilder<int>( stream: _counter.onCounterUpd, builder: (context, snapshot) { return Text( 'You have pushed the button ${snapshot.data} times:', ); }), // Text( // 'You have pushed the button this many times:', // ), /// 6. StreamBuilder<int>( stream: _counter.onCounterUpd, builder: (context, snapshot) { return Text( '${snapshot.data}', style: Theme.of(context).textTheme.display1, ); }), ], ), ), floatingActionButton: FloatingActionButton( onPressed: _counter.incrementCounter, tooltip: 'Increment', child: Icon(Icons.add), ), // This trailing comma makes auto-formatting nicer for build methods. ); } } 

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


  StreamBuilder<int>( stream: onCounterUpd, builder: (context, snapshot) { return Text( 'You have pushed the button ${snapshot.data} times:', ); }), // Text( // 'You have pushed the button this many times:', // ), 

рдФрд░ рдЖрд╡рд╛рдЬ!


рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, InheritedWidget, рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред


рдЗрд╕рд▓рд┐рдП, рдЙрдореНрдореАрдж рд╣реИ, рдореИрдВрдиреЗ рд╡рд╣ рдХрд░ рджрд┐рдЦрд╛рдпрд╛


  • рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдмрд╣реБрдд рдЖрд╕рд╛рди InheritedWidgets , BlocProvider , рдЖрджрд┐ред
  • рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдСрдлрд╝рд▓рд╛рдЗрди / рдСрдирд▓рд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рд╡рд╣ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ, рд╕рд░рд▓рддрдо рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдкрдХреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдХрдХреНрд╖рд╛рдПрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
  • рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдЙрддреНрддрд░рджрд╛рдпреА рдпреВрдЖрдИ рд╣реИ, рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рддреЗрдЬреА рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░, рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рддреЛрдВ рдореЗрдВ рдХреЛрдб рдХреЗ рд╕реБрд╢реЛрднрд┐рдд рдкреГрдердХреНрдХрд░рдг: рдПрдорд╡реАрд╕реА, рдПрдорд╡реАрдкреА, рдПрдорд╡реАрдЖрдИ, рдПрдорд╡реАрд╡реАрдПрдо, рдЬреЛ рднреА рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЛрдб (рд╢рд╛рдЦрд╛ iter_0004_rxdart )


рдПрдХ рдШрдВрдЯреЗ рдмрд╛рдж рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛
рд╡реНрдпрд░реНрде рдореЗрдВ, рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рдерд╛, "рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░" рдХреЗ рд▓рд┐рдП рдХреНрд▓рд┐рдХреЗрдВ рдорд┐рд▓реАрдВ рдФрд░ BehaviorSubject рдХреА рдПрдХ рдЧрд▓рдд рд╕рдордЭ рд╢реБрд░реВ рдХреА рдЧрдИ, рдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛,

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


All Articles