рдпрд╣ рд▓реЗрдЦ " BLoC рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЙрджрд╛рд╣рд░рдг " рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реБрдЖ, рдЬрд╣рд╛рдВ рд╣рдордиреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдХрд┐ рдпрд╣ рдкреИрдЯрд░реНрди рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреНрд▓рд╛рд╕рд┐рдХ рд╕рд░рд▓ рдХрд╛рдЙрдВрдЯрд░ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдФрд░ рдореЗрд░реА рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдЖрд╡реЗрджрди рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдЙрддреНрддрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдВрдЧреЗ:
- рдЙрд╕ рд╡рд░реНрдЧ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдХреИрд╕реЗ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП рдЬрд┐рд╕рдореЗрдВ рдмреНрд▓реЛрдХ рдкреВрд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ
- рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВ
- (рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рд╢реНрди) рдмреАрдПрд▓рдУрд╕реА рдкреИрдЯрд░реНрди рдХреЗ рднреАрддрд░ рд░рд╣рддреЗ рд╣реБрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рд╕реНрдерд┐рддрд┐ рдХреИрд╕реЗ рдмрдирд╛рдП рд░рдЦреЗрдВ
рдиреАрдЪреЗ рдкрд░рд┐рдгрд╛рдореА рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдПрдХ рдПрдирд┐рдореЗрд╢рди рд╣реИ, рдФрд░ рдХрдЯ рдХреЗ рдиреАрдЪреЗ рдПрдХ рдбреАрдмреНрд░реАрдлрд┐рдВрдЧ рд╣реИ :)
рдФрд░ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ, рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд░рд┐рдПрдХреНрдЯрд┐рд╡рдПрдХреНрд╕ рдкреИрдЯрд░реНрди рд╕реЗ рдбреЗрдмреНрдпреВ рдСрдкрд░реЗрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдХреЛ рдХреИрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдПрдХреНрд╕ рдСрдмреНрдЬрд░реНрд╡рд░ рдкреИрдЯрд░реНрди рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИ)

