рдбрд╛рд░реНрдЯ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг

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


рдпрд╛ рддреЛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдЖрдпрд╛ рд╣реИред рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдореВрд▓реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:


  • рдмрд╛рдПрдВ (рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ);
  • рд╕рд╣реА (рдпрджрд┐ рд╕рдлрд▓ рд╣реЛ)ред

рдпрд╛ рддреЛ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
/// Signature of callbacks that have no arguments and return right or left value. typedef Callback<T> = void Function(T value); /// Represents a value of one of two possible types (a disjoint union). /// Instances of [Either] are either an instance of [Left] or [Right]. /// FP Convention dictates that: /// [Left] is used for "failure". /// [Right] is used for "success". abstract class Either<L, R> { Either() { if (!isLeft && !isRight) throw Exception('The ether should be heir Left or Right.'); } /// Represents the left side of [Either] class which by convention is a "Failure". bool get isLeft => this is Left<L, R>; /// Represents the right side of [Either] class which by convention is a "Success" bool get isRight => this is Right<L, R>; L get left { if (this is Left<L, R>) return (this as Left<L, R>).value; else throw Exception('Illegal use. You should check isLeft() before calling '); } R get right { if (this is Right<L, R>) return (this as Right<L, R>).value; else throw Exception('Illegal use. You should check isRight() before calling'); } void either(Callback<L> fnL, Callback<R> fnR) { if (isLeft) { final left = this as Left<L, R>; fnL(left.value); } if (isRight) { final right = this as Right<L, R>; fnR(right.value); } } } class Left<L, R> extends Either<L, R> { final L value; Left(this.value); } class Right<L, R> extends Either<L, R> { final R value; Right(this.value); } 

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


рдХреЛрд╢рд┐рд╢ рдХрд░реЛ / рдЙрджрд╛рд╣рд░рдг рдкрдХрдбрд╝реЛ
 class ContactBloc { final ContactRepository contactRepository; ContactBloc(this.contactRepository); @override Stream<ContactState> mapEventToState(ContactEvent event) async* { if (event is GetContactEvent) { yield LoadContactState(); try { var contact = contactRepository.getById(event.id); yield ContactIsShowingState(contact); } on NetworkConnectionException catch (e) { yield NetworkExceptionState(e); } catch (e) { yield UnknownExceptionState(e); } } } } abstract class ContactRepository { Future<Contact>getById(int id); } 

рдпрд╛ рддреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде
 class ContactBloc { final ContactRepository contactRepository; ContactBloc(this.contactRepository); @override Stream<ContactState> mapEventToState(ContactEvent event) async* { if (event is GetContactEvent) { yield LoadContactState(); final either = contactRepository.getById(event.id); if (either.isRight) { final contact = either.right; yield ContactIsShowingState(contact); } else { final failure = either.left; if (failure is NetworkFailure) yield NetworkFailureState(failure); if (failure is UnknownFailure) yield UnknownFailureState(failure); } } } } abstract class ContactRepository { Future<Either<Failure, Contact>>getById(int id); } 

рдкрдардиреАрдпрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдХреЛрдИ рдмрд╣рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╢рд╛рдпрдж рдХрд┐рд╕реА рдХреЛ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ / рдкрдХрдбрд╝рдиреЗ рдХрд╛ рдЖрджреА рд╣реИ рдФрд░ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рд╕рд╣реА рд╣реЛрдЧрд╛, рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ рд╣реИред рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рд╕реНрд╡рдпрдВ рдЕрд╕рдлрд▓рддрд╛ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрд╛рдИрдВ рдУрд░ рд▓реМрдЯ рд╕рдХрддреЗ рд╣реИрдВред рдЪрд▓реЛ рдПрдХ рд╕рд╛рд░ рд╡рд┐рдлрд▓рддрд╛ рд╣реИ, рдпрд╣ рд╕рднреА ServerFailure, NetworkFailure рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдФрд░ рдореМрдЬреВрджрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ ContactFailure рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЖрдо рд╣реИред рдмреНрд▓реЙрдХ рдореЗрдВ, рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд╛рдиреЗрдВрдЧреЗ рдХрд┐ рдХрд┐рд╕ рд╡рд┐рдлрд▓рддрд╛ рдХреА рдЙрдореНрдореАрдж рд╣реИред


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


рдХрд┐рд╕реА рдХреЛ рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╕рдВрдж рдирд╣реАрдВ рдЖ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рд╡реНрдпрд░реНрде рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕рд┐рд░реНрдл рдЖрдкрдХреЛ рдбрд╛рд░реНрдЯ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреА рддрд░рд╣ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реБрдЖред


рд╕рдВрд╕рд╛рдзрди:


рд╕реНрд░реЛрдд рдХреЛрдб

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


All Articles