рдЖрд╡реЗрджрди рдФрд░ рдЖрдзрд╛рд░ рдХреЛрдб рдХрд╛ рд╡рд┐рд╡рд░рдг
рдмреАрдПрд▓рдУрд╕реА рдФрд░ рдкреНрд░рджрд╛рддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ
- рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдмрдЯрди + - рд╣реИрдВ рдФрд░ рд╕реНрд╡рд╛рдЗрдк рдХрд░реЗрдВ рдЬреЛ рдЗрди рдмрдЯрдиреЛрдВ рдХреЛ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ
- рдПрдирд┐рдореЗрд╢рди рдлреНрд▓реИрдЯрд░ рдорд┐рдХреНрд╕рд┐рди рдмрд┐рд▓реНрдЯ-рдЗрди TickerProviderStateMixin рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рдмреАрдПрд▓рдУрд╕реА рдФрд░ рдкреНрд░рджрд╛рддрд╛ рд╕реЗ рдЬреБрдбрд╝рд╛
- рджреЛ рд╕реНрдХреНрд░реАрди - рдкрд╣рд▓реЗ рдПрдХ рдкрд░ рд╣рдо рд╕реНрд╡рд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ, рджреВрд╕рд░реЗ рдкрд░ рдХрд╛рдЙрдВрдЯрд░ рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ
- рд╣рдо рд░рд╛рдЬреНрдп рдХреЛ рдлреЛрди рдХреЗ рд╕реНрдерд╛рдпреА рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрддреЗ рд╣реИрдВ (рдЖрдИрдУрдПрд╕ рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдб, рдкреИрдХреЗрдЬ https://pub.dev/packages/sared_prever )
- рд▓рдЧрд╛рддрд╛рд░ рднрдВрдбрд╛рд░рдг рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рд▓рд┐рдЦрдирд╛ рдФрд░ рдкрдврд╝рдирд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдмреАрдПрд▓рдУрд╕реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА рдХрд░рддреЗ рд╣реИрдВ
рд╣рдо рдПрдХ рдЖрд╡реЗрджрди рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ
рдмреАрдПрд▓рдУрд╕реА рдкреИрдЯрд░реНрди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ , рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рд╡рд┐рдЧреЗрдЯреНрд╕ рд╕реЗ рд╕рднреА рд▓реЙрдЬрд┐рдХ рдХреЛ рджреВрд░ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЙрд╕ рд╡рд░реНрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рд╣реИрдВред
рдЙрд╕реА рд╕рдордп рд╕реЗ, рдЬрд┐рд╕ рд╡рд░реНрдЧ рдореЗрдВ рдмреАрдПрд▓рдУрд╕реА рд╕реНрдерд┐рдд рд╣реИ, рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдХреНрд░реАрди рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдореЗрдВ рдЗрд╕ рд╡рд░реНрдЧ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рд╡рд╕реНрддреБ рдХреЛ рдкреВрд░реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН:
- рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реБрдП, рддрдерд╛рдХрдерд┐рдд рд▓рд┐рдлреНрдЯрд┐рдВрдЧ рд╕реНрдЯреЗрдЯ рдЕрдк ред рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рднреНрд░рд╛рдордХ рд╣реИ, рдлрд┐рд░ рд░рд╛рдЬреНрдп рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреЛ рдЯреНрд░реИрдХ рди рдХрд░реЗрдВред
- рдЙрд╕ рд╡рд░реНрдЧ рд╕реЗ рдмрдирд╛рдПрдВ рдЬрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ BLoC рд╕рд┐рдВрдЧрд▓рдЯрди рд╣реИ рдФрд░ рдЬрд╣рд╛рдВ рд╣рдорд╛рд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡рд╣рд╛рдВ рдЖрдпрд╛рдд рдХрд░реЗрдВред рдпрд╣ рд╕рд░рд▓ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рд▓реЗрдХрд┐рди, рдореЗрд░реЗ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдЙрд▓рдЭрд╛рддрд╛ рд╣реИ рдФрд░ рддрд░реНрдХ рдХреЛ рдереЛрдбрд╝рд╛ рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИред
- рдкреНрд░рджрд╛рддрд╛ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ - рдЬрд┐рд╕реЗ рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдлрд╝реНрд▓рдЯрд░ рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡реАрдбрд┐рдпреЛ рджреЗрдЦреЗрдВ
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдкреНрд░рджрд╛рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ - рд╕рднреА рддрд░реАрдХреЛрдВ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рддрд╛рдХрдд рдирд╣реАрдВ рдереА :)
рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд░рдЪрдирд╛
рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд░реНрдЧ рд╣реИ
class SwipesBloc { // some stuff }
рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдЗрд╕ рд╡рд░реНрдЧ рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рдПрдХ рд╡рд╕реНрддреБ рдкреВрд░реЗ рд╡рд┐рдЬреЗрдЯ рдЯреНрд░реА рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рд╣рдо, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдЬреЗрдЯ рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрддрд░ рдкрд░, рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдПрдХ рдкреНрд░рджрд╛рддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рд╡рд┐рдЬреЗрдЯ рдЯреНрд░реА рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдпрд╣ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╕рдмрд╕реЗ рдХрдо рд╕рдВрднрд╡ рд╕реНрддрд░ рдкрд░ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред
class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MultiProvider( providers: [ Provider<SwipesBloc>(create: (_) => SwipesBloc()), ], child: MaterialApp( title: 'Swipe BLoC + Provider',
рдкреЗрдбрд╝ рдХреЗ рддрд▓ рдкрд░ рдХрд┐рд╕реА рднреА рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рдЗрд╕ рдЦреВрдмрд╕реВрд░рдд рдбрд┐рдЬрд╛рдЗрди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рднреА рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╕реНрддреБ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрдкрд▓рдмреНрдз рд╣реИред рдпрд╣рд╛рдВ рдФрд░ рдпрд╣рд╛рдВ рдкреНрд░рджрд╛рддрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рд╡рд░рдгред
рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рд╕реНрд╡рд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╕рд╛рд░рд╛ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░, рд╕рднреА рд╕реНрдХреНрд░реАрди рдкрд░, рдбреЗрдЯрд╛ рдХреЛ рдЙрд╕реА рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдмреАрдПрд▓рдУрд╕реА рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдмреАрдПрд▓рдУрд╕реА рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рди рдХреЗрд╡рд▓ рдзрд╛рд░рд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдлреЛрди рдХреА рд╕реНрдерд╛рдпреА рднрдВрдбрд╛рд░рдг рд╕реЗ рд╕реНрдерд┐рддрд┐ рдХреА рдкреНрд░рд╛рдкреНрддрд┐ рдФрд░ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рднреА рдХрд░рддреЗ рд╣реИрдВред
import 'dart:async'; import 'package:rxdart/rxdart.dart'; import 'package:shared_preferences/shared_preferences.dart'; class SwipesBloc { Future<SharedPreferences> prefs = SharedPreferences.getInstance(); int _counter; SwipesBloc() { prefs.then((val) { if (val.get('count') != null) { _counter = val.getInt('count') ?? 1; } else { _counter = 1; } _actionController.stream.listen(_changeStream); _addValue.add(_counter); }); } final _counterStream = BehaviorSubject<int>.seeded(1); Stream get pressedCount => _counterStream.stream; void get resetCount => _actionController.sink.add(null); Sink get _addValue => _counterStream.sink; StreamController _actionController = StreamController(); StreamSink get incrementCounter => _actionController.sink; void _changeStream(data) async { if (data == null) { _counter = 1; } else { _counter = _counter + data; } _addValue.add(_counter); prefs.then((val) { val.setInt('count', _counter); }); } void dispose() { _counterStream.close(); _actionController.close(); } }
рдпрджрд┐ рд╣рдо рдзреНрдпрд╛рди рд╕реЗ рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рджреЗрдЦреЗрдВ, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐:
- рдмрд╛рд╣реНрдп рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рдХреЛрдИ рднреА рдЧреБрдг рдзрд╛рд░рд╛рдУрдВ рдХреЗ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рд╣реИрдВред
- рдбрд┐рдЬрд╛рдЗрдирд░ рдореЗрдВ рдкрд╣рд▓реЗ рднрд╛рдЧ рдкрд░, рд╣рдо рдлреЛрди рдХреЗ рд╕реНрдерд╛рдпреА рднрдВрдбрд╛рд░рдг рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
- рдлреЛрди рдХреЗ рд╕реНрдерд╛рдпреА рднрдВрдбрд╛рд░рдг рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
рдПрдХ рдмреЗрд╣рддрд░ рд╕рдордЭ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯреЗ рдХрд╛рд░реНрдп:
- рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╕реЗ .then рд╕реЗ рдХреЛрдб рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдирд┐рдХрд╛рд▓рдХрд░ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрдЯреНрд░рд┐рдпрд░ рд╣реИред
- рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдкреНрд░рджрд╛рддрд╛ рдХреЗ рдмрд┐рдирд╛ рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдФрд░ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░реЗрдВ
рдЕрдм рд╣рдореЗрдВ рдмрдЯрди рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпрд╛ рд╕реНрд╡рд╛рдЗрдк рдХрд░рдиреЗ рдкрд░ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдпрд╣ рдбреЗрдЯрд╛ рдХрд╛рд░реНрдб рдФрд░ рдЕрд▓рдЧ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рдореИрдВрдиреЗ рдХреНрд▓рд╛рд╕рд┐рдХ рдХреЛ рдЪреБрдирд╛, рд╣рдо рдкреЗрдбрд╝ рдХреЗ рдЙрди рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
return Scaffold( body: Consumer<SwipesBloc>( builder: (context, _swipesBloc, child) { return StreamBuilder<int>( stream: _swipesBloc.pressedCount, builder: (context, snapshot) { String counterValue = snapshot.data.toString(); return Stack( children: <Widget>[ Container(
рдареАрдХ рд╣реИ, рдлрд┐рд░ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
_swipesBloc.pressedCount,
рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░
_swipesBloc.incrementCounter.add(1);
рдпрд╣ рд╕рдм рд╣реИ, рд╣рдореЗрдВ рдмреАрдПрд▓рдУрд╕реА рдкреИрдЯрд░реНрди рдХреЗ рдирд┐рдпрдореЛрдВ рдореЗрдВ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдХреЛрдб рдорд┐рд▓рд╛ рд╣реИред
рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг
рдкрд░реАрдХреНрд╖рдг
рдЖрдк рд╡рд┐рдЧреЗрдЯреНрд╕ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдореЛрдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк e2e рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдо рд╡рд┐рдЬреЗрдЯреНрд╕ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗ рдФрд░ рдХрд╛рдЙрдВрдЯрд░ рдХреА рд╡реГрджреНрдзрд┐ рдХреИрд╕реЗ рд╣реБрдИ, рдЗрд╕ рдкрд░ рдПрдХ рдЪреЗрдХ рдХреЗ рд╕рд╛рде рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рдПрдВрдЧреЗред рдпрд╣рд╛рдБ рдФрд░ рдпрд╣рд╛рдБ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдкрд░ рдЬрд╛рдирдХрд╛рд░реАред
рд╡рд┐рдЬреЗрдЯ рдкрд░реАрдХреНрд╖рдг
рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдбреЗрдЯрд╛ рд╣реЛрддрд╛, рддреЛ рд╣рдо рд╡рд┐рдЬреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдЯреЗрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рдереЗред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рдпрд╣ рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд┐рдЬреЗрдЯ рдХреИрд╕реЗ рдмрдирд╛рдП рдЧрдП рдереЗ рдФрд░ рдЖрд░рдВрднреАрдХрд░рдг рдХреИрд╕реЗ рд╣реБрдЖред
рдХреЛрдб рдпрд╣рд╛рдВ рд╣реИ , рдХреЛрдб рдореЗрдВ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд╛рдЙрдВрдЯрд░ рд╡реГрджреНрдзрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рд╣реИ - рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбреЗрдЯрд╛ рдмреАрдПрд▓рдУрд╕реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддрд╛ рд╣реИред
рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
flutter test
рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг
рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдХрд▓реНрдк рдореЗрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдПрдореБрд▓реЗрдЯрд░ рдкрд░ рдЪрд▓рддрд╛ рд╣реИ, рд╣рдо рдмрдЯрди рджрдмрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реНрд╡рд╛рдЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХреНрдпрд╛ рд╣реБрдЖред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо 2 рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рддреЗ рд╣реИрдВ:
test_driver / app.dart
test_driver / app_test.dart
рдкрд╣рд▓реЗ рдореЗрдВ, рд╣рдо рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ, рд╕реАрдзреЗ рдкрд░реАрдХреНрд╖рдгред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЬрд╛рдВрдЪ рдХреА:
- рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрд╡рд╕реНрдерд╛
- рдПрдХ рдмрдЯрди рджрдмрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдХрд╛рдЙрдВрдЯрд░ рд╡реЗрддрди рд╡реГрджреНрдзрд┐
import 'package:flutter_driver/flutter_driver.dart'; import 'package:test/test.dart'; void main() { group( 'park-flutter app', () { final counterTextFinder = find.byValueKey('counterKey'); final buttonFinder = find.byValueKey('incrementPlusButton'); FlutterDriver driver; setUpAll(() async { driver = await FlutterDriver.connect(); }); tearDownAll(() async { if (driver != null) { driver.close(); } }); test('test init value', () async { expect(await driver.getText(counterTextFinder), ^_^quot quot^_^); }); test('test + 1 value after tapped', () async { await driver.tap(buttonFinder); // Then, verify the counter text is incremented by 1. expect(await driver.getText(counterTextFinder), ^_^quot quot^_^); }); }, ); }
рд╡рд╣рд╛рдВ рдХрд╛ рдХреЛрдб
рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
flutter drive --target=test_driver/app.dart
рдХрд╛рд░реНрдп
рдмрд╕ рдЕрдкрдиреА рд╕рдордЭ рдХреЛ рдЧрд╣рд░рд╛ рдХрд░рдирд╛ рд╣реИред рдЖрдзреБрдирд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ (рд╕рд╛рдЗрдЯреЛрдВ) рдореЗрдВ, рд░рд┐рдПрдХреНрдЯрд┐рд╡рдПрдХреНрд╕ рд╕реЗ рдбреЗрдмреНрдпреВ рдлрд╝рдВрдХреНрд╢рди рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
- рдЦреЛрдЬ рдкрдЯреНрдЯреА рдореЗрдВ рдПрдХ рд╢рдмреНрдж рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕рдВрдХреЗрдд рддрднреА рдирд┐рдХрд▓рддрд╛ рд╣реИ рдЬрдм рдЕрдХреНрд╖рд░реЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ 2 рд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ
- рдЬрдм рдкрд╕рдВрдж рдбрд╛рд▓ рджреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдЖрдк рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 10 рдмрд╛рд░ рдХреНрд▓рд┐рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд▓реЗрдЦрди рддрдм рд╣реЛрдЧрд╛ рдЬрдм рдХреНрд▓рд┐рдХ рдореЗрдВ рдЕрдВрддрд░рд╛рд▓ 2-3 рд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рдерд╛
- ... рдЖрджрд┐ред
рдХрд╛рд░реНрдп: рдЕрдВрдХреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рддрднреА рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдм + рдпрд╛ - рдХреЗ рдкреНрд░реЗрд╕ рдХреЗ рдмреАрдЪ 2 рд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рдмреАрдд рдЬрд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рдмреАрдПрд▓рдУрд╕реА рд╡рд░реНрдЧ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ, рдмрд╛рдХреА рдХреЛрдб рд╕рдорд╛рди рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╡рд╣ рд╕рдм рд╣реИред рдЕрдЧрд░ рдХреБрдЫ рдЯреЗрдврд╝рд╛ рдпрд╛ рдЧрд▓рдд рд╣реИ, рддреЛ рдпрд╣реАрдВ рдпрд╛ рдЬреАрдердм рдкрд░, рдЖрджрд░реНрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ :)
рд╕рднреА рдХреЛ рдЕрдЪреНрдЫрд╛ рдХреЛрдбрд┐рдВрдЧ!