{"id":26859,"date":"2026-07-17T12:44:22","date_gmt":"2026-07-17T12:44:22","guid":{"rendered":"https:\/\/umang.pk\/2026\/07\/17\/%d8%a2%d8%a8%d8%b2%d8%b1%d9%88%d8%b1-%da%88%db%8c%d8%b2%d8%a7%d8%a6%d9%86-%d9%be%db%8c%d9%b9%d8%b1%d9%86-%db%81%db%8c%d9%86%da%88-%d8%a8%da%a9-%da%88%d8%a7%d8%b1%d9%b9-%d9%85%db%8c%da%ba-%d8%a7%db%8c\/"},"modified":"2026-07-17T12:44:22","modified_gmt":"2026-07-17T12:44:22","slug":"%d8%a2%d8%a8%d8%b2%d8%b1%d9%88%d8%b1-%da%88%db%8c%d8%b2%d8%a7%d8%a6%d9%86-%d9%be%db%8c%d9%b9%d8%b1%d9%86-%db%81%db%8c%d9%86%da%88-%d8%a8%da%a9-%da%88%d8%a7%d8%b1%d9%b9-%d9%85%db%8c%da%ba-%d8%a7%db%8c","status":"publish","type":"post","link":"https:\/\/umang.pk\/ur\/2026\/07\/17\/%d8%a2%d8%a8%d8%b2%d8%b1%d9%88%d8%b1-%da%88%db%8c%d8%b2%d8%a7%d8%a6%d9%86-%d9%be%db%8c%d9%b9%d8%b1%d9%86-%db%81%db%8c%d9%86%da%88-%d8%a8%da%a9-%da%88%d8%a7%d8%b1%d9%b9-%d9%85%db%8c%da%ba-%d8%a7%db%8c\/","title":{"rendered":"\u0622\u0628\u0632\u0631\u0648\u0631 \u0688\u06cc\u0632\u0627\u0626\u0646 \u067e\u06cc\u0679\u0631\u0646 \u06c1\u06cc\u0646\u0688 \u0628\u06a9: \u0688\u0627\u0631\u0679 \u0645\u06cc\u06ba \u0627\u06cc\u0648\u0646\u0679 \u0633\u06d2 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u0627 \u0622\u0631\u06a9\u06cc\u0679\u06cc\u06a9\u0686\u0631 \u0627\u0648\u0631 \u0688\u0648\u0645\u06cc\u0646 \u0633\u06d2 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u0627 \u0688\u06cc\u0632\u0627\u0626\u0646"},"content":{"rendered":"\n<div id=\"\">\n<p>\u06c1\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0648 \u06a9\u0633\u06cc \u0646\u06c1 \u06a9\u0633\u06cc \u0648\u0642\u062a \u0628\u0646\u06cc\u0627\u062f\u06cc \u0645\u0633\u0627\u0626\u0644 \u0633\u06d2 \u0646\u0645\u0679\u0646\u0627 \u067e\u0691\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u062c\u0628 \u06a9\u0686\u06be \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u06a9\u0626\u06cc \u0645\u062e\u062a\u0644\u0641 \u06a9\u0627\u0645\u0648\u06ba \u06a9\u0648 \u0627\u0633 \u067e\u0631 \u0631\u062f\u0639\u0645\u0644 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<p>\u062c\u0628 \u06a9\u0648\u0626\u06cc \u0635\u0627\u0631\u0641 \u0644\u0627\u06af \u0627\u0646 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0622\u067e \u06a9\u06cc \u0627\u06cc\u067e \u06a9\u0648 \u0679\u0648\u06a9\u0646 \u06a9\u0648 \u0630\u062e\u06cc\u0631\u06c1 \u06a9\u0631\u0646\u0627\u060c \u0635\u0627\u0631\u0641 \u067e\u0631\u0648\u0641\u0627\u0626\u0644 \u06a9\u0648 \u06a9\u06cc\u0634 \u06a9\u0631\u0646\u0627\u060c \u062a\u062c\u0632\u06cc\u0627\u062a\u06cc \u0648\u0627\u0642\u0639\u0627\u062a \u06a9\u0648 \u0641\u0627\u0626\u0631 \u06a9\u0631\u0646\u0627\u060c \u0627\u0648\u0631 \u06c1\u0648\u0645 \u0627\u0633\u06a9\u0631\u06cc\u0646 \u067e\u0631 \u0646\u06cc\u0648\u06cc\u06af\u06cc\u0679 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<p>\u0627\u062f\u0627\u0626\u06cc\u06af\u06cc \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06c1\u0648\u0646\u06cc \u0686\u0627\u06c1\u06cc\u06d2\u060c \u0627\u0646\u0648\u06cc\u0646\u0679\u0631\u06cc \u06a9\u0648 \u0627\u067e \u0688\u06cc\u0679 \u06a9\u06cc\u0627 \u062c\u0627\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u060c \u0635\u0627\u0631\u0641 \u06a9\u0648 \u0627\u06cc\u06a9 \u0631\u0633\u06cc\u062f \u0645\u0644\u0646\u06cc \u0686\u0627\u06c1\u06cc\u06d2\u060c \u0627\u0648\u0631 \u062a\u06a9\u0645\u06cc\u0644 \u06a9\u06d2 \u0646\u0638\u0627\u0645 \u06a9\u0648 \u0688\u06cc\u0644\u06cc\u0648\u0631\u06cc \u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06cc \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<p>\u0633\u06cc\u0646\u0633\u0631 \u0631\u06cc\u0688\u0646\u06af\u0632 \u0628\u062f\u0644 \u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0646\u0626\u06cc \u0627\u0642\u062f\u0627\u0631 \u06a9\u0648 \u0628\u06cc\u06a9 \u0648\u0642\u062a \u062a\u06cc\u0646 \u0645\u062e\u062a\u0644\u0641 UI \u067e\u06cc\u0646\u0644\u0632 \u0645\u06cc\u06ba \u0645\u0646\u0639\u06a9\u0633 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0633\u0627\u062f\u06c1 \u062d\u0644 \u06cc\u06c1 \u06c1\u0648 \u06af\u0627 \u06a9\u06c1 \u062a\u0645\u0627\u0645 \u0645\u0646\u0637\u0642 \u06a9\u0648 \u0627\u06cc\u06a9 \u062c\u06af\u06c1 \u0644\u06a9\u06be \u062f\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4 \u0627\u06cc\u06a9 \u0641\u0646\u06a9\u0634\u0646 \u062c\u0648 \u06cc\u06c1 \u0633\u0628 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u06cc\u0627 \u0627\u06cc\u06a9 \u06a9\u0644\u0627\u0633 \u062c\u0648 \u0633\u0628 \u06a9\u0686\u06be \u062c\u0627\u0646\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u0633\u0628 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2. \u067e\u06be\u0631 \u062a\u0642\u0627\u0636\u06d2 \u0628\u062f\u0644 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0622\u067e \u06a9\u0648 \u0627\u06cc\u06a9 \u0646\u06cc\u0627 \u0631\u062f\u0639\u0645\u0644 \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4 \u0622\u067e \u06a9\u0648 \u0645\u0648\u062c\u0648\u062f\u06c1 \u0627\u0646\u062f\u0631\u0627\u062c \u06a9\u0648 \u06c1\u0679\u0627\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u06af\u06cc\u06d4 \u0636\u0645\u0646\u06cc \u0627\u062b\u0631\u0627\u062a \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648\u0646\u06d2 \u0644\u06af\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0628\u0627\u0642\u06cc \u0633\u0628 \u06a9\u0686\u06be \u0627\u0646 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06af\u0631 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0648\u0688 \u0630\u0645\u06c1 \u062f\u0627\u0631\u06cc \u06a9\u06cc \u0627\u06cc\u06a9 \u062f\u06cc\u0648\u0627\u0631 \u0628\u0646 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0646\u0627\u0642\u0627\u0628\u0644 \u0628\u0631\u062f\u0627\u0634\u062a\u060c \u0628\u0691\u06be\u0627\u0646\u0627 \u0645\u0634\u06a9\u0644 \u0627\u0648\u0631 \u0686\u06be\u0648\u0646\u0627 \u062e\u0637\u0631\u0646\u0627\u06a9 \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u0628\u0635\u0631 \u0688\u06cc\u0632\u0627\u0626\u0646 \u067e\u06cc\u0679\u0631\u0646 \u0628\u0627\u0644\u06a9\u0644 \u0627\u0633 \u0645\u0633\u0626\u0644\u06d2 \u06a9\u0648 \u062d\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u0626\u06d2 \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2. \u06cc\u06c1 \u0627\u06cc\u06a9 \u0645\u0646\u0638\u0645\u060c \u067e\u06cc\u062f\u0627\u0648\u0627\u0631 \u06a9\u06cc \u0633\u0637\u062d \u06a9\u0627 \u0637\u0631\u06cc\u0642\u06c1 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u062c\u0628 \u06cc\u06c1 \u0648\u0627\u0642\u0639\u06c1 \u067e\u06cc\u0634 \u0622\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0648\u0627\u0642\u0639\u06c1 \u06a9\u0627 \u0630\u0631\u06cc\u0639\u06c1 \u062f\u0644\u0686\u0633\u067e\u06cc \u0631\u06a9\u06be\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u06c1\u0631 \u06a9\u0633\u06cc \u06a9\u0648 \u06cc\u06c1 \u062c\u0627\u0646\u06d2 \u0628\u063a\u06cc\u0631 \u0645\u0637\u0644\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0648\u06c1 \u0644\u0648\u06af \u06a9\u0648\u0646 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u0633 \u06c1\u06cc\u0646\u0688 \u0628\u06a9 \u0645\u06cc\u06ba\u060c \u0622\u067e \u067e\u06c1\u0644\u06d2 \u0627\u0635\u0648\u0644\u0648\u06ba \u0633\u06d2 \u0622\u0628\u0632\u0631\u0648\u0631 \u067e\u06cc\u0679\u0631\u0646 \u0633\u06cc\u06a9\u06be\u06cc\u06ba \u06af\u06d2\u06d4 \u062f\u06cc\u06a9\u06be\u06cc\u06ba \u06a9\u06c1 \u0627\u0633\u06d2 \u0688\u0627\u0631\u0679 \u0645\u06cc\u06ba \u06a9\u06cc\u0633\u06d2 \u0644\u0627\u06af\u0648 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u060c \u0633\u0645\u062c\u06be\u06cc\u06ba \u06a9\u06c1 \u0627\u06cc\u0648\u0646\u0679 \u0633\u06d2 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0622\u0631\u06a9\u06cc\u0679\u06cc\u06a9\u0686\u0631 \u0633\u06d2 \u06a9\u06cc\u0633\u06d2 \u062c\u0691\u0627 \u062c\u0627\u0626\u06d2\u060c \u0627\u0648\u0631 \u0627\u0635\u0644\u06cc \u0641\u0644\u0679\u0631 \u0627\u06cc\u067e\u0644\u06cc \u06a9\u06cc\u0634\u0646\u0632 \u0645\u06cc\u06ba \u0688\u0648\u0645\u06cc\u0646 \u0633\u06d2 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0688\u06cc\u0632\u0627\u0626\u0646 \u0627\u0648\u0631 \u0631\u06cc\u0648\u0631 \u067e\u0648\u0688 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0635\u0641\u0627\u0626\u06cc \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0645\u0631\u0628\u0648\u0637 \u06c1\u0648\u0646\u06d2 \u06a9\u0627 \u0637\u0631\u06cc\u0642\u06c1 \u0633\u06cc\u06a9\u06be\u06cc\u06ba\u06d4<\/p>\n<p>\u0622\u062e\u0631 \u0645\u06cc\u06ba\u060c \u0622\u067e \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0648 \u0646\u06c1\u06cc\u06ba \u0633\u0645\u062c\u06be \u067e\u0627\u0626\u06cc\u06ba \u06af\u06d2\u06d4 \u0622\u067e \u0627\u067e\u0646\u06d2 \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u06a9\u0648\u0688 \u0645\u06cc\u06ba \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u0627\u0633\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0637\u0631\u06cc\u0642\u06c1 \u0633\u06cc\u06a9\u06be\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<h2 id=\"heading-table-of-contents\">\u0627\u0646\u0688\u06cc\u06a9\u0633<\/h2>\n<h2 id=\"heading-what-is-the-observer-design-pattern\">\u0645\u0628\u0635\u0631 \u0688\u06cc\u0632\u0627\u0626\u0646 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u06cc\u0627 \u06c1\u06d2\u061f<\/h2>\n<p>\u0622\u0628\u0632\u0631\u0648\u0631 \u067e\u06cc\u0679\u0631\u0646 \u0627\u06cc\u06a9 \u0637\u0631\u0632 \u0639\u0645\u0644 \u0688\u06cc\u0632\u0627\u0626\u0646 \u067e\u06cc\u0679\u0631\u0646 \u06c1\u06d2 \u062c\u0648 \u0627\u0634\u06cc\u0627\u0621 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0627\u06cc\u06a9 \u0633\u06d2 \u06a9\u0626\u06cc \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062c\u0628 \u0627\u06cc\u06a9 \u0622\u0628\u062c\u06cc\u06a9\u0679 \u062d\u0627\u0644\u062a \u0628\u062f\u0644\u062a\u0627 \u06c1\u06d2 \u06cc\u0627 \u06a9\u0633\u06cc \u0648\u0627\u0642\u0639\u06c1 \u06a9\u0648 \u0628\u0691\u06be\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0627\u0633 \u0622\u0628\u062c\u06cc\u06a9\u0679 \u06a9\u06d2 \u062a\u0645\u0627\u0645 \u0627\u0646\u062d\u0635\u0627\u0631 \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u0645\u0637\u0644\u0639 \u0627\u0648\u0631 \u0627\u067e \u0688\u06cc\u0679 \u06c1\u0648 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u062e\u0628\u0627\u0631 \u06a9\u06cc \u0631\u06a9\u0646\u06cc\u062a \u06a9\u06cc \u062e\u062f\u0645\u062a \u067e\u0631 \u063a\u0648\u0631 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u062e\u0628\u0627\u0631 \u067e\u0628\u0644\u0634\u0631\u0632 \u0646\u06c1\u06cc\u06ba \u062c\u0627\u0646\u062a\u06d2 \u06a9\u06c1 \u0627\u0646 \u06a9\u06d2 \u0627\u0646\u0641\u0631\u0627\u062f\u06cc \u0633\u0628\u0633\u06a9\u0631\u0627\u0626\u0628\u0631\u0632 \u06a9\u0648\u0646 \u06c1\u06cc\u06ba\u06d4 \u06c1\u0645 \u06c1\u0631 \u0642\u0627\u0631\u06cc \u06a9\u0648 \u0630\u0627\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0646\u06c1\u06cc\u06ba \u06a9\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06c1\u0631 \u0633\u0628\u0633\u06a9\u0631\u0627\u0626\u0628\u0631 \u062c\u0648 \u06a9\u0627\u063a\u0630 \u0634\u0627\u0626\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0631\u062c\u0633\u0679\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0633\u06d2 \u0648\u0635\u0648\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0633\u0628\u0633\u06a9\u0631\u0627\u0626\u0628\u0631\u0632 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0648\u0642\u062a \u0645\u0646\u0633\u0648\u062e \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0646\u0626\u06d2 \u0633\u0628\u0633\u06a9\u0631\u0627\u0626\u0628\u0631\u0632 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0648\u0642\u062a \u0634\u0627\u0645\u0644 \u06c1\u0648 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u067e\u0628\u0644\u0634\u0631 \u06a9\u0627 \u06a9\u0627\u0645 \u06a9\u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba \u0628\u062f\u0644\u062a\u0627\u06d4 \u0628\u0633 \u0627\u0633\u06d2 \u0634\u0627\u0626\u0639 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u06cc\u06c1 \u0645\u0628\u0635\u0631 \u067e\u06cc\u0679\u0631\u0646 \u06c1\u06d2.<\/p>\n<p>\u0627\u0633\u06d2 \u067e\u0628\u0644\u0634\u0631 \u06a9\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <strong>\u0645\u0648\u0636\u0648\u0639<\/strong>. \u0648\u06c1 \u0633\u0628\u0633\u06a9\u0631\u0627\u0626\u0628\u0631 \u06a9\u06c1\u0644\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <strong>\u0645\u0628\u0635\u0631<\/strong>. \u0627\u062e\u0628\u0627\u0631 \u06c1\u06d2\u06d4 <strong>\u0648\u0627\u0642\u0639\u06c1<\/strong>.<\/p>\n<p>\u0627\u0633 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u06cc \u0628\u0627\u0642\u0627\u0639\u062f\u06c1 \u0648\u0636\u0627\u062d\u062a \u06af\u06cc\u0646\u06af \u0622\u0641 \u0641\u0648\u0631 \u0628\u06a9 \u0688\u06cc\u0632\u0627\u0626\u0646 \u067e\u06cc\u0679\u0631\u0646\u0632: \u0627\u06cc\u0644\u06cc\u0645\u0646\u0679\u0633 \u0622\u0641 \u0631\u06cc \u06cc\u0648\u0632 \u0627\u06cc\u0628\u0644 \u0622\u0628\u062c\u06cc\u06a9\u0679 \u0627\u0648\u0631\u06cc\u0646\u0679\u0688 \u0633\u0627\u0641\u0679 \u0648\u06cc\u0626\u0631 \u0645\u06cc\u06ba \u06a9\u06cc \u06af\u0626\u06cc \u062a\u06be\u06cc\u06d4 \u06cc\u06c1 \u0633\u0627\u0641\u0679 \u0648\u06cc\u0626\u0631 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0646\u06af \u0645\u06cc\u06ba \u0633\u0628 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06c1\u0648\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0646\u0645\u0648\u0646\u0648\u06ba \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u06c1\u06d2\u060c \u062e\u0627\u0635 \u0637\u0648\u0631 \u067e\u0631 \u0631\u06cc \u0627\u06cc\u06a9\u0679\u06cc\u0648 \u0627\u0648\u0631 \u0627\u06cc\u0648\u0646\u0679 \u067e\u0631 \u0645\u0628\u0646\u06cc \u0646\u0638\u0627\u0645\u06d4<\/p>\n<h2 id=\"heading-the-problem-it-solves\">\u0645\u0633\u0626\u0644\u06c1 \u06cc\u06c1 \u062d\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2<\/h2>\n<p>\u0622\u0626\u06cc\u06d2 \u062f\u06cc\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0622\u0628\u0632\u0631\u0648\u0631 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u06a9\u06cc\u0627 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06c1\u0645 \u06a9\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u06c1\u0645\u0627\u0631\u06d2 \u067e\u0627\u0633 \u0644\u0627\u06af \u0627\u0646 \u0641\u0646\u06a9\u0634\u0646 \u06c1\u06d2\u06d4 \u0622\u067e \u06a9\u0627 \u0644\u0627\u06af \u0627\u0646 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u0622\u067e \u06a9\u0648 \u0686\u0627\u0631 \u0686\u06cc\u0632\u06cc\u06ba \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2:<\/p>\n<ul>\n<li>\n<p>\u062a\u0635\u062f\u06cc\u0642\u06cc \u0679\u0648\u06a9\u0646 \u06a9\u0648 \u0645\u062d\u0641\u0648\u0638 \u0627\u0633\u0679\u0648\u0631\u06cc\u062c \u0645\u06cc\u06ba \u0627\u0633\u0679\u0648\u0631 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0635\u0627\u0631\u0641 \u067e\u0631\u0648\u0641\u0627\u0626\u0644 \u0688\u06cc\u0679\u0627 \u06a9\u06cc\u0634<\/p>\n<\/li>\n<li>\n<p>\u06c1\u0648\u0645 \u0627\u0633\u06a9\u0631\u06cc\u0646 \u067e\u0631 \u062c\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u062a\u062c\u0632\u06cc\u0627\u062a\u06cc \u0627\u06cc\u0648\u0646\u0679\u0633 \u0686\u0644\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u0644\u0627\u06af \u0627\u0646 \u0641\u0646\u06a9\u0634\u0646 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u06cc\u06c1 \u0633\u0628 \u0688\u0627\u0644\u0646\u0627 \u0627\u06cc\u06a9 \u0622\u0633\u0627\u0646 \u0637\u0631\u06cc\u0642\u06c1 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-dart\">Future<void> login(String email, String password) async {\n  final response = await _authRepository.login(email, password);\n\n  await _secureStorage.write(key: 'token', value: response.token);\n  await _userCache.save(response.user);\n  _navigationService.navigateTo('\/home');\n  _analytics.track('login_success', {'userId': response.user.id});\n}\n<\/void><\/code><\/pre>\n<p>\u067e\u06c1\u0644\u06cc \u0646\u0638\u0631 \u0645\u06cc\u06ba \u06cc\u06c1 \u0679\u06be\u06cc\u06a9 \u0644\u06af\u062a\u0627 \u06c1\u06d2\u06d4 \u0644\u06cc\u06a9\u0646 \u0627\u0646\u062f\u0627\u0632\u06c1 \u0644\u06af\u0627\u0626\u06cc\u06ba \u06a9\u06c1 \u0627\u0633 \u0648\u0627\u062d\u062f \u0641\u0646\u06a9\u0634\u0646 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u06a9\u062a\u0646\u06cc \u0648\u062c\u0648\u06c1\u0627\u062a \u06c1\u06cc\u06ba\u061f<\/p>\n<ul>\n<li>\n<p>\u0679\u0648\u06a9\u0646 \u0627\u0633\u0679\u0648\u0631\u06cc\u062c \u06a9\u06cc \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644\u06cc\u06d4 \u0627\u0633 \u0641\u0646\u06a9\u0634\u0646 \u06a9\u0648 \u062f\u0631\u0633\u062a \u06a9\u0631\u06cc\u06ba:<\/p>\n<\/li>\n<li>\n<p>\u0646\u06cc\u0648\u06cc\u06af\u06cc\u0634\u0646 \u06a9\u06cc \u0645\u0646\u0632\u0644 \u0628\u062f\u0644 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u0633 \u0641\u0646\u06a9\u0634\u0646 \u06a9\u0648 \u062f\u0631\u0633\u062a \u06a9\u0631\u06cc\u06ba:<\/p>\n<\/li>\n<li>\n<p>\u062a\u062c\u0632\u06cc\u0627\u062a\u06cc \u0627\u06cc\u0648\u0646\u0679 \u06a9\u0627 \u0646\u0627\u0645 \u06cc\u0627 \u067e\u06d2 \u0644\u0648\u0688 \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba\u06d4 \u0627\u0633 \u0641\u0646\u06a9\u0634\u0646 \u06a9\u0648 \u062f\u0631\u0633\u062a \u06a9\u0631\u06cc\u06ba:<\/p>\n<\/li>\n<li>\n<p>\u0635\u0627\u0631\u0641 \u06a9\u06cc \u06a9\u06cc\u0634\u0646\u06af \u0645\u0646\u0637\u0642 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba\u06d4 \u0627\u0633 \u0641\u0646\u06a9\u0634\u0646 \u06a9\u0648 \u062f\u0631\u0633\u062a \u06a9\u0631\u06cc\u06ba:<\/p>\n<\/li>\n<\/ul>\n<p>\u062c\u0628 \u0628\u06be\u06cc \u0627\u0646 \u0686\u0627\u0631\u0648\u06ba \u0645\u06cc\u06ba \u0633\u06d2 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0645\u0633\u0626\u0644\u06c1 \u0628\u062f\u0644 \u062c\u0627\u0626\u06d2 \u06af\u0627\u060c \u062a\u0648 \u0622\u067e \u0627\u0633 \u062e\u0635\u0648\u0635\u06cc\u062a \u067e\u0631 \u0648\u0627\u067e\u0633 \u062c\u0627\u0626\u06cc\u06ba \u06af\u06d2\u06d4 \u0627\u0648\u0631 \u06c1\u0631 \u0628\u0627\u0631 \u062c\u0628 \u0622\u067e \u0627\u0633\u06d2 \u0686\u06be\u0648\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u0622\u067e \u0627\u0646 \u062a\u06cc\u0646\u0648\u06ba \u0686\u06cc\u0632\u0648\u06ba \u06a9\u0648 \u0628\u0631\u0628\u0627\u062f \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u062e\u0637\u0631\u06c1 \u0686\u0644\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0648 \u06cc\u06c1 \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0628 \u062a\u0635\u0648\u0631 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u06a9\u0648 \u067e\u0627\u0646\u0686\u0648\u06cc\u06ba \u0622\u0626\u0679\u0645 \u06a9\u0648 \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u060c \u062c\u06cc\u0633\u06d2 \u06a9\u06c1 \u067e\u0634 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u0635\u0627\u0631\u0641 \u06a9\u0648 \u0631\u062c\u0633\u0679\u0631 \u06a9\u0631\u0646\u0627\u06d4 \u0627\u0633 \u0641\u06cc\u0686\u0631 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u06be\u0648\u0644\u06cc\u06ba\u06d4 \u0645\u0632\u06cc\u062f \u06a9\u0648\u0688 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u0645\u06cc\u06ba \u0627\u0636\u0627\u0641\u06c1\u06d4 \u0627\u0633 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u06c1\u0645\u06cc\u06ba 4 \u06cc\u0627 5 \u0645\u062e\u062a\u0644\u0641 \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u0627 \u0645\u0630\u0627\u0642 \u0627\u0691\u0627\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4 \u0679\u06cc\u0645 \u06a9\u06d2 \u0646\u0626\u06d2 \u0627\u0631\u06a9\u0627\u0646 \u06cc\u06c1 \u0633\u0645\u062c\u06be\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0634\u0634 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u06cc\u06c1 \u0641\u06cc\u0686\u0631 \u062f\u0631\u0627\u0635\u0644 \u06a9\u06cc\u0627 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u0642\u06cc\u0646\u0627\u060c \u062c\u0648\u0627\u0628 \u0633\u0628 \u06a9\u0686\u06be \u06c1\u06d2. \u0627\u0648\u0631 \u06cc\u06c1\u06cc \u0645\u0633\u0626\u0644\u06c1 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633\u06d2 \u0679\u0627\u0626\u0679 \u06a9\u067e\u0644\u0646\u06af \u06a9\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0644\u0627\u06af \u0627\u0646 \u0645\u0646\u0637\u0642 \u06a9\u0648 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u0644\u0627\u06af \u0627\u0646 \u06a9\u06d2 \u06c1\u0631 \u0627\u06cc\u06a9 \u0646\u062a\u06cc\u062c\u06c1 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0645\u0644\u0627\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u0628\u0635\u0631 \u067e\u06cc\u0679\u0631\u0646 \u0627\u0633 \u062c\u0648\u0691\u06d2 \u06a9\u0648 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u062a\u0648\u0691 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u0644\u0627\u06af \u0627\u0646 \u0645\u0646\u0637\u0642 \u0627\u06cc\u06a9 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06d2: \u0644\u0627\u06af \u0627\u0646 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u0646\u062a\u0627\u0626\u062c \u06a9\u0627 \u0627\u0639\u0644\u0627\u0646 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u062a\u0645\u0627\u0645 \u0646\u062a\u0627\u0626\u062c \u067e\u0631 \u0627\u0644\u06af \u0627\u0644\u06af\u060c \u0622\u0632\u0627\u062f \u0645\u0628\u0635\u0631\u06cc\u0646 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u06c1\u0631 \u0645\u0628\u0635\u0631 \u06a9\u0627 \u0627\u06cc\u06a9 \u06a9\u0627\u0645 \u06c1\u06d2\u06d4 \u062f\u0648\u0646\u0648\u06ba \u0645\u06cc\u06ba \u0633\u06d2 \u06a9\u0648\u0626\u06cc \u0627\u06cc\u06a9 \u062f\u0648\u0633\u0631\u06d2 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u062c\u0627\u0646\u062a\u0627\u06d4 \u0644\u0627\u06af \u0627\u0646 \u0645\u0646\u0637\u0642 \u0627\u067e\u0646\u06d2 \u0648\u062c\u0648\u062f \u0633\u06d2 \u0628\u06d2 \u062e\u0628\u0631 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-core-components\">\u0628\u0646\u06cc\u0627\u062f\u06cc \u0627\u062c\u0632\u0627\u0621<\/h2>\n<p>\u0622\u0628\u0632\u0631\u0648\u0631 \u067e\u06cc\u0679\u0631\u0646 \u0645\u06cc\u06ba \u0686\u0627\u0631 \u0628\u0646\u06cc\u0627\u062f\u06cc \u062a\u0639\u0645\u06cc\u0631\u0627\u062a\u06cc \u0628\u0644\u0627\u06a9\u0633 \u06c1\u06cc\u06ba: \u06a9\u0633\u06cc \u0628\u06be\u06cc \u06a9\u0648\u0688 \u06a9\u0648 \u0644\u06a9\u06be\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06c1\u0631 \u0627\u06cc\u06a9 \u06a9\u0648 \u0633\u0645\u062c\u06be\u0646\u0627 \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u06a9\u0648 \u0628\u06c1\u062a \u0622\u0633\u0627\u0646 \u0628\u0646\u0627 \u062f\u06d2 \u06af\u0627\u06d4<\/p>\n<h3 id=\"heading-subject\">\u0645\u0648\u0636\u0648\u0639<\/h3>\n<p>\u0645\u0648\u0636\u0648\u0639 \u0648\u06c1 \u0686\u06cc\u0632 \u06c1\u06d2 \u062c\u0633 \u067e\u0631 \u06a9\u0686\u06be \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0645\u0628\u0635\u0631\u06cc\u0646 \u06a9\u06cc \u0641\u06c1\u0631\u0633\u062a \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0648\u0627\u0642\u0639\u0627\u062a \u0631\u0648\u0646\u0645\u0627 \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u0627\u0646\u06c1\u06cc\u06ba \u0645\u0637\u0644\u0639 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0630\u0645\u06c1 \u062f\u0627\u0631 \u06c1\u06d2\u06d4 \u0627\u06cc\u0633\u06d2 \u0637\u0631\u06cc\u0642\u0648\u06ba \u06a9\u0648 \u0628\u06d2 \u0646\u0642\u0627\u0628 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0645\u0628\u0635\u0631\u06cc\u0646 \u06a9\u0648 \u062e\u0648\u062f \u06a9\u0648 \u0631\u062c\u0633\u0679\u0631 \u06a9\u0631\u0646\u06d2 \u0627\u0648\u0631 \u063a\u06cc\u0631 \u0631\u062c\u0633\u0679\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0645\u0636\u0645\u0648\u0646 \u06a9\u0648 \u0627\u0633 \u0628\u0627\u062a \u06a9\u06cc \u06a9\u0648\u0626\u06cc \u067e\u0631\u0648\u0627\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u06a9\u06c1 \u0645\u0628\u0635\u0631 \u0646\u0648\u0679\u06cc\u0641\u06a9\u06cc\u0634\u0646 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06a9\u06cc\u0627 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0628\u0633 \u0627\u0633\u06d2 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-observer\">\u0645\u0628\u0635\u0631<\/h3>\n<p>\u0645\u0628\u0635\u0631 \u0627\u06cc\u06a9 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u06cc\u0627 \u062a\u062c\u0631\u06cc\u062f\u06cc \u06a9\u0644\u0627\u0633 \u06c1\u06d2 \u062c\u0648 \u0627\u06cc\u06a9 \u0645\u0639\u0627\u06c1\u062f\u06d2 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0633 \u067e\u0631 \u062a\u0645\u0627\u0645 \u0645\u0628\u0635\u0631\u06cc\u0646 \u06a9\u0648 \u0639\u0645\u0644 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u06cc\u06c1 \u0627\u0633 \u0637\u0631\u06cc\u0642\u06c1 \u06a9\u0627 \u0627\u0639\u0644\u0627\u0646 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0633 \u06a9\u0648 \u0645\u0637\u0644\u0639 \u06a9\u0631\u062a\u06d2 \u0648\u0642\u062a \u0645\u0648\u0636\u0648\u0639 \u06a9\u0627\u0644 \u06a9\u0631\u06d2 \u06af\u0627\u06d4 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0637\u0628\u0642\u06c1 \u062c\u0648 \u0648\u0627\u0642\u0639\u0627\u062a \u067e\u0631 \u0631\u062f\u0639\u0645\u0644 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u062a\u0627 \u06c1\u06d2 \u0627\u0633\u06d2 \u0627\u0633 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u06a9\u0648 \u0646\u0627\u0641\u0630 \u06a9\u0631\u0646\u0627 \u06c1\u0648\u06af\u0627\u06d4<\/p>\n<h3 id=\"heading-concrete-subject\">\u0645\u062e\u0635\u0648\u0635 \u0645\u0648\u0636\u0648\u0639<\/h3>\n<p>\u0679\u06be\u0648\u0633 \u0645\u0648\u0636\u0648\u0639 \u0645\u0648\u0636\u0648\u0639 \u06a9\u0627 \u062d\u0642\u06cc\u0642\u06cc \u0646\u0641\u0627\u0630 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0644\u0627\u0626\u06cc\u0648 \u0645\u0628\u0635\u0631\u06cc\u0646 \u06a9\u06cc \u0641\u06c1\u0631\u0633\u062a \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0633\u0628\u0633\u06a9\u0631\u067e\u0634\u0646\u0632 \u06a9\u0648 \u0633\u0646\u0628\u06be\u0627\u0644\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0635\u062d\u06cc\u062d \u0648\u0642\u062a \u067e\u0631 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0648 \u0641\u0627\u0626\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-concrete-observers\">\u0679\u06be\u0648\u0633 \u0645\u0628\u0635\u0631<\/h3>\n<p>\u06cc\u06c1 \u0627\u0635\u0644 \u06a9\u0644\u0627\u0633 \u06c1\u06d2 \u062c\u0648 \u0622\u0628\u0632\u0631\u0648\u0631 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u06a9\u0648 \u0646\u0627\u0641\u0630 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u06c1\u0631 \u0634\u062e\u0635 \u06a9\u06d2 \u067e\u0627\u0633 \u0627\u06cc\u06a9 \u0645\u062e\u0635\u0648\u0635\u060c \u062a\u0648\u062c\u06c1 \u0645\u0631\u06a9\u0648\u0632 \u06a9\u0627\u0645 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u062c\u0633 \u06a9\u0648 \u0627\u0646\u062c\u0627\u0645 \u062f\u06cc\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0648\u06c1 \u0627\u0637\u0644\u0627\u0639 \u0645\u0648\u0635\u0648\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06cc\u06a9 \u0679\u0648\u06a9\u0646 \u0630\u062e\u06cc\u0631\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u062a\u062c\u0632\u06cc\u06c1 \u0634\u0631\u0648\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0648\u06c1 \u0646\u06c1\u06cc\u06ba \u062c\u0627\u0646\u062a\u06d2 \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u062f\u0648\u0633\u0631\u06d2 \u06a9\u0648 \u062c\u0627\u0646\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1\u0627\u06ba \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0648\u06c1 \u0627\u06cc\u06a9 \u062f\u0648\u0633\u0631\u06d2 \u0633\u06d2 \u06a9\u06cc\u0633\u06d2 \u0645\u062a\u0639\u0644\u0642 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-cpp\">Subject (LoginService)\n    |\n    |-- subscribe(observer)    <- observer registers itself\n    |-- unsubscribe(observer)  <- observer removes itself\n    |-- notifySuccess(data)    <- fires when login succeeds\n    |-- notifyFailure(error)   <- fires when login fails\n         |\n         |-----> TokenObserver.onLoginSuccess()\n         |-----> UserObserver.onLoginSuccess()\n         |-----> NavigationObserver.onLoginSuccess()\n         |-----> AnalyticsObserver.onLoginSuccess()\n<\/code><\/pre>\n<p>\u0645\u0648\u0636\u0648\u0639 \u0627\u0646 \u0633\u0628 \u06a9\u0648 \u0645\u0637\u0644\u0639 \u06a9\u0631\u06d2 \u06af\u0627\u06d4 \u0648\u06c1 \u06c1\u0631 \u0627\u06cc\u06a9 \u0622\u0632\u0627\u062f\u0627\u0646\u06c1 \u0637\u0648\u0631 \u067e\u0631 \u0627\u067e\u0646\u0627 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-implementing-observer-in-dart\">\u0688\u0627\u0631\u0679 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0645\u0628\u0635\u0631 \u06a9\u0648 \u0646\u0627\u0641\u0630 \u06a9\u0631\u0646\u0627<\/h2>\n<p>\u0622\u0626\u06cc\u06d2 \u0642\u062f\u0645 \u0628\u06c1 \u0642\u062f\u0645 \u0627\u06cc\u06a9 \u067e\u06cc\u0679\u0631\u0646 \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-step-1-define-the-observer-interface\">\u0645\u0631\u062d\u0644\u06c1 1: \u0622\u0628\u0632\u0631\u0648\u0631 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<pre><code class=\"language-dart\">abstract class LoginObserver {\n  void onLoginSuccess(UserDto user);\n  void onLoginFailed(AppException error);\n}\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0627\u06cc\u06a9 \u0645\u0639\u0627\u06c1\u062f\u06c1 \u06c1\u06d2 \u062c\u0633 \u067e\u0631 \u062a\u0645\u0627\u0645 \u0645\u0628\u0635\u0631\u06cc\u0646 \u06a9\u0648 \u062f\u0633\u062a\u062e\u0637 \u06a9\u0631\u0646\u0627 \u06c1\u0648\u06ba \u06af\u06d2\u06d4 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u06a9\u0644\u0627\u0633 \u062c\u0648 \u0644\u0627\u06af \u0627\u0646 \u0627\u06cc\u0648\u0646\u0679\u0633 \u067e\u0631 \u0631\u062f\u0639\u0645\u0644 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u062a\u06cc \u06c1\u06d2 \u0627\u0633\u06d2 \u0627\u0646 \u062a\u0645\u0627\u0645 \u0637\u0631\u06cc\u0642\u0648\u06ba \u06a9\u0648 \u0644\u0627\u06af\u0648 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<p><code>onLoginSuccess<\/code>    \u0644\u0627\u06af \u0627\u0646 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u06c1\u0648\u0646\u06d2 \u0627\u0648\u0631 \u0635\u0627\u0631\u0641 \u06a9\u0627 \u0688\u06cc\u0679\u0627 \u0645\u0648\u0635\u0648\u0644 \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u06a9\u0627\u0644 \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4 <code>onLoginFailed<\/code> \u0644\u0627\u06af \u0627\u0646 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648\u0646\u06d2 \u0627\u0648\u0631 \u063a\u0644\u0637\u06cc \u0645\u0648\u0635\u0648\u0644 \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u06a9\u0627\u0644 \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-step-2-define-the-subject-interface\">\u0645\u0631\u062d\u0644\u06c1 2: \u0645\u0648\u0636\u0648\u0639 \u06a9\u06d2 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<pre><code class=\"language-dart\">abstract class LoginSubject {\n  void subscribe(LoginObserver observer);\n  void unsubscribe(LoginObserver observer);\n  void notifySuccess(UserDto user);\n  void notifyFailure(AppException error);\n}\n<\/code><\/pre>\n<p><code>subscribe<\/code>    \u0645\u0628\u0635\u0631\u06cc\u0646 \u06a9\u0648 \u0627\u0637\u0644\u0627\u0639 \u06a9\u06cc \u0641\u06c1\u0631\u0633\u062a \u0645\u06cc\u06ba \u062d\u0635\u06c1 \u0644\u06cc\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 <code>unsubscribe<\/code> \u0645\u0628\u0635\u0631\u06cc\u0646 \u06a9\u0648 \u0627\u0637\u0644\u0627\u0639 \u06a9\u06cc \u0641\u06c1\u0631\u0633\u062a \u0686\u06be\u0648\u0691\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 <code>notifySuccess<\/code> \u062a\u0645\u0627\u0645 \u0631\u062c\u0633\u0679\u0631\u0688 \u0645\u0628\u0635\u0631\u06cc\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0688\u06cc\u0679\u0627 \u067e\u0631 \u0645\u0634\u062a\u0645\u0644 \u0627\u06cc\u06a9 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u0627\u06cc\u0648\u0646\u0679 \u0646\u0634\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>notifyFailure<\/code> \u062a\u0645\u0627\u0645 \u0631\u062c\u0633\u0679\u0631\u0688 \u0645\u0628\u0635\u0631\u06cc\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062e\u0631\u0627\u0628\u06cc \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0646\u0627\u06a9\u0627\u0645\u06cc \u06a9\u0627 \u0648\u0627\u0642\u0639\u06c1 \u0646\u0634\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u06a9\u0633\u06cc \u06a9\u0646\u06a9\u0631\u06cc\u0679 \u06a9\u0644\u0627\u0633 \u0645\u06cc\u06ba \u062c\u0627\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c \u0627\u0633\u06d2 \u0627\u06cc\u06a9 \u062a\u062c\u0631\u06cc\u062f\u06cc \u06a9\u0644\u0627\u0633 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0628\u06cc\u0627\u0646 \u06a9\u0631\u0646\u0627 \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u062c\u0648 \u0628\u06be\u06cc \u0686\u06cc\u0632 \u0645\u0648\u0636\u0648\u0639 \u067e\u0631 \u0645\u0646\u062d\u0635\u0631 \u06c1\u06d2 \u0627\u0633 \u06a9\u0627 \u0627\u0646\u062d\u0635\u0627\u0631 \u062a\u062c\u0631\u06cc\u062f \u067e\u0631 \u06c1\u06d2\u060c \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u067e\u0631 \u0646\u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0622\u067e \u06a9\u0648 \u0627\u067e\u0646\u06d2 \u06a9\u0648\u0688 \u06a9\u0648 \u062c\u0627\u0646\u0686\u0646\u06d2 \u0627\u0648\u0631 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-step-3-implement-the-concrete-subject\">\u0645\u0631\u062d\u0644\u06c1 3: \u0645\u062e\u0635\u0648\u0635 \u0639\u0646\u0648\u0627\u0646\u0627\u062a \u06a9\u0648 \u0646\u0627\u0641\u0630 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<pre><code class=\"language-dart\">class LoginService implements LoginSubject {\n  final List<loginobserver> _observers = [];\n\n  @override\n  void subscribe(LoginObserver observer) {\n    _observers.add(observer);\n  }\n\n  @override\n  void unsubscribe(LoginObserver observer) {\n    _observers.remove(observer);\n  }\n\n  @override\n  void notifySuccess(UserDto user) {\n    for (final observer in List.of(_observers)) {\n      try {\n        observer.onLoginSuccess(user);\n      } catch (e) {\n        debugPrint('Observer error on success: $e');\n      }\n    }\n  }\n\n  @override\n  void notifyFailure(AppException error) {\n    for (final observer in List.of(_observers)) {\n      try {\n        observer.onLoginFailed(error);\n      } catch (e) {\n        debugPrint('Observer error on failure: $e');\n      }\n    }\n  }\n}\n<\/loginobserver><\/code><\/pre>\n<p>\u0627\u0633 \u0646\u0641\u0627\u0630 \u0645\u06cc\u06ba \u062f\u0648 \u0627\u06c1\u0645 \u0641\u06cc\u0635\u0644\u06d2 \u06c1\u06cc\u06ba \u062c\u0646 \u06a9\u0648 \u06cc\u0627\u062f \u06a9\u0631\u0646\u0627 \u0622\u0633\u0627\u0646 \u06c1\u06d2\u06d4<\/p>\n<h4 id=\"heading-1-snapshot-iteration-with-listof\">1. \u0633\u0646\u06cc\u067e \u0634\u0627\u0679 \u062f\u06c1\u0631\u0627\u0626\u06cc\u06ba\u06d4 <code>List.of()<\/code><\/h4>\n<p>\u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u062a\u06a9\u0631\u0627\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 <code>_observers<\/code>\u06c1\u0645 \u062f\u06c1\u0631\u0627\u062a\u06d2 \u06c1\u06cc\u06ba <code>List.of(_observers)<\/code>\u0644\u0648\u067e \u0686\u0644\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0641\u06c1\u0631\u0633\u062a \u06a9\u06cc \u0627\u06cc\u06a9 \u06a9\u0627\u067e\u06cc \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u06a9\u06cc\u0648\u06ba \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2\u061f \u062a\u0635\u0648\u0631 \u06a9\u0631\u06cc\u06ba\u06d4 <code>NavigationObserver<\/code> \u06c1\u0648\u0645 \u0627\u0633\u06a9\u0631\u06cc\u0646 \u067e\u0631 \u062c\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0646 \u0633\u0628\u0633\u06a9\u0631\u0627\u0626\u0628 \u06a9\u0631\u06cc\u06ba \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0627\u0628 \u0622\u067e \u06a9\u0648 \u0633\u0646\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0622\u067e \u06a9\u0627\u0644 \u06a9\u0631\u06cc\u06ba <code>unsubscribe<\/code> \u062f\u0648\u0631\u0627\u0646 <code>notifySuccess<\/code> \u0627\u06af\u0631 \u0644\u0648\u067e \u0627\u0628 \u0628\u06be\u06cc \u0627\u0633\u06cc \u0641\u06c1\u0631\u0633\u062a \u067e\u0631 \u0686\u0644 \u0631\u06c1\u0627 \u06c1\u06d2 \u062a\u0648\u060c \u0688\u0627\u0631\u0679 \u0627\u0633 \u0637\u0631\u062d \u06a9\u06cc \u063a\u0644\u0637\u06cc \u067e\u06be\u06cc\u0646\u06a9 \u062f\u06d2 \u06af\u0627: <code>ConcurrentModificationError<\/code>. \u0641\u06c1\u0631\u0633\u062a \u067e\u0691\u06be\u062a\u06d2 \u0648\u0642\u062a \u0627\u0633 \u0645\u06cc\u06ba \u062a\u0631\u0645\u06cc\u0645 \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><code>List.of()<\/code>    \u0627\u0633 \u06a9\u0648 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0631\u0648\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u0644\u0648\u067e \u0633\u0646\u06cc\u067e \u0634\u0627\u0679\u0633 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0635\u0644 \u0641\u06c1\u0631\u0633\u062a \u0645\u06cc\u06ba \u0628\u063a\u06cc\u0631 \u06a9\u0633\u06cc \u063a\u0644\u0637\u06cc \u06a9\u06d2 \u062a\u06a9\u0631\u0627\u0631 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u0622\u0632\u0627\u062f\u0627\u0646\u06c1 \u0637\u0648\u0631 \u067e\u0631 \u062a\u0631\u0645\u06cc\u0645 \u06a9\u06cc \u062c\u0627 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h4 id=\"heading-2-per-observer-trycatch\">2. \u0645\u0628\u0635\u0631 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u067e\u06a9\u0691\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0634\u0634<\/h4>\n<p>\u06c1\u0631 \u0645\u0628\u0635\u0631 \u06a9\u0627\u0644 \u06a9\u0648 \u0627\u0633 \u06a9\u06d2 \u0627\u067e\u0646\u06d2 \u0679\u0631\u0627\u0626\u06cc\/\u06a9\u06cc\u0686 \u0628\u0644\u0627\u06a9 \u0645\u06cc\u06ba \u0644\u067e\u06cc\u0679\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 <code>TokenObserver<\/code> \u0645\u062d\u0641\u0648\u0638 \u0627\u0633\u0679\u0648\u0631\u06cc\u062c \u06a9\u06d2 \u0644\u06cc\u06d2 \u0644\u06a9\u06be\u062a\u06d2 \u0648\u0642\u062a \u0627\u06cc\u06a9 \u0627\u0633\u062a\u062b\u0646\u0627\u0621 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u0645\u062c\u06be\u06d2 \u06cc\u06c1 \u0646\u06c1\u06cc\u06ba \u0686\u0627\u06c1\u06cc\u06d2 <code>NavigationObserver<\/code> \u0627\u0648\u0631 <code>AnalyticsObserver<\/code> \u062e\u0627\u0645\u0648\u0634\u06cc \u0633\u06d2 \u0641\u0627\u0626\u0631 \u0646\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4 \u06c1\u0631 \u0645\u0628\u0635\u0631 \u06a9\u0648 \u062f\u0648\u0691\u0646\u06d2 \u06a9\u0627 \u0645\u0648\u0642\u0639 \u0645\u0644\u062a\u0627 \u06c1\u06d2 \u0642\u0637\u0639 \u0646\u0638\u0631 \u0627\u0633 \u06a9\u06d2 \u06a9\u06c1 \u062f\u0648\u0633\u0631\u06d2 \u06a9\u06cc\u0627 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u0633 \u06a9\u06d2 \u0628\u063a\u06cc\u0631\u060c \u0627\u06cc\u06a9 \u0646\u0627\u06a9\u0627\u0645 \u0645\u0628\u0635\u0631 \u067e\u0648\u0631\u06d2 \u0646\u0648\u0679\u06cc\u0641\u06a9\u06cc\u0634\u0646 \u0686\u06cc\u0646 \u06a9\u0648 \u0631\u0648\u06a9 \u062f\u06d2 \u06af\u0627\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u067e\u0648\u0634\u06cc\u062f\u06c1 \u0628\u06af \u06c1\u06d2 \u062c\u0633\u06d2 \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u0645\u06cc\u06ba \u0679\u0631\u06cc\u06a9 \u06a9\u0631\u0646\u0627 \u0628\u06c1\u062a \u0645\u0634\u06a9\u0644 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-a-real-world-example-the-login-flow\">\u062d\u0642\u06cc\u0642\u06cc \u0632\u0646\u062f\u06af\u06cc \u06a9\u06cc \u0645\u062b\u0627\u0644: \u0644\u0627\u06af \u0627\u0646 \u0641\u0644\u0648<\/h2>\n<p>\u0627\u0628 \u0622\u0626\u06cc\u06d2 \u067e\u0648\u0631\u06d2 \u0644\u0627\u06af \u0627\u0646 \u0641\u0644\u0648 \u06a9\u0648 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633 \u0641\u0627\u0624\u0646\u0688\u06cc\u0634\u0646 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-the-login-logic\">\u0644\u0627\u06af \u0627\u0646 \u0645\u0646\u0637\u0642<\/h3>\n<pre><code class=\"language-cpp\">class LoginLogic {\n  final LoginSubject _subject;\n  final AuthRepository _repository;\n\n  LoginLogic({\n    required LoginSubject subject,\n    required AuthRepository repository,\n  })  : _subject = subject,\n        _repository = repository;\n\n  Future<void> callLogin(LoginRequest request) async {\n    try {\n      final user = await _repository.login(request);\n      _subject.notifySuccess(user);\n    } on AppException catch (e) {\n      _subject.notifyFailure(e);\n    } catch (e) {\n      _subject.notifyFailure(AppException.unknown(message: e.toString()));\n    }\n  }\n}\n<\/void><\/code><\/pre>\n<p>\u0622\u0626\u06cc\u06d2 \u0627\u0633 \u06a9\u0648 \u063a\u0648\u0631 \u0633\u06d2 \u062f\u06cc\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p><code>LoginLogic<\/code>    \u06cc\u06c1 \u06a9\u0646\u0633\u0679\u0631\u06a9\u0679\u0631 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u062f\u0648 \u0627\u0646\u062d\u0635\u0627\u0631 \u0644\u06cc\u062a\u0627 \u06c1\u06d2: <code>LoginSubject<\/code> \u0627\u0648\u0631 <code>AuthRepository<\/code>. \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u06cc\u06c1 \u06a9\u06cc\u0627 \u0644\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 <code>LoginSubject<\/code>\u062a\u062c\u0631\u06cc\u062f \u0646\u06c1\u06cc\u06ba <code>LoginService<\/code>\u06a9\u0646\u06a9\u0631\u06cc\u0679 \u06a9\u0644\u0627\u0633\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e \u0628\u063a\u06cc\u0631 \u06a9\u0633\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc \u06a9\u06d2 \u062c\u0627\u0646\u0686 \u06cc\u0627 \u062f\u0648\u0633\u0631\u06d2 \u0645\u0627\u062d\u0648\u0644 \u0645\u06cc\u06ba \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>LoginLogic<\/code> \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc<\/p>\n<p>\u0627\u0646\u062f\u0631 <code>callLogin<\/code>\u0645\u0646\u0637\u0642 \u0633\u0627\u062f\u06c1 \u06c1\u06d2\u06d4 \u06c1\u0645 \u0627\u0635\u0644 \u0644\u0627\u06af \u0627\u0646 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0631\u06cc\u067e\u0648\u0632\u0679\u0631\u06cc \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u06c1\u0648\u060c \u062a\u0648 \u06c1\u0645 \u06a9\u0627\u0644 \u06a9\u0631\u06cc\u06ba: <code>notifySuccess<\/code> \u0627\u06af\u0631 \u06cc\u06c1 \u0627\u0633\u06d2 \u0648\u0627\u067e\u0633 \u0622\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0635\u0627\u0631\u0641 \u0633\u06d2 \u0645\u062a\u0639\u0644\u0642 \u06a9\u0633\u06cc \u0645\u0648\u0636\u0648\u0639 \u067e\u0631 \u067e\u06be\u06cc\u0646\u06a9 \u062f\u06cc\u062a\u0627 \u06c1\u06d2: <code>AppException<\/code>\u06cc\u06c1 \u06a9\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 <code>notifyFailure<\/code> \u0627\u0633 \u063a\u0644\u0637\u06cc \u06a9\u06d2 \u0633\u0627\u062a\u06be\u06d4 \u0627\u06af\u0631 \u06a9\u0686\u06be \u063a\u06cc\u0631 \u0645\u062a\u0648\u0642\u0639 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0627\u0633\u06d2 \u0627\u0633 \u0637\u0631\u062d \u0644\u067e\u06cc\u0679\u06cc\u06ba: <code>AppException.unknown<\/code> \u0627\u0648\u0631 \u06cc\u06c1 \u0646\u0627\u06a9\u0627\u0645\u06cc \u06a9\u0627 \u0627\u0634\u0627\u0631\u06c1 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u0633 \u0686\u06cc\u0632 \u067e\u0631 \u062a\u0648\u062c\u06c1 \u062f\u06cc\u06ba\u06d4 <code>LoginLogic<\/code> \u0645\u06cc\u06ba \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u0679\u0648\u06a9\u0646\u0632 \u0645\u062d\u0641\u0648\u0638 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u06a9\u06c1\u06cc\u06ba \u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u06a9\u0686\u06be \u0628\u06be\u06cc \u06a9\u06cc\u0634 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062a\u062c\u0632\u06cc\u06c1 \u0634\u0631\u0648\u0639 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627\u06d4 \u0627\u0648\u0631 \u06c1\u0645 \u0646\u06c1\u06cc\u06ba \u062c\u0627\u0646\u062a\u06d2 \u06a9\u06c1 \u0648\u06c1\u0627\u06ba \u06a9\u062a\u0646\u06d2 \u0645\u0628\u0635\u0631 \u06c1\u06cc\u06ba \u06cc\u0627 \u0648\u06c1 \u06a9\u06cc\u0627 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0622\u067e \u06a9\u06cc \u067e\u0648\u0631\u06cc \u0630\u0645\u06c1 \u062f\u0627\u0631\u06cc \u0644\u0627\u06af \u0627\u0646 \u06a9\u0631\u0646\u0627 \u0627\u0648\u0631 \u0646\u062a\u0627\u0626\u062c \u0633\u06d2 \u0622\u067e \u06a9\u0648 \u0645\u0637\u0644\u0639 \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-the-concrete-observers\">\u0679\u06be\u0648\u0633 \u0645\u0628\u0635\u0631<\/h3>\n<pre><code class=\"language-cpp\">class TokenObserver implements LoginObserver {\n  final SecureStorageService _storage;\n\n  TokenObserver(this._storage);\n\n  @override\n  void onLoginSuccess(UserDto user) {\n    _storage.write(key: 'auth_token', value: user.token);\n  }\n\n  @override\n  void onLoginFailed(AppException error) {\n    _storage.delete(key: 'auth_token');\n  }\n}\n<\/code><\/pre>\n<p><code>TokenObserver<\/code>    \u0627\u06cc\u06a9 \u06a9\u0627\u0645 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062a\u0648\u062b\u06cc\u0642 \u0679\u0648\u06a9\u0646 \u06a9\u06d2 \u0627\u0646\u062a\u0638\u0627\u0645 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u06c1\u0648 \u062a\u0648 \u0679\u0648\u06a9\u0646 \u0645\u062d\u0641\u0648\u0638 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u06cc\u06c1 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u06cc\u06c1 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u067e\u0631\u0627\u0646\u06d2 \u0679\u0648\u06a9\u0646 \u06a9\u0648 \u0635\u0627\u0641 \u06a9\u0631 \u062f\u06cc\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0627\u0633\u0679\u0648\u0631\u06cc\u062c \u0645\u06cc\u06ba \u06c1\u0648 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0645\u06cc\u06ba \u0646\u06cc\u0648\u06cc\u06af\u06cc\u0634\u0646\u060c \u06a9\u06cc\u0634\u0646\u06af\u060c \u06cc\u0627 \u062a\u062c\u0632\u06cc\u0627\u062a \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u062c\u0627\u0646\u062a\u0627 \u06c1\u0648\u06ba\u06d4<\/p>\n<pre><code class=\"language-cpp\">class UserObserver implements LoginObserver {\n  final UserCacheService _cache;\n\n  UserObserver(this._cache);\n\n  @override\n  void onLoginSuccess(UserDto user) {\n    _cache.save(user);\n  }\n\n  @override\n  void onLoginFailed(AppException error) {\n    _cache.clear();\n  }\n}\n<\/code><\/pre>\n<p><code>UserObserver<\/code>    \u0627\u06cc\u06a9 \u06a9\u0627\u0645 \u06c1\u06d2\u06d4 \u0635\u0627\u0631\u0641 \u06a9\u06cc\u0634 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0645\u06d4 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u06c1\u0648\u0646\u06d2 \u067e\u0631\u060c \u0622\u067e \u06a9\u0627 \u0635\u0627\u0631\u0641 \u067e\u0631\u0648\u0641\u0627\u0626\u0644 \u0645\u062d\u0641\u0648\u0638 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 \u0627\u06af\u0631 \u06cc\u06c1 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648\u062c\u0627\u062a\u0627 \u06c1\u06d2 \u062a\u0648\u060c \u06a9\u06cc\u0634 \u0635\u0627\u0641 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u0627. \u0645\u06cc\u06ba \u0679\u0648\u06a9\u0646\u0632\u060c \u0627\u06cc\u06a9\u0633\u067e\u0644\u0648\u0631\u06cc\u0634\u0646 \u06cc\u0627 \u0627\u06cc\u0646\u0627\u0644\u06cc\u0679\u06a9\u0633 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u062c\u0627\u0646\u062a\u0627\u06d4<\/p>\n<pre><code class=\"language-cpp\">class NavigationObserver implements LoginObserver {\n  final NavigationService _navigation;\n\n  NavigationObserver(this._navigation);\n\n  @override\n  void onLoginSuccess(UserDto user) {\n    _navigation.navigateTo('\/home');\n  }\n\n  @override\n  void onLoginFailed(AppException error) {\n    _navigation.showError(error.message);\n  }\n}\n<\/code><\/pre>\n<p><code>NavigationObserver<\/code>    \u0627\u0633 \u06a9\u0627 \u0627\u06cc\u06a9 \u06a9\u0627\u0645 \u06c1\u06d2: \u0644\u0627\u06af \u0627\u0646 \u06a9\u06cc \u06a9\u0648\u0634\u0634 \u06a9\u06d2 \u0628\u0639\u062f \u0646\u06cc\u0648\u06cc\u06af\u06cc\u0634\u0646 \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u0645\u06cc\u06ba \u0627\u0646\u062c\u06cc\u06a9\u0634\u0646 \u0641\u0627\u0631\u0645\u0648\u0644\u06c1 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u0648\u06ba\u06d4 <code>NavigationService<\/code> \u062a\u062c\u0631\u06cc\u062f \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 <code>BuildContext<\/code>. \u06cc\u06c1 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u06c1\u06d2\u06d4 \u0645\u0646\u062d\u0635\u0631 \u0645\u0628\u0635\u0631 <code>BuildContext<\/code> \u06cc\u06c1 \u0648\u06cc\u062c\u06cc\u0679 \u0644\u0627\u0626\u0641 \u0633\u0627\u0626\u06cc\u06a9\u0644 \u0633\u06d2 \u0645\u0646\u0633\u0644\u06a9 \u06c1\u06d2\u06d4 \u062e\u0644\u0627\u0635\u06c1 \u0627\u0633 \u0645\u0628\u0635\u0631 \u06a9\u0648 UI \u067e\u0631\u062a \u0633\u06d2 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0622\u0632\u0627\u062f \u0631\u06c1\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-cpp\">class AnalyticsObserver implements LoginObserver {\n  final AnalyticsService _analytics;\n\n  AnalyticsObserver(this._analytics);\n\n  @override\n  void onLoginSuccess(UserDto user) {\n    _analytics.track('login_success', {'userId': user.id});\n  }\n\n  @override\n  void onLoginFailed(AppException error) {\n    _analytics.track('login_failed', {'reason': error.message});\n  }\n}\n<\/code><\/pre>\n<p><code>AnalyticsObserver<\/code>    \u06a9\u0627\u0645 \u0627\u06cc\u06a9 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u06c1\u0631 \u0646\u062a\u06cc\u062c\u06c1 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0635\u062d\u06cc\u062d \u062a\u062c\u0632\u06cc\u06c1 \u0627\u06cc\u0648\u0646\u0679 \u06a9\u0648 \u0641\u0627\u0626\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u0633\u0679\u0648\u0631\u06cc\u062c\u060c \u0646\u06cc\u0648\u06cc\u06af\u06cc\u0634\u0646 \u06cc\u0627 \u06a9\u06cc\u0634\u0646\u06af \u06a9\u0627 \u06a9\u0648\u0626\u06cc \u0639\u0644\u0645 \u0646\u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06c1\u0631 \u0645\u0628\u0635\u0631 \u06a9\u06cc \u0628\u0627\u0644\u06a9\u0644 \u0627\u06cc\u06a9 \u0630\u0645\u06c1 \u062f\u0627\u0631\u06cc \u06c1\u06d2\u06d4 \u06c1\u0631 \u0627\u06cc\u06a9 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0628\u0627\u0644\u06a9\u0644 \u0627\u06cc\u06a9 \u0648\u062c\u06c1 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0622\u067e \u06a9\u0648 \u062a\u062c\u0632\u06cc\u0627\u062a\u06cc \u067e\u06d2 \u0644\u0648\u0688 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u060c \u062a\u0648 \u0628\u0633 \u0627\u0633\u06d2 \u0679\u0686 \u06a9\u0631\u06cc\u06ba\u06d4 <code>AnalyticsObserver<\/code>. \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u0679\u0686 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u067e\u0646\u06cc \u0646\u06cc\u0648\u06cc\u06af\u06cc\u0634\u0646 \u0645\u0646\u0637\u0642 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 <code>NavigationObserver<\/code>. \u06a9\u0648\u0626\u06cc \u0627\u0648\u0631 \u0686\u06cc\u0632 \u0645\u062a\u0627\u062b\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u06cc\u06d4<\/p>\n<h3 id=\"heading-wiring-it-together\">\u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u0648\u0627\u0626\u0631\u0646\u06af<\/h3>\n<pre><code class=\"language-cpp\">void setupLogin() {\n  final service = LoginService();\n\n  service\n    ..subscribe(TokenObserver(secureStorage))\n    ..subscribe(UserObserver(userCache))\n    ..subscribe(NavigationObserver(navigationService))\n    ..subscribe(AnalyticsObserver(analyticsService));\n\n  final loginLogic = LoginLogic(\n    subject: service,\n    repository: authRepository,\n  );\n}\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u062a\u0631\u062a\u06cc\u0628 \u06a9\u0627 \u0645\u0631\u062d\u0644\u06c1 \u06c1\u06d2\u06d4 \u062a\u0645\u0627\u0645 \u0645\u0628\u0635\u0631\u06cc\u0646 \u0627\u067e\u0646\u06d2 \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0628\u0646\u0627\u0626\u06d2 \u06af\u0626\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0633\u0631\u0648\u0633 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0631\u062c\u0633\u0679\u0631\u0688 \u06c1\u06cc\u06ba\u06d4 \u062c\u06be\u0631\u0646 \u0622\u067e\u0631\u06cc\u0679\u0631 <code>..<\/code> \u0641\u0648\u0646 \u06a9\u0627\u0644 <code>subscribe<\/code> \u0627\u06cc\u06a9 \u06c1\u06cc \u0686\u06cc\u0632 \u06a9\u0626\u06cc \u0628\u0627\u0631 <code>service<\/code> \u0627\u06cc\u06a9 \u0627\u06cc\u0633\u06cc \u0686\u06cc\u0632 \u062c\u0633 \u0645\u06cc\u06ba \u0633\u06cc\u0679\u0646\u06af\u0632 \u067e\u0691\u06be\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u06c1\u0648\u06ba\u06d4<\/p>\n<p><code>LoginLogic<\/code>    \u0627\u0633\u062a\u0642\u0628\u0627\u0644\u06cc\u06c1 <code>service<\/code> \u0627\u0633 \u06a9\u0627 <code>LoginSubject<\/code>. \u0627\u0628 \u0633\u06d2\u060c \u06c1\u0631 \u0628\u0627\u0631 <code>callLogin<\/code> \u062c\u0628 \u06a9\u0627\u0644 \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u0646\u062a\u06cc\u062c\u06c1 \u0622\u062a\u0627 \u06c1\u06d2 \u062a\u0648 \u0686\u0627\u0631\u0648\u06ba \u0645\u0628\u0635\u0631\u06cc\u0646 \u06a9\u0648 \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u0645\u0637\u0644\u0639 \u06a9\u0631 \u062f\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u067e\u0627\u0646\u0686\u0648\u06cc\u06ba \u0645\u0628\u0635\u0631 \u06a9\u0648 \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u06c1\u0645\u06cc\u06ba \u0645\u0644\u062a\u0627 \u06c1\u06d2: <code>PushNotificationObserver<\/code>\u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u0627\u06cc\u06a9 \u06a9\u0644\u0627\u0633 \u0628\u0646\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0644\u0627\u0626\u0646 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba: <code>..subscribe(PushNotificationObserver(pushService))<\/code>. \u067e\u0648\u0631\u06d2 \u06a9\u0648\u0688 \u0628\u06cc\u0633 \u0645\u06cc\u06ba \u0627\u0648\u0631 \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u0628\u062f\u0644\u062a\u0627\u06d4<\/p>\n<h2 id=\"heading-making-it-production-grade-with-a-generic-eventbus\">\u0639\u0627\u0645 EventBus \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0627\u0633\u06d2 \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u06af\u0631\u06cc\u0688 \u0628\u0646\u0627\u0626\u06cc\u06ba<\/h2>\n<p>\u0627\u0648\u067e\u0631 \u0644\u0627\u06af \u0627\u0646 \u06a9\u06cc \u0645\u062b\u0627\u0644 \u0679\u06be\u06cc\u06a9 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u0635\u0631\u0641 \u0644\u0627\u06af \u0627\u0646 \u067e\u0631 \u0644\u0627\u06af\u0648 \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u062d\u0642\u06cc\u0642\u06cc \u062f\u0646\u06cc\u0627 \u06a9\u06cc \u0627\u06cc\u067e\u0644\u06cc \u06a9\u06cc\u0634\u0646\u0632 \u0645\u06cc\u06ba\u060c \u0628\u06c1\u062a \u0633\u06d2 \u0641\u0646\u06a9\u0634\u0646\u0632 \u06a9\u06cc \u0627\u06cc\u06a9 \u062c\u06cc\u0633\u06cc \u0636\u0631\u0648\u0631\u06cc\u0627\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u0627\u062f\u0627\u0626\u06cc\u06af\u06cc \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u06cc\u06ba\u060c \u0622\u0631\u0688\u0631 \u06a9\u0631\u06cc\u06ba\u060c \u067e\u0631\u0648\u0641\u0627\u0626\u0644 \u06a9\u0648 \u0627\u067e \u0688\u06cc\u0679 \u06a9\u0631\u06cc\u06ba\u060c \u0633\u06cc\u0634\u0646 \u06a9\u06cc \u0645\u06cc\u0639\u0627\u062f \u062e\u062a\u0645\u06d4 \u0645\u062a\u0639\u062f\u062f \u0622\u0632\u0627\u062f \u0631\u062f\u0639\u0645\u0644 \u06a9\u0648 \u0645\u062a\u062d\u0631\u06a9 \u06a9\u0631\u0646\u06d2 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0648\u0627\u0642\u0639\u06c1 \u0644\u06af\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0633\u0628\u062c\u06cc\u06a9\u0679 \u0627\u0648\u0631 \u0622\u0628\u0632\u0631\u0648\u0631 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u06a9\u0648 \u0641\u0646\u06a9\u0634\u0646 \u0628\u06c1 \u0641\u0646\u06a9\u0634\u0646 \u06a9\u06cc \u0628\u0646\u06cc\u0627\u062f \u067e\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0644\u06a9\u06be\u0646\u0627 \u0628\u0627\u0631 \u0628\u0627\u0631 \u0627\u0648\u0631 \u063a\u06cc\u0631 \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0628\u06c1\u062a\u0631 \u0646\u0642\u0637\u06c1 \u0646\u0638\u0631 \u0627\u06cc\u06a9 \u0639\u0645\u0648\u0645\u06cc \u06c1\u06d2\u06d4 <code>EventBus<\/code> \u062a\u0645\u0627\u0645 \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u062f\u0633\u062a\u06cc\u0627\u0628 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-cpp\">abstract class DomainObserver<t> {\n  void onSuccess(T data);\n  void onFailure(AppException error);\n}\n<\/t><\/code><\/pre>\n<p><code>DomainObserver<t\/><\/code>    \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u063a\u06cc\u0631 \u0645\u0639\u0645\u0648\u0644\u06cc \u0645\u0628\u0635\u0631 \u06c1\u0648\u06ba\u06d4 \u067e\u06cc\u0631\u0627\u0645\u06cc\u0679\u0631 \u0679\u0627\u0626\u067e \u06a9\u0631\u06cc\u06ba\u06d4 <code>T<\/code> \u0688\u06cc\u0679\u0627 \u06a9\u06cc \u0642\u0633\u0645 \u06a9\u06cc \u0646\u0634\u0627\u0646\u062f\u06c1\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u0645\u0628\u0635\u0631 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u06c1\u0648\u0646\u06d2 \u06a9\u06cc \u062a\u0648\u0642\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0644\u0627\u06af \u0627\u0646 \u0645\u0628\u0635\u0631 \u0627\u0633 \u0637\u0631\u062d \u0644\u06af\u062a\u0627 \u06c1\u06d2: <code>DomainObserver<userdto\/><\/code>. \u062a\u0646\u062e\u0648\u0627\u06c1 \u0645\u0628\u0635\u0631 <code>DomainObserver<paymentdto\/><\/code>. \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u0627\u06cc\u06a9 \u06c1\u06cc \u06c1\u06d2\u06d4 \u0688\u06cc\u0679\u0627 \u06a9\u06cc \u0627\u0642\u0633\u0627\u0645 \u0641\u0646\u06a9\u0634\u0646 \u0633\u06d2 \u0641\u0646\u06a9\u0634\u0646 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06c1\u0648\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-cpp\">class EventBus<t> {\n  final List<domainobserver>> _observers = [];\n\n  void subscribe(DomainObserver<t> observer) {\n    _observers.add(observer);\n  }\n\n  void unsubscribe(DomainObserver<t> observer) {\n    _observers.remove(observer);\n  }\n\n  void publishSuccess(T data) {\n    for (final observer in List.of(_observers)) {\n      try {\n        observer.onSuccess(data);\n      } catch (e) {\n        debugPrint('[EventBus] Observer error on success: $e');\n      }\n    }\n  }\n\n  void publishFailure(AppException error) {\n    for (final observer in List.of(_observers)) {\n      try {\n        observer.onFailure(error);\n      } catch (e) {\n        debugPrint('[EventBus] Observer error on failure: $e');\n      }\n    }\n  }\n}\n<\/t><\/t><\/domainobserver><\/t><\/code><\/pre>\n<p><code>EventBus<t\/><\/code>    \u06cc\u06c1 \u0627\u06cc\u06a9 \u0639\u0645\u0648\u0645\u06cc \u0645\u0648\u0636\u0648\u0639 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0645\u0628\u0635\u0631\u06cc\u0646 \u06a9\u06cc \u062f\u0631\u062c \u06a9\u0631\u062f\u06c1 \u0641\u06c1\u0631\u0633\u062a \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0646\u06c1\u06cc\u06ba \u0627\u0633\u06cc \u0633\u0646\u06cc\u067e \u0634\u0627\u0679 \u062a\u06a9\u0631\u0627\u0631 \u0627\u0648\u0631 \u0641\u06cc \u0645\u0628\u0635\u0631 \u063a\u0644\u0637\u06cc \u062a\u0646\u06c1\u0627\u0626\u06cc \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0645\u0637\u0644\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u06cc\u0633\u0627 \u06a9\u06c1 \u067e\u06c1\u0644\u06d2 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u0627 \u06af\u06cc\u0627 \u062a\u06be\u0627\u06d4<\/p>\n<p>\u0627\u0628 \u062a\u0645\u0627\u0645 \u0641\u0646\u06a9\u0634\u0646\u0632 \u06a9\u0648 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u06cc \u0627\u06cc\u06a9 \u0644\u0627\u0626\u0646 \u0688\u067e\u0644\u06cc\u06a9\u06cc\u0679 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0627\u06cc\u06a9 \u06c1\u06cc \u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631 \u0645\u0644\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-cpp\">final loginBus = EventBus<userdto>();\nfinal paymentBus = EventBus<paymentdto>();\nfinal orderBus = EventBus<orderdto>();\n<\/orderdto><\/paymentdto><\/userdto><\/code><\/pre>\n<p>\u06c1\u0631 \u0628\u0633 \u06a9\u0648 \u0627\u0633 \u06a9\u06d2 \u0688\u0648\u0645\u06cc\u0646 \u062a\u0635\u0648\u0631 \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642 \u0679\u0627\u0626\u067e \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0631\u062c\u0633\u0679\u0631\u0688 \u0622\u0628\u0632\u0631\u0648\u0631 <code>loginBus<\/code> \u0622\u067e \u06a9\u0648 \u063a\u0644\u0637\u06cc \u0633\u06d2 \u0627\u062f\u0627\u0626\u06cc\u06af\u06cc \u06a9\u06d2 \u0648\u0627\u0642\u0639\u0627\u062a \u0645\u0648\u0635\u0648\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u06ba \u06af\u06d2\u06d4 \u0642\u0633\u0645 \u06a9\u0627 \u0646\u0638\u0627\u0645 \u062f\u0631\u0633\u062a\u06af\u06cc \u06a9\u0648 \u0646\u0627\u0641\u0630 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-observer-is-already-in-your-flutter-code\">\u0645\u0628\u0635\u0631 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u06c1\u06cc \u0622\u067e \u06a9\u06d2 \u0641\u0644\u0679\u0631 \u06a9\u0648\u0688 \u0645\u06cc\u06ba \u06c1\u06d2\u06d4<\/h2>\n<p>\u0627\u0633 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u06c1 \u06c1\u0645 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u0645\u06cc\u06ba \u06af\u06c1\u0631\u0627\u0626\u06cc \u0645\u06cc\u06ba \u0688\u0648\u0628 \u062c\u0627\u0626\u06cc\u06ba\u060c \u06cc\u06c1\u0627\u06ba \u0627\u06cc\u06a9 \u0644\u0645\u062d\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u0648\u0686\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u06c1\u06d2\u06d4 \u0622\u067e \u0622\u0628\u0632\u0631\u0648\u0631 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0648 \u0627\u0633 \u0646\u0627\u0645 \u0633\u06d2 \u067e\u06a9\u0627\u0631\u06d2 \u0628\u063a\u06cc\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p><strong>\u0627\u0633\u0679\u0631\u06cc\u0645\u0632 \u0627\u0648\u0631 \u0627\u0633\u0679\u0631\u06cc\u0645 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631\u0632:<\/strong><\/p>\n<pre><code class=\"language-cpp\">final controller = StreamController<string>();\n\ncontroller.stream.listen((event) {\n  print('Observed: $event');\n});\n\ncontroller.sink.add('Login succeeded');\n<\/string><\/code><\/pre>\n<p><code>StreamController<\/code>    \u06cc\u06c1 \u0645\u0648\u0636\u0648\u0639 \u06c1\u06d2\u06d4 <code>stream.listen<\/code> \u06c1\u06d2 <code>subscribe<\/code>. <code>sink.add<\/code> \u06c1\u06d2 <code>notifyObservers<\/code>. \u062a\u0645\u0627\u0645 \u0633\u0679\u0631\u06cc\u0645 \u0633\u0628\u0633\u06a9\u0631\u067e\u0634\u0646\u0632 \u0645\u0628\u0635\u0631 \u06c1\u06cc\u06ba\u06d4 \u067e\u06cc\u0679\u0631\u0646 \u0627\u06cc\u06a9 \u06c1\u06cc \u06c1\u06d2. \u067e\u06be\u0691\u067e\u06be\u0691\u0627\u0646\u06d2 \u0646\u06d2 \u0627\u0633\u06d2 \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u0645\u062e\u062a\u0644\u0641 \u0646\u0627\u0645 \u062f\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><strong>\u062a\u0628\u062f\u06cc\u0644\u06cc \u06a9\u06cc \u0627\u0637\u0644\u0627\u0639:<\/strong><\/p>\n<pre><code class=\"language-cpp\">class CounterModel extends ChangeNotifier {\n  int _count = 0;\n\n  void increment() {\n    _count++;\n    notifyListeners();\n  }\n}\n<\/code><\/pre>\n<p><code>notifyListeners()<\/code>    \u062a\u0645\u0627\u0645 \u0631\u062c\u0633\u0679\u0631\u0688 \u0633\u0627\u0645\u0639\u06cc\u0646 \u067e\u0631 \u0627\u0639\u0627\u062f\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0648\u06c1 \u0633\u0646\u0646\u06d2 \u0648\u0627\u0644\u0627 \u0645\u0628\u0635\u0631 \u06c1\u06d2\u06d4 <code>addListener<\/code> \u06c1\u06d2 <code>subscribe<\/code>. <code>removeListener<\/code> \u06c1\u06d2 <code>unsubscribe<\/code>. <code>ChangeNotifier<\/code> \u06cc\u06c1 \u0627\u06cc\u06a9 \u0645\u062e\u0635\u0648\u0635 \u0645\u0648\u0636\u0648\u0639 \u06c1\u06d2\u06d4<\/p>\n<p><strong>\u0628\u0644\u0627\u06a9:<\/strong><\/p>\n<p>\u062c\u0628 BLoC \u0627\u06cc\u06a9 \u0646\u0626\u06cc \u062d\u0627\u0644\u062a \u06a9\u0627 \u0627\u062e\u0631\u0627\u062c \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0627\u0633 \u06a9\u0648 \u0644\u067e\u06cc\u0679\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u062a\u0645\u0627\u0645 \u0648\u06cc\u062c\u0679 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>BlocBuilder<\/code> \u06cc\u0627 <code>BlocListener<\/code> \u0631\u062f \u0639\u0645\u0644 BLOC \u0627\u06cc\u06a9 \u0645\u0648\u0636\u0648\u0639 \u06c1\u06d2\u06d4 \u0645\u0639\u0645\u0627\u0631 \u0627\u0648\u0631 \u0633\u0646\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0645\u0628\u0635\u0631 \u06c1\u06cc\u06ba\u06d4 \u0631\u06cc\u0627\u0633\u062a\u06cc \u0627\u062e\u0631\u0627\u062c \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0641\u0644\u0679\u0631 \u06a9\u0627 \u067e\u0648\u0631\u0627 \u0631\u06cc \u0627\u06cc\u06a9\u0679\u06cc\u0648 \u0633\u0633\u0679\u0645 (\u0627\u0633\u0679\u0631\u06cc\u0645\u0632\u060c \u0686\u06cc\u0646\u062c \u0646\u0648\u0679\u06cc\u0641\u0627\u0626\u0631\u060c \u0628\u06cc \u0627\u06cc\u0644 \u0627\u0648 \u0633\u06cc\u060c \u0648\u06cc\u0644\u06cc\u0648 \u0646\u0648\u0679\u06cc\u0641\u0627\u0626\u0631) \u0628\u0644\u0679 \u0627\u0646 \u0644\u0627\u0626\u0641 \u0633\u0627\u0626\u06cc\u06a9\u0644 \u0645\u06cc\u0646\u062c\u0645\u0646\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u0622\u0628\u0632\u0631\u0648\u0631 \u067e\u06cc\u0679\u0631\u0646 \u06c1\u06d2\u06d4 \u0627\u0633 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0633\u0637\u062d \u067e\u0631 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0648 \u0633\u0645\u062c\u06be\u0646\u06d2 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06cc\u06c1 \u0633\u0645\u062c\u06be\u0646\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u062a\u0645\u0627\u0645 \u0679\u0648\u0644\u0632 \u06a9\u06cc\u0633\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0622\u067e \u0635\u0631\u0641 \u0627\u0646 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0622\u067e \u0627\u0646 \u06a9\u0648 \u0633\u0645\u062c\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-deep-dive-into-event-driven-architecture\">\u0627\u06cc\u0648\u0646\u0679 \u0633\u06d2 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0645\u0632\u06cc\u062f \u062c\u0627\u0646\u06cc\u06ba\u06d4<\/h2>\n<p>\u0637\u0628\u0642\u0627\u062a\u06cc \u0633\u0637\u062d \u067e\u0631 \u0645\u0628\u0635\u0631 \u06a9\u0648 \u0633\u0645\u062c\u06be\u0646\u0627 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0686\u06cc\u0632 \u06c1\u06d2\u06d4 \u0622\u0631\u06a9\u06cc\u0679\u06cc\u06a9\u0686\u0631\u0644 \u0633\u0637\u062d \u067e\u0631 \u0644\u0627\u06af\u0648 \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u067e\u06cc\u0679\u0631\u0646 \u0628\u06c1\u062a \u0632\u06cc\u0627\u062f\u06c1 \u0637\u0627\u0642\u062a\u0648\u0631 \u06c1\u0648 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u06cc\u06c1 \u0648\u06c1 \u062c\u06af\u06c1 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u0627\u06cc\u0648\u0646\u0679 \u0633\u06d2 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u0627 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0627\u0645 \u0645\u06cc\u06ba \u0622\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-what-is-event-driven-architecture\">\u0648\u0627\u0642\u0639\u06c1 \u0633\u06d2 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u0627 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u06cc\u0627 \u06c1\u06d2\u061f<\/h3>\n<p>\u0648\u0627\u0642\u0639\u06c1 \u0633\u06d2 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u0627 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u0627\u06cc\u06a9 \u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u0627 \u0646\u0645\u0648\u0646\u06c1 \u06c1\u06d2 \u062c\u0633 \u0645\u06cc\u06ba \u06a9\u0633\u06cc \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u06a9\u06d2 \u0628\u06c1\u0627\u0624 \u06a9\u0627 \u062a\u0639\u06cc\u0646 \u0648\u0627\u0642\u0639\u0627\u062a \u0633\u06d2 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u062f\u0648\u0633\u0631\u06d2 \u06a9\u0648 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u06a9\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c \u0627\u062c\u0632\u0627\u0621 \u0645\u0634\u062a\u0631\u06a9\u06c1 \u0628\u0633 \u06cc\u0627 \u0686\u06cc\u0646\u0644 \u067e\u0631 \u0627\u06cc\u0648\u0646\u0679\u0633 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u06a9\u06d2 \u0627\u0648\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06a9\u06d2 \u0628\u0627\u062a \u0686\u06cc\u062a \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0631\u0648\u0627\u06cc\u062a\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u067e\u0631 \u0645\u0628\u0646\u06cc \u0628\u06c1\u0627\u0624 \u0645\u06cc\u06ba\u060c \u062f\u0631\u062c \u0630\u06cc\u0644 \u06c1\u0648\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-cpp\">Component A calls Component B directly\nComponent B does its work and returns a result\nComponent A waits for that result and then continues\n<\/code><\/pre>\n<p>\u062c\u0632\u0648 A \u062c\u0632\u0648 B \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u062c\u0627\u0646\u062a\u0627 \u06c1\u06d2\u06d4 \u0646\u0627\u0645 \u0633\u06d2 \u0645\u0646\u062d\u0635\u0631 \u06c1\u06d2\u06d4 \u062a\u06a9\u0645\u06cc\u0644 \u062a\u06a9 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u0622\u067e \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u062c\u0632\u0648 C \u062c\u0648 \u0628\u06be\u06cc \u062c\u0632\u0648 A \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0633 \u067e\u0631 \u0631\u062f\u0639\u0645\u0644 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u06d2\u060c \u0622\u067e \u06a9\u0648 \u062c\u0632\u0648 A \u067e\u0631 \u0648\u0627\u067e\u0633 \u062c\u0627\u0646\u0627 \u06c1\u0648\u06af\u0627 \u0627\u0648\u0631 \u0627\u0633 \u06a9\u0627\u0644 \u06a9\u0648 \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u0627 \u06c1\u0648\u06af\u0627\u06d4<\/p>\n<p>\u062a\u0627\u06c1\u0645\u060c \u062c\u0632\u0648 A \u0645\u06cc\u06ba \u0627\u0636\u0627\u0641\u06c1 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u062c\u0632\u0648 A \u0627\u0646 \u0646\u062a\u0627\u0626\u062c \u06a9\u0648 \u0645\u0631\u0628\u0648\u0637 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0630\u0645\u06c1 \u062f\u0627\u0631 \u06c1\u0648 \u06af\u0627 \u062c\u0633 \u0633\u06d2 \u0648\u06c1 \u0644\u0627\u0639\u0644\u0645 \u06c1\u06d2\u06d4<\/p>\n<p>\u0648\u0627\u0642\u0639\u06c1 \u0633\u06d2 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0628\u06c1\u0627\u0624 \u0645\u06cc\u06ba\u060c \u0627\u0633 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c \u062f\u0631\u062c \u0630\u06cc\u0644 \u06c1\u0648\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-cpp\">Component A publishes an event to the EventBus\nEventBus delivers the event to whoever is registered\n\nComponent B handles the event\nComponent C handles the event\nComponent D handles the event\n<\/code><\/pre>\n<p>\u062c\u0632\u0648 A B\u060c C \u0627\u0648\u0631 D \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0646\u06c1\u06cc\u06ba \u062c\u0627\u0646\u062a\u0627\u06d4 \u0627\u0633 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u0646\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4 \u06a9\u06cc\u0627 \u06c1\u0648\u0627 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0622\u06af\u06d2 \u0628\u0691\u06be\u06cc\u06ba\u06d4 \u0622\u067e \u062c\u0632\u0648 A \u06a9\u0648 \u0686\u06be\u0648\u0626\u06d2 \u0628\u063a\u06cc\u0631 \u0646\u0626\u06d2 \u06c1\u06cc\u0646\u0688\u0644\u0631\u0632 \u0634\u0627\u0645\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0622\u0628\u0632\u0631\u0648\u0631 \u067e\u06cc\u0679\u0631\u0646 \u06c1\u06d2 \u062c\u0633\u06d2 \u0622\u0631\u06a9\u06cc\u0679\u06cc\u06a9\u0686\u0631\u0644 \u0633\u0637\u062d \u062a\u06a9 \u0628\u0691\u06be\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-events-are-facts-not-commands\">\u0648\u0627\u0642\u0639\u0627\u062a \u062d\u0642\u0627\u0626\u0642 \u06c1\u06cc\u06ba \u0627\u062d\u06a9\u0627\u0645 \u0646\u06c1\u06cc\u06ba\u06d4<\/h3>\n<p>\u06cc\u06c1 \u0627\u0645\u062a\u06cc\u0627\u0632 \u0648\u0627\u0642\u0639\u06c1 \u0633\u06d2 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u0645\u06cc\u06ba \u0633\u0628 \u0633\u06d2 \u0627\u06c1\u0645 \u062a\u0635\u0648\u0631\u0627\u062a \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u06c1\u06d2\u06d4<\/p>\n<p>\u062d\u06a9\u0645 \u06a9\u06c1\u062a\u0627 \u06c1\u06d2\u060c &quot;\u06cc\u06c1 \u06a9\u0631\u0648\u06d4&#8221; \u06cc\u06c1 \u0627\u06cc\u06a9 \u0627\u06cc\u0633\u0627 \u062d\u06a9\u0645 \u06c1\u06d2 \u062c\u0633 \u0633\u06d2 \u0622\u067e \u0627\u0646\u06a9\u0627\u0631 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0645\u06cc\u06ba \u0622\u067e \u06a9\u06d2 \u062c\u0648\u0627\u0628 \u06a9\u0627 \u0645\u0646\u062a\u0638\u0631 \u06c1\u0648\u06ba\u06d4<\/p>\n<p>\u0648\u0627\u0642\u0639\u06c1 \u06a9\u06c1\u06d2 \u06af\u0627 &quot;\u06cc\u06c1 \u06c1\u0648\u0627&#8221;\u06d4 \u06cc\u06c1 \u062d\u0642\u06cc\u0642\u062a \u06a9\u0627 \u0627\u06cc\u06a9 \u0646\u0627\u0642\u0627\u0628\u0644 \u062a\u063a\u06cc\u0631 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06c1\u06d2\u06d4 \u0645\u062c\u06be\u06d2 \u062c\u0648\u0627\u0628 \u06a9\u06cc \u062a\u0648\u0642\u0639 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u0633 \u0633\u06d2 \u06a9\u0648\u0626\u06cc \u0641\u0631\u0642 \u0646\u06c1\u06cc\u06ba \u067e\u0691\u062a\u0627 \u06a9\u06c1 \u0627\u0633\u06d2 \u06a9\u0648\u0646 \u0633\u0646\u0628\u06be\u0627\u0644\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><code>SaveUserToken<\/code>    \u06cc\u06c1 \u0627\u06cc\u06a9 \u062d\u06a9\u0645 \u06c1\u06d2\u06d4 <code>UserLoggedIn<\/code> \u06cc\u06c1 \u0627\u06cc\u06a9 \u0648\u0627\u0642\u0639\u06c1 \u06c1\u06d2\u06d4<\/p>\n<p>\u0648\u0627\u0642\u0639\u0627\u062a \u06a9\u0648 \u062d\u0642\u0627\u0626\u0642 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0627\u067e\u0646\u06d2 \u0633\u0633\u0679\u0645 \u06a9\u0648 \u0645\u0627\u0688\u0644 \u0628\u0646\u0627\u0646\u0627 \u0622\u067e \u06a9\u0648 \u06c1\u0631 \u0627\u0633 \u0686\u06cc\u0632 \u06a9\u0627 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0622\u067e \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u06cc\u06ba \u06c1\u0648\u0627 \u06c1\u06d2\u06d4 \u0622\u067e \u0648\u0627\u0642\u0639\u0627\u062a \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0686\u0644\u0627 \u06a9\u0631 \u0631\u06cc\u0627\u0633\u062a \u06a9\u06cc \u062a\u0634\u06a9\u06cc\u0644 \u0646\u0648 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0622\u067e \u062a\u0627\u0631\u06cc\u062e \u06a9\u06d2 \u0648\u0627\u0642\u0639\u0627\u062a \u06a9\u0648 \u0633\u0646\u0628\u06be\u0627\u0644\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0646\u0626\u06d2 \u06c1\u06cc\u0646\u0688\u0644\u0631\u0632 \u0634\u0627\u0645\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06a9\u0645\u0627\u0646\u0688 \u067e\u0631 \u0645\u0628\u0646\u06cc \u0646\u0638\u0627\u0645\u0648\u06ba \u06a9\u06d2 \u0628\u0631\u0639\u06a9\u0633\u060c \u0646\u0638\u0627\u0645 \u0642\u0627\u0628\u0644 \u0633\u0645\u0627\u0639\u062a \u0627\u0648\u0631 \u067e\u06cc\u0634 \u0642\u06cc\u0627\u0633\u06cc \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-modelling-domain-events-in-dart\">\u0688\u0627\u0631\u0679 \u0645\u06cc\u06ba \u0645\u0627\u0688\u0644\u0646\u06af \u0688\u0648\u0645\u06cc\u0646 \u0627\u06cc\u0648\u0646\u0679\u0633<\/h3>\n<p>\u0627\u06cc\u0648\u0646\u0679\u0633 \u06a9\u0648 \u0646\u0627\u0642\u0627\u0628\u0644 \u062a\u063a\u06cc\u0631 \u0642\u062f\u0631 \u0627\u0634\u06cc\u0627\u0621 \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u06cc\u06c1 \u0633\u0686 \u06c1\u06d2\u06d4 \u062d\u0642\u0627\u0626\u0642 \u0631\u0648\u0646\u0645\u0627 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u0646\u06c1\u06cc\u06ba \u0628\u062f\u0644\u062a\u06d2\u06d4<\/p>\n<pre><code class=\"language-cpp\">abstract class DomainEvent {\n  final DateTime occurredAt;\n  final String eventId;\n\n  const DomainEvent({\n    required this.occurredAt,\n    required this.eventId,\n  });\n}\n<\/code><\/pre>\n<p><code>DomainEvent<\/code>    \u0633\u0633\u0679\u0645 \u0645\u06cc\u06ba \u062a\u0645\u0627\u0645 \u0648\u0627\u0642\u0639\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u06cc\u0633 \u06a9\u0644\u0627\u0633\u06d4 \u062a\u0645\u0627\u0645 \u0648\u0627\u0642\u0639\u0627\u062a \u06a9\u0627 \u0679\u0627\u0626\u0645 \u0627\u0633\u0679\u06cc\u0645\u067e \u06c1\u0648\u062a\u0627 \u06c1\u06d2 (<code>occurredAt<\/code>) \u0648\u0627\u0642\u0639\u06c1 \u06a9\u06d2 \u0648\u0642\u062a \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0627\u0648\u0631 \u0645\u0646\u0641\u0631\u062f \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 (<code>eventId<\/code>) \u0679\u0631\u06cc\u0633 \u0627\u06cc\u0628\u0644\u0679\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2\u06d4<\/p>\n<pre><code class=\"language-cpp\">class UserLoggedIn extends DomainEvent {\n  final UserDto user;\n\n  const UserLoggedIn({\n    required this.user,\n    required super.occurredAt,\n    required super.eventId,\n  });\n}\n\nclass LoginFailed extends DomainEvent {\n  final AppException error;\n\n  const LoginFailed({\n    required this.error,\n    required super.occurredAt,\n    required super.eventId,\n  });\n}\n<\/code><\/pre>\n<p><code>UserLoggedIn<\/code>    \u0635\u0627\u0631\u0641 \u06a9\u0627 \u0688\u06cc\u0679\u0627 \u0644\u06d2 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>LoginFailed<\/code> \u0627\u06cc\u06a9 \u062e\u0631\u0627\u0628\u06cc \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u062f\u0648\u0646\u0648\u06ba \u0646\u0627\u0642\u0627\u0628\u0644 \u062a\u063a\u06cc\u0631 \u06c1\u06cc\u06ba\u06d4 \u062f\u0648\u0646\u0648\u06ba \u06a9\u06d2 \u067e\u0627\u0633 \u0679\u0627\u0626\u0645 \u0627\u0633\u0679\u06cc\u0645\u067e \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06c1\u06d2\u06d4 \u0688\u0648\u0645\u06cc\u0646 \u0645\u06cc\u06ba \u06a9\u06cc\u0627 \u06c1\u0648\u0627 \u0627\u0633 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u062f\u0648\u0646\u0648\u06ba \u0645\u062e\u0635\u0648\u0635 \u062d\u0642\u0627\u0626\u0642 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-a-type-safe-domaineventbus\">\u0679\u0627\u0626\u067e \u0633\u06cc\u0641 \u0688\u0648\u0645\u06cc\u0646 \u0627\u06cc\u0648\u0646\u0679 \u0628\u0633<\/h3>\n<p>\u0627\u0628 \u06c1\u0645 \u0627\u06cc\u06a9 \u0627\u06cc\u0648\u0646\u0679 \u0628\u0633 \u0628\u0646\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0648 \u062e\u0627\u0635 \u0637\u0648\u0631 \u067e\u0631 \u0688\u0648\u0645\u06cc\u0646 \u0627\u06cc\u0648\u0646\u0679\u0633 \u06a9\u0648 \u0641\u06cc\u0688 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-cpp\">abstract class EventHandler<t extends=\"\" domainevent=\"\"> {\n  void handle(T event);\n}\n<\/t><\/code><\/pre>\n<p><code>EventHandler<t\/><\/code>    \u06cc\u06c1 \u0627\u0633 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0627 \u0645\u0628\u0635\u0631 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u06c1\u06d2\u06d4 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u06a9\u0644\u0627\u0633 \u062c\u0648 \u0688\u0648\u0645\u06cc\u0646 \u0627\u06cc\u0648\u0646\u0679\u0633 \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u062a\u06cc \u06c1\u06d2 \u0648\u06c1 \u0645\u062e\u0635\u0648\u0635 \u0627\u06cc\u0648\u0646\u0679 \u06a9\u06cc \u062f\u0644\u0686\u0633\u067e\u06cc \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0627\u0633\u06d2 \u0644\u0627\u06af\u0648 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-cpp\">class DomainEventBus {\n  final _handlers = <type list=\"\">>{};\n\n  void register<t extends=\"\" domainevent=\"\">(EventHandler<t> handler) {\n    _handlers.putIfAbsent(T, () => []).add(handler);\n  }\n\n  void publish<t extends=\"\" domainevent=\"\">(T event) {\n    final handlers = List.of(_handlers[T] ?? []);\n    for (final handler in handlers) {\n      try {\n        (handler as EventHandler<t>).handle(event);\n      } catch (e) {\n        debugPrint('[DomainEventBus] Handler error for ${T}: $e');\n      }\n    }\n  }\n}\n<\/t><\/t><\/t><\/t><\/type><\/code><\/pre>\n<p>\u0686\u0644\u0648 \u06af\u0632\u0631\u062a\u06d2 \u06c1\u06cc\u06ba <code>DomainEventBus<\/code> \u06c1\u0648\u0634\u06cc\u0627\u0631 \u0631\u06c1\u0648\u06d4<\/p>\n<p><code>_handlers<\/code>    \u06cc\u06c1 \u0627\u06cc\u06a9 \u0686\u0627\u0628\u06cc \u0648\u0627\u0644\u0627 \u0646\u0642\u0634\u06c1 \u06c1\u06d2\u06d4 <code>Type<\/code> (\u0627\u06cc\u0648\u0646\u0679 \u06a9\u0644\u0627\u0633 \u062e\u0648\u062f \u06c1\u06d2\u06d4 <code>UserLoggedIn<\/code>) \u0642\u062f\u0631 \u0627\u0633 \u0627\u06cc\u0648\u0646\u0679 \u06a9\u06cc \u0642\u0633\u0645 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0631\u062c\u0633\u0679\u0631\u0688 \u062a\u0645\u0627\u0645 \u06c1\u06cc\u0646\u0688\u0644\u0631\u0632 \u06a9\u06cc \u0641\u06c1\u0631\u0633\u062a \u06c1\u06d2\u06d4<\/p>\n<p><code>register<t\/><\/code>    \u0627\u06cc\u06a9 \u06c1\u06cc\u0646\u0688\u0644\u0631 \u062d\u0627\u0635\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0642\u0633\u0645 \u06a9\u06cc \u0641\u06c1\u0631\u0633\u062a \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>T<\/code>. <code>putIfAbsent<\/code> \u0627\u06af\u0631 \u06cc\u06c1 \u0627\u0633 \u0627\u06cc\u0648\u0646\u0679 \u06a9\u06cc \u0642\u0633\u0645 \u06a9\u0627 \u067e\u06c1\u0644\u0627 \u06c1\u06cc\u0646\u0688\u0644\u0631 \u06c1\u06d2\u060c \u062a\u0648 \u062f\u06cc\u06a9\u06be\u06cc\u06ba \u06a9\u06c1 \u0622\u06cc\u0627 \u06cc\u06c1 \u0641\u06c1\u0631\u0633\u062a \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><code>publish<t\/><\/code>    \u0634\u0627\u0626\u0639 \u06c1\u0648\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0627\u06cc\u0648\u0646\u0679 \u06a9\u06cc \u0642\u0633\u0645 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0631\u062c\u0633\u0679\u0631\u0688 \u062a\u0645\u0627\u0645 \u06c1\u06cc\u0646\u0688\u0644\u0631\u0632 \u06a9\u0648 \u062a\u0644\u0627\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06c1\u0631 \u06c1\u06cc\u0646\u0688\u0644\u0631 \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>handle<\/code> \u0637\u0631\u06cc\u0642\u06c1 \u0633\u0646\u06cc\u067e \u0634\u0627\u0679 <code>List.of()<\/code> \u0641\u06cc \u06c1\u06cc\u0646\u0688\u0644\u0631 \u0679\u0631\u0627\u0626\u06cc\/\u06a9\u06cc\u0686 \u0627\u0646\u06c1\u06cc \u0648\u062c\u0648\u06c1\u0627\u062a \u06a9\u06cc \u0628\u0646\u0627 \u067e\u0631 \u0645\u0648\u062c\u0648\u062f \u06c1\u06cc\u06ba \u062c\u0648 \u06c1\u0645 \u0646\u06d2 \u067e\u06c1\u0644\u06d2 \u0642\u0627\u0626\u0645 \u06a9\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06c1\u06cc\u0646\u0688\u0644\u0631 \u06a9\u0648 \u0631\u062c\u0633\u0679\u0631 \u06a9\u0631\u0646\u06d2 \u0627\u0648\u0631 \u0627\u06cc\u0648\u0646\u0679 \u067e\u0648\u0633\u0679 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0637\u0631\u06cc\u0642\u06c1 \u06cc\u06c1\u0627\u06ba \u06c1\u06d2:<\/p>\n<pre><code class=\"language-dart\">\/\/ Registration happens once at startup\neventBus.register<userloggedin>(TokenHandler(secureStorage));\neventBus.register<userloggedin>(UserCacheHandler(userCache));\neventBus.register<userloggedin>(NavigationHandler(navigationService));\neventBus.register<userloggedin>(AnalyticsHandler(analyticsService));\n\neventBus.register<paymentconfirmed>(ReceiptHandler(receiptService));\neventBus.register<paymentconfirmed>(InventoryHandler(inventoryService));\n\n\/\/ Publishing happens at the use case level\neventBus.publish(UserLoggedIn(\n  user: user,\n  occurredAt: DateTime.now(),\n  eventId: const Uuid().v4(),\n));\n<\/paymentconfirmed><\/paymentconfirmed><\/userloggedin><\/userloggedin><\/userloggedin><\/userloggedin><\/code><\/pre>\n<p>\u062c\u0628 <code>UserLoggedIn<\/code> \u0634\u0627\u0626\u0639 \u06c1\u0648\u0646\u06d2 \u067e\u0631\u060c \u0635\u0631\u0641 \u0631\u062c\u0633\u0679\u0631\u0688 \u06c1\u06cc\u0646\u0688\u0644\u0631\u0632 \u06a9\u0648 \u067e\u06be\u0627\u0646\u0633\u06cc \u062f\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u062f\u0627\u0626\u06cc\u06af\u06cc \u06a9\u06d2 \u06c1\u06cc\u0646\u0688\u0644\u0631 \u06a9\u0648 \u0686\u06be\u0648\u0627 \u0646\u06c1\u06cc\u06ba \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u062a\u0645\u0627\u0645 \u06c1\u06cc\u0646\u0688\u0644\u0631\u0632 <code>UserLoggedIn<\/code> \u0645\u06a9\u0645\u0644 \u0627\u06cc\u0631\u0631 \u0622\u0626\u0633\u0648\u0644\u06cc\u0634\u0646 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0622\u0632\u0627\u062f\u0627\u0646\u06c1 \u0637\u0648\u0631 \u067e\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-application-in-domain-driven-design\">\u0688\u0648\u0645\u06cc\u0646 \u067e\u0631 \u0645\u0628\u0646\u06cc \u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0631\u062e\u0648\u0627\u0633\u062a<\/h2>\n<p>\u0627\u06cc\u0648\u0646\u0679 \u067e\u0631 \u0645\u0628\u0646\u06cc \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u0627\u0648\u0631 \u0622\u0628\u0632\u0631\u0648\u0631 \u067e\u06cc\u0679\u0631\u0646 \u0688\u0648\u0645\u06cc\u0646 \u0633\u06d2 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0688\u06cc\u0632\u0627\u0626\u0646 \u0645\u06cc\u06ba \u0627\u067e\u0646\u0627 \u0633\u0628 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0645\u0646\u0638\u0645 \u06af\u06be\u0631 \u062a\u0644\u0627\u0634 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 DDD \u0627\u06cc\u06a9 \u0630\u062e\u06cc\u0631\u06c1 \u0627\u0644\u0641\u0627\u0638 \u0627\u0648\u0631 \u0633\u0627\u062e\u062a \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0622\u067e \u06a9\u0648 \u06cc\u06c1 \u062c\u0627\u0646\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0648\u0627\u0642\u0639\u06c1 \u06a9\u06c1\u0627\u06ba \u0633\u06d2 \u062a\u0639\u0644\u0642 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u060c \u06a9\u0648\u0646 \u0627\u0633\u06d2 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u06a9\u0648\u0646 \u0627\u0633 \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-key-ddd-concepts-you-need-to-know\">\u06a9\u0644\u06cc\u062f\u06cc DDD \u062a\u0635\u0648\u0631\u0627\u062a \u062c\u0648 \u0622\u067e \u06a9\u0648 \u062c\u0627\u0646\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4<\/h3>\n<p><strong>\u0688\u0648\u0645\u06cc\u0646 \u06a9\u06d2 \u0648\u0627\u0642\u0639\u0627\u062a<\/strong> \u0645\u06cc\u06ba DDD \u06a9\u0627 \u0641\u0631\u0633\u0679 \u06a9\u0644\u0627\u0633 \u0634\u06c1\u0631\u06cc \u06c1\u0648\u06ba\u06d4 \u06cc\u06c1 \u06a9\u0633\u06cc \u0645\u0639\u0646\u06cc \u062e\u06cc\u0632 \u0686\u06cc\u0632 \u06a9\u06cc \u0646\u0645\u0627\u0626\u0646\u062f\u06af\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0622\u067e \u06a9\u06d2 \u06a9\u0627\u0631\u0648\u0628\u0627\u0631\u06cc \u0639\u0644\u0627\u0642\u06d2 \u0645\u06cc\u06ba \u06c1\u0648\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u06a9\u0627\u0631\u0648\u0628\u0627\u0631\u06cc \u062d\u0642\u0627\u0626\u0642 \u06c1\u06cc\u06ba\u060c \u062a\u06a9\u0646\u06cc\u06a9\u06cc \u062a\u0641\u0635\u06cc\u0644\u0627\u062a \u06cc\u0627 HTTP \u062c\u0648\u0627\u0628\u0627\u062a \u0646\u06c1\u06cc\u06ba\u06d4<\/p>\n<p><code>UserLoggedIn<\/code>    \u06cc\u06c1 \u0627\u06cc\u06a9 \u0688\u0648\u0645\u06cc\u0646 \u0627\u06cc\u0648\u0646\u0679 \u06c1\u06d2\u06d4 <code>LoginResponseDto<\/code> \u0688\u06cc\u0679\u0627 \u0679\u0631\u0627\u0646\u0633\u0641\u0631 \u0622\u0628\u062c\u06cc\u06a9\u0679\u06d4 \u062a\u0641\u0631\u06cc\u0642 \u0628\u06c1\u062a \u0627\u06c1\u0645 \u06c1\u06d2\u06d4 \u0648\u0627\u0642\u0639\u0627\u062a \u0688\u0648\u0645\u06cc\u0646 \u0645\u0627\u0688\u0644 \u0633\u06d2 \u062a\u0639\u0644\u0642 \u0631\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u06a9\u0627\u0631\u0648\u0628\u0627\u0631\u06cc \u0632\u0628\u0627\u0646 \u06a9\u06cc \u0646\u0645\u0627\u0626\u0646\u062f\u06af\u06cc \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0688\u06cc \u0679\u06cc \u0627\u0648\u0632 \u0688\u06cc\u0679\u0627 \u0644\u06cc\u0626\u0631 \u0633\u06d2 \u062a\u0639\u0644\u0642 \u0631\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0688\u06cc\u0679\u0627 \u0688\u06be\u0627\u0646\u0686\u06d2 \u06a9\u06cc \u0646\u0645\u0627\u0626\u0646\u062f\u06af\u06cc \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p><strong>\u062a\u0639\u062f\u0627\u062f<\/strong> \u06cc\u06c1 \u0688\u0648\u0645\u06cc\u0646 \u06a9\u06d2 \u0648\u0627\u0642\u0639\u0627\u062a \u06a9\u0627 \u0642\u062f\u0631\u062a\u06cc \u0630\u0631\u06cc\u0639\u06c1 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0645\u062c\u0645\u0648\u0639\u06cc \u0688\u0648\u0645\u06cc\u0646 \u0627\u0634\u06cc\u0627\u0621 \u06a9\u0627 \u0627\u06cc\u06a9 \u062c\u06be\u0631\u0645\u0679 \u06c1\u06d2 \u062c\u0648 \u0645\u0633\u062a\u0642\u0644 \u0645\u0632\u0627\u062c\u06cc \u06a9\u06cc \u062d\u062f \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u06af\u0631\u06cc\u06af\u06cc\u0679\u0633 \u06a9\u0627\u0631\u0648\u0628\u0627\u0631\u06cc \u0642\u0648\u0627\u0639\u062f \u06a9\u0648 \u0646\u0627\u0641\u0630 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0688\u0648\u0645\u06cc\u0646 \u06a9\u06d2 \u0648\u0627\u0642\u0639\u0627\u062a \u06a9\u0648 \u0628\u0691\u06be\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0628 \u0627\u0646 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0627\u06c1\u0645 \u0631\u06cc\u0627\u0633\u062a\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba \u0631\u0648\u0646\u0645\u0627 \u06c1\u0648\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p><strong>\u06a9\u06cc\u0633\u0632 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/strong> \u06cc\u06c1 \u0622\u0631\u06a9\u06cc\u0633\u0679\u0631\u06cc\u0679\u0631\u0632 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0627 \u0645\u0639\u0627\u0645\u0644\u06c1 \u0631\u06cc\u067e\u0648\u0632\u0679\u0631\u06cc \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631\u0646\u0627\u060c \u0646\u062a\u06cc\u062c\u06c1 \u062d\u0627\u0635\u0644 \u06a9\u0631\u0646\u0627\u060c \u0645\u0646\u0627\u0633\u0628 \u0688\u0648\u0645\u06cc\u0646 \u0627\u06cc\u0648\u0646\u0679 \u06a9\u0648 \u0628\u0691\u06be\u0627\u0646\u0627\u060c \u0627\u0648\u0631 \u0646\u062a\u06cc\u062c\u06c1 \u0648\u0627\u067e\u0633 \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0636\u0645\u0646\u06cc \u0627\u062b\u0631\u0627\u062a \u0633\u06d2 \u0646\u0645\u0679\u0646\u06d2 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0631\u062c\u0633\u0679\u0631\u0688 \u06c1\u06cc\u0646\u0688\u0644\u0631 \u06a9\u0648 \u0628\u062a\u0627\u0626\u06cc\u06ba \u06a9\u06c1 \u06a9\u06cc\u0627 \u06c1\u0648\u0627 \u0627\u0648\u0631 \u0631\u062c\u0633\u0679\u0631\u0688 \u06c1\u06cc\u0646\u0688\u0644\u0631 \u06a9\u0648 \u0633\u0646\u0628\u06be\u0627\u0644\u0646\u06d2 \u062f\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-where-everything-lives-in-clean-architecture\">\u062c\u06c1\u0627\u06ba \u06c1\u0631 \u0686\u06cc\u0632 \u0635\u0627\u0641 \u0633\u062a\u06be\u0631\u06d2 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u0645\u06cc\u06ba \u0631\u06c1\u062a\u06cc \u06c1\u06d2\u06d4<\/h3>\n<pre><code class=\"language-plaintext\">lib\/\n  core\/\n    events\/\n      domain_event.dart           <- Base DomainEvent class\n      domain_event_bus.dart       <- The DomainEventBus\n      event_handler.dart          <- Base EventHandler interface\n\n  features\/\n    auth\/\n      domain\/\n        events\/\n          user_logged_in.dart     <- Domain event (pure Dart, no Flutter)\n          login_failed.dart       <- Domain event\n        handlers\/\n          token_handler.dart      <- Handles token storage\n          user_cache_handler.dart <- Handles user caching\n          analytics_handler.dart  <- Handles analytics\n        entities\/\n          user.dart\n        repositories\/\n          auth_repository.dart    <- Abstract interface only\n        usecases\/\n          login_usecase.dart      <- Orchestrates, publishes events\n\n      data\/\n        repositories\/\n          auth_repository_impl.dart\n        datasources\/\n          auth_remote_datasource.dart\n\n      presentation\/\n        providers\/\n          login_provider.dart     <- Riverpod notifier (thin)\n        pages\/\n          login_page.dart\n<\/code><\/pre>\n<p>\u0627\u06c1\u0645 \u0627\u0635\u0648\u0644: \u0688\u0648\u0645\u06cc\u0646 \u067e\u0631\u062a \u062e\u0627\u0644\u0635 \u0688\u0627\u0631\u0679 \u06c1\u06d2\u06d4 \u06a9\u0648\u0626\u06cc \u0641\u0644\u0679\u0631 \u062f\u0631\u0622\u0645\u062f\u0627\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4 \u0631\u06cc\u0648\u0631 \u067e\u0648\u0688 \u062f\u0631\u0622\u0645\u062f \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0648\u0626\u06cc HTTP \u0628\u0627\u0632\u06cc\u0627\u0641\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06a9\u06c1 <code>DomainEventBus<\/code>\u0688\u0648\u0645\u06cc\u0646 \u0627\u06cc\u0648\u0646\u0679\u0633\u060c \u06c1\u06cc\u0646\u0688\u0644\u0631\u0632\u060c \u0627\u0648\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u0645\u0639\u0627\u0645\u0644\u0627\u062a \u0633\u0628\u06be\u06cc \u0688\u0648\u0645\u06cc\u0646 \u0644\u06cc\u0626\u0631 \u0645\u06cc\u06ba \u0631\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0646 \u06a9\u0627 \u06a9\u0648\u0626\u06cc \u0641\u0631\u06cc\u0645 \u0648\u0631\u06a9 \u0627\u0646\u062d\u0635\u0627\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u0648\u06c1\u06cc \u0688\u0648\u0645\u06cc\u0646 \u0645\u0646\u0637\u0642 \u0641\u0644\u0679\u0631\u060c \u0633\u0631\u0648\u0631 \u0633\u0627\u0626\u0688 \u0688\u0627\u0631\u0679\u060c \u06cc\u0627 \u0633\u06cc \u0627\u06cc\u0644 \u0622\u0626\u06cc \u0679\u0648\u0644\u0632 \u0645\u06cc\u06ba \u0628\u063a\u06cc\u0631 \u0627\u06cc\u06a9 \u0644\u0627\u0626\u0646 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u06cc\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u06d2 \u06af\u06cc\u06d4 \u0631\u06cc\u0648\u0631 \u067e\u0648\u0688 2.x \u0633\u06d2 \u0645\u0633\u062a\u0642\u0628\u0644 \u06a9\u06d2 \u0648\u0631\u0698\u0646 \u062a\u06a9 \u0641\u0631\u06cc\u0645 \u0648\u0631\u06a9 \u0627\u067e \u06af\u0631\u06cc\u0688 \u0622\u067e \u06a9\u06d2 \u0688\u0648\u0645\u06cc\u0646 \u06a9\u0648 \u0646\u06c1\u06cc\u06ba \u0686\u06be\u0648\u0626\u06d2 \u06af\u0627\u06d4 \u0622\u067e \u06a9\u06d2 \u0688\u0648\u0645\u06cc\u0646 \u06a9\u06d2 \u06cc\u0648\u0646\u0679 \u0679\u06cc\u0633\u0679 \u0628\u063a\u06cc\u0631 \u06a9\u0633\u06cc \u0648\u06cc\u062c\u06cc\u0679 \u0679\u06cc\u0633\u0679\u0646\u06af \u0627\u0648\u0648\u0631 \u06c1\u06cc\u0688 \u06a9\u06d2 \u0645\u0644\u06cc \u0633\u06cc\u06a9\u0646\u0688 \u0645\u06cc\u06ba \u0686\u0644\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-the-login-use-case-in-ddd\">DDD \u06a9\u06d2 \u0644\u06cc\u06d2 \u0644\u0627\u06af \u0627\u0646 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u06a9\u06cc\u0633\u0632<\/h3>\n<pre><code class=\"language-cpp\">class LoginUseCase {\n  final AuthRepository _repository;\n  final DomainEventBus _eventBus;\n\n  LoginUseCase({\n    required AuthRepository repository,\n    required DomainEventBus eventBus,\n  })  : _repository = repository,\n        _eventBus = eventBus;\n\n  Future<result appexception=\"\">> execute(LoginRequest request) async {\n    try {\n      final user = await _repository.login(request);\n\n      _eventBus.publish(UserLoggedIn(\n        user: user,\n        occurredAt: DateTime.now(),\n        eventId: const Uuid().v4(),\n      ));\n\n      return Result.success(user);\n    } on AppException catch (e) {\n      _eventBus.publish(LoginFailed(\n        error: e,\n        occurredAt: DateTime.now(),\n        eventId: const Uuid().v4(),\n      ));\n\n      return Result.failure(e);\n    }\n  }\n}\n<\/result><\/code><\/pre>\n<p>\u0622\u0626\u06cc\u06d2 \u0627\u0646 \u0645\u0631\u0627\u062d\u0644 \u0633\u06d2 \u0642\u062f\u0645 \u0628\u06c1 \u0642\u062f\u0645 \u0686\u0644\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p><code>LoginUseCase<\/code>    \u06cc\u06c1 \u062f\u0648 \u0627\u0646\u062d\u0635\u0627\u0631 \u0644\u06cc\u062a\u0627 \u06c1\u06d2: <code>AuthRepository<\/code> \u062e\u0644\u0627\u0635\u06c1 \u0627\u0648\u0631 <code>DomainEventBus<\/code>. \u06cc\u06c1 \u0627\u06cc\u06a9 \u06a9\u0646\u06a9\u0631\u06cc\u0679 \u06a9\u0644\u0627\u0633 \u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u062f\u0648\u0646\u0648\u06ba \u06a9\u0648 \u062c\u0627\u0646\u0686 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0646\u062f\u0631 <code>execute<\/code>\u0644\u0627\u06af \u0627\u0646 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u0645 \u0631\u06cc\u067e\u0648\u0632\u0679\u0631\u06cc \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u0622\u067e \u06a9\u0627\u0645\u06cc\u0627\u0628\u06cc \u0633\u06d2 \u0644\u0627\u06af \u0627\u0646 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>UserLoggedIn<\/code> \u0627\u06cc\u0648\u0646\u0679 \u06a9\u0648 \u0628\u0633 \u062a\u06a9 \u067e\u06c1\u0646\u0686\u0627\u0646\u06d2 \u0633\u06d2\u060c \u062a\u0645\u0627\u0645 \u0631\u062c\u0633\u0679\u0631\u0688 \u06c1\u06cc\u0646\u0688\u0644\u0631\u0632 \u06a9\u0648 \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0645\u0637\u0644\u0639 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u067e\u06be\u0631 <code>Result.success<\/code> \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0688\u06cc\u0679\u0627 \u06a9\u0648 \u0644\u067e\u06cc\u0679\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0631 <code>AppException<\/code> \u067e\u06a9\u0691\u0627 \u062c\u0627\u0626\u06d2 \u062a\u0648 \u0634\u0627\u0626\u0639 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>LoginFailed<\/code> \u0627\u06cc\u0648\u0646\u0679 \u06a9\u0648 \u0628\u0633 \u062a\u06a9 \u067e\u06c1\u0646\u0686\u0627 \u06a9\u0631 \u062a\u0645\u0627\u0645 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u06cc\u0646\u0688\u0644\u0631\u0632 \u06a9\u0648 \u0645\u0637\u0644\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u067e\u06be\u0631 <code>Result.failure<\/code> \u063a\u0644\u0637\u06cc \u06a9\u0648 \u0633\u0645\u06cc\u0679\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0622\u067e \u06a9\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u0645\u0639\u0627\u0645\u0644\u06d2 \u0645\u06cc\u06ba\u060c \u0622\u067e \u0646\u06c1\u06cc\u06ba \u062c\u0627\u0646\u062a\u06d2 \u06a9\u06c1 \u06a9\u062a\u0646\u06d2 \u06c1\u06cc\u0646\u0688\u0644\u0631\u0632 \u0631\u062c\u0633\u0679\u0631\u0688 \u06c1\u06cc\u06ba\u06d4 \u0648\u06c1 \u0646\u06c1\u06cc\u06ba \u062c\u0627\u0646\u062a\u06d2 \u06a9\u06c1 \u0648\u06c1 \u06a9\u06cc\u0627 \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06cc\u06a9 \u0622\u067e\u0631\u06cc\u0634\u0646 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0646\u062a\u06cc\u062c\u06c1 \u06a9\u0648 \u0688\u0648\u0645\u06cc\u0646 \u0627\u06cc\u0648\u0646\u0679 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0634\u0627\u0626\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0646\u062a\u06cc\u062c\u06c1 \u0648\u0627\u067e\u0633 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u06c1 <code>Result<\/code> type \u0627\u06cc\u06a9 \u0631\u06cc\u0679\u0631\u0646 \u0648\u06cc\u0644\u06cc\u0648 \u06c1\u06d2 \u062c\u0648 \u06a9\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 (Riverpod Notifier) \u200b\u200b\u06a9\u0648 \u0646\u062a\u06cc\u062c\u06c1 \u062c\u0627\u0646\u0646\u06d2 \u062f\u06cc\u062a\u06cc \u06c1\u06d2\u06d4 \u0688\u0648\u0645\u06cc\u0646 \u0627\u06cc\u0648\u0646\u0679\u0633 \u06a9\u0648 \u062a\u0645\u0627\u0645 \u0633\u0627\u0626\u06cc\u0688 \u0627\u06cc\u0641\u06cc\u06a9\u0679 \u06c1\u06cc\u0646\u0688\u0644\u0631\u0632 \u067e\u0631 \u0646\u0634\u0631 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u062f\u0648\u0646\u0648\u06ba \u0627\u06cc\u06a9 \u06c1\u06cc \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u06a9\u06cc\u0633 \u06a9\u0627\u0644 \u0633\u06d2 \u0645\u0646\u062a\u0642\u0644 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0648\u06c1\u06cc \u0686\u06cc\u0632 \u06c1\u06d2 \u062c\u0648 \u0639\u0645\u0627\u0631\u062a \u06a9\u0648 \u0635\u0627\u0641 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-the-riverpod-hybrid-clean-architecture-in-practice\">\u0631\u06cc\u0648\u0631 \u067e\u0648\u0688 \u06c1\u0627\u0626\u0628\u0631\u0688: \u0627\u0635\u0644\u06cc \u0635\u0627\u0641 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631<\/h2>\n<p>\u06cc\u06c1 \u0648\u06c1 \u062c\u06af\u06c1 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u0627\u06cc\u06a9 \u062d\u0642\u06cc\u0642\u06cc \u0641\u0644\u0679\u0631 \u0627\u06cc\u067e\u0644\u06cc \u06a9\u06cc\u0634\u0646 \u0645\u06cc\u06ba \u0633\u0628 \u06a9\u0686\u06be \u0627\u06a9\u0679\u06be\u0627 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-the-problem-we-are-solving\">\u0645\u0633\u0627\u0626\u0644 \u062c\u0648 \u06c1\u0645 \u062d\u0644 \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4<\/h3>\n<p>\u0641\u0644\u0679\u0631 \u0627\u06cc\u067e\u0633 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062f\u0648 \u0639\u0627\u0645 \u0645\u0633\u0627\u0626\u0644 \u06c1\u06cc\u06ba \u062c\u0648 \u0631\u06cc\u0648\u0631 \u067e\u0648\u0688 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0648\u06cc\u062c\u06cc\u0679 \u0645\u06cc\u06ba Fat ref.listen:<\/p>\n<pre><code class=\"language-cpp\">\/\/ This is messy\nref.listen<asyncvalue>>(loginProvider, (previous, next) {\n  next.whenData((user) {\n    if (user != null) {\n      secureStorage.write(key: 'token', value: user.token);\n      userCache.save(user);\n      context.go('\/home');\n      analytics.track('login_success');\n    }\n  });\n});\n<\/asyncvalue><\/code><\/pre>\n<p>\u0648\u06cc\u062c\u06cc\u0679 \u0646\u0635\u0628 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0622\u067e \u06cc\u06c1 \u0633\u0628 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u0633\u06d2 \u0627\u0646 \u0645\u0627\u0624\u0646\u0679 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648\u060c \u06a9\u0686\u06be \u0636\u0645\u0646\u06cc \u0627\u062b\u0631\u0627\u062a \u0646\u06c1\u06cc\u06ba \u0686\u0644 \u0633\u06a9\u062a\u06d2\u06d4 \u06a9\u0627\u0631\u0648\u0628\u0627\u0631\u06cc \u0646\u062a\u0627\u0626\u062c \u062c\u06cc\u0633\u06d2 \u0679\u0648\u06a9\u0646 \u0627\u0633\u0679\u0648\u0631\u06cc\u062c \u0627\u0648\u0631 \u0646\u06cc\u0648\u06cc\u06af\u06cc\u0634\u0646 \u06a9\u0627 \u0627\u0646\u062d\u0635\u0627\u0631 \u0627\u0633 \u0628\u0627\u062a \u067e\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 \u06a9\u06c1 \u0622\u06cc\u0627 \u0648\u06cc\u062c\u06cc\u0679 \u0627\u0628\u06be\u06cc \u0628\u06be\u06cc \u0632\u0646\u062f\u06c1 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u06a9\u0645\u0632\u0648\u0631 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u06c1\u06d2\u06d4<\/p>\n<p>\u0686\u0631\u0628\u06cc \u06a9\u06cc \u06cc\u0627\u062f \u062f\u06c1\u0627\u0646\u06cc:<\/p>\n<pre><code class=\"language-dart\">\/\/ Notifier doing too much\nFuture<void> login(LoginRequest request) async {\n  state = const AsyncLoading();\n  try {\n    final user = await _loginUseCase.execute(request);\n    await _secureStorage.write(key: 'token', value: user.token);\n    await _userCache.save(user);\n    _navigationService.navigateTo('\/home');\n    _analytics.track('login_success');\n    state = AsyncData(user);\n  } catch (e, st) {\n    state = AsyncError(e, st);\n  }\n}\n<\/void><\/code><\/pre>\n<p>\u0646\u0648\u0679\u06cc\u0641\u0627\u0626\u0631 \u0648\u0627\u062d\u062f \u0630\u0645\u06c1 \u062f\u0627\u0631\u06cc \u06a9\u06d2 \u0627\u0635\u0648\u0644 \u06a9\u06cc \u062e\u0644\u0627\u0641 \u0648\u0631\u0632\u06cc \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4 \u0644\u0627\u06af \u0627\u0646 \u06a9\u0631\u06cc\u06ba\u060c \u0679\u0648\u06a9\u0646 \u0627\u0633\u0679\u0648\u0631 \u06a9\u0631\u06cc\u06ba\u060c \u06a9\u06cc\u0634 \u06cc\u0648\u0632\u0631\u0632 \u06a9\u0631\u06cc\u06ba\u060c \u0646\u06cc\u0648\u06cc\u06af\u06cc\u0679 \u06a9\u0631\u06cc\u06ba\u060c \u062a\u062c\u0632\u06cc\u0627\u062a \u06a9\u0648 \u0679\u0631\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u060c \u0627\u0648\u0631 UI \u062d\u0627\u0644\u062a \u06a9\u0627 \u0646\u0638\u0645 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u06cc\u06a9 \u06a9\u0644\u0627\u0633 \u0645\u06cc\u06ba \u0686\u06be \u0630\u0645\u06c1 \u062f\u0627\u0631\u06cc\u0627\u06ba \u06c1\u06cc\u06ba\u06d4 \u0635\u0627\u0641 \u062c\u0627\u0646\u0686\u0646\u0627 \u0646\u0627\u0645\u0645\u06a9\u0646 \u0627\u0648\u0631 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u0646\u0627 \u0645\u0634\u06a9\u0644 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-the-clean-rule\">\u0635\u0627\u0641 \u0642\u0648\u0627\u0646\u06cc\u0646<\/h3>\n<p>\u062d\u0644 \u06a9\u0648 \u062f\u06cc\u06a9\u06be\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u0648\u0627\u0636\u062d \u0637\u0648\u0631 \u067e\u0631 \u062f\u0631\u062c \u0630\u06cc\u0644 \u0627\u0635\u0648\u0644 \u0645\u0631\u062a\u0628 \u06a9\u0631\u06cc\u06ba:<\/p>\n<p><strong>\u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0633 \u0688\u0648\u0645\u06cc\u0646 \u06a9\u06d2 \u0646\u062a\u0627\u0626\u062c \u06a9\u0627 \u0645\u0627\u0644\u06a9 \u06c1\u06d2\u06d4 \u0627\u0637\u0644\u0627\u0639 \u062f\u06c1\u0646\u062f\u06af\u0627\u0646 \u06a9\u06cc \u0627\u067e\u0646\u06cc UI \u062d\u0627\u0644\u062a\u06d4 \u0648\u062c\u06cc\u0679\u0633 \u06a9\u0633\u06cc \u0686\u06cc\u0632 \u06a9\u06d2 \u0645\u0627\u0644\u06a9 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4<\/strong><\/p>\n<p>\u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u0645\u0639\u0627\u0645\u0644\u0627\u062a \u06a9\u0627\u0645 \u0627\u0646\u062c\u0627\u0645 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0688\u0648\u0645\u06cc\u0646 \u06a9\u06d2 \u0648\u0627\u0642\u0639\u0627\u062a \u0634\u0627\u0626\u0639 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06c1\u06cc\u0646\u0688\u0644\u0631 \u0627\u0633 \u0648\u0642\u062a \u0686\u0644\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0628 \u0648\u06c1 \u0648\u0627\u0642\u0639\u06c1 \u0634\u0627\u0626\u0639 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0648\u06cc\u062c\u06cc\u0679 \u0644\u0627\u0626\u0641 \u0633\u0627\u0626\u06cc\u06a9\u0644 \u0633\u06d2 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0622\u0632\u0627\u062f\u0627\u0646\u06c1 \u0637\u0648\u0631 \u067e\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0637\u0644\u0627\u0639 \u062f\u06c1\u0646\u062f\u06af\u0627\u0646 \u06a9\u0648 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u0645\u0639\u0627\u0645\u0644\u06d2 \u06a9\u06d2 \u0646\u062a\u0627\u0626\u062c \u0645\u0648\u0635\u0648\u0644 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0644\u0648\u0688\u0646\u06af\u060c \u06a9\u0627\u0645\u06cc\u0627\u0628\u06cc\u060c \u06cc\u0627 \u062e\u0631\u0627\u0628\u06cc \u06a9\u06cc \u06a9\u06cc\u0641\u06cc\u062a \u062e\u0627\u0631\u062c \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0627\u06a9\u06c1 UI \u06a9\u0648 \u0645\u0639\u0644\u0648\u0645 \u06c1\u0648 \u06a9\u06c1 \u06a9\u06cc\u0627 \u0688\u0633\u067e\u0644\u06d2 \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u06d4 \u0648\u06cc\u062c\u06cc\u0679 \u0627\u067e\u0646\u06cc \u062d\u0627\u0644\u062a \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633 \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642 \u0631\u06cc\u0646\u0688\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u067e\u0648\u0631\u06cc \u062a\u0635\u0648\u06cc\u0631 \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u062f\u0631\u0633\u062a \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0642\u0637\u0639 \u0646\u0638\u0631 \u0627\u0633 \u06a9\u06d2 \u06a9\u06c1 \u0644\u0627\u06af \u0627\u0646 \u06a9\u0633\u06cc \u0648\u06cc\u062c\u06cc\u0679\u060c \u0628\u0627\u06cc\u0648\u0645\u06cc\u0679\u0631\u06a9 \u067e\u0631\u0627\u0645\u067e\u0679\u060c \u0688\u06cc\u067e \u0644\u0646\u06a9\u060c \u06cc\u0627 \u0628\u06cc\u06a9 \u06af\u0631\u0627\u0624\u0646\u0688 \u0633\u0631\u0648\u0633 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0634\u0631\u0648\u0639 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u0648\u06d4 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u0645\u0639\u0627\u0645\u0644\u0627\u062a \u06c1\u0645\u06cc\u0634\u06c1 \u0634\u0627\u0626\u0639 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06c1\u06cc\u0646\u0688\u0644\u0631 \u06c1\u0645\u06cc\u0634\u06c1 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0637\u0644\u0627\u0639 \u062f\u06c1\u0646\u062f\u06af\u0627\u0646 \u0635\u0631\u0641 UI \u062d\u0627\u0644\u062a \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-understanding-asyncnotifier\">AsyncNotifier \u06a9\u0648 \u0633\u0645\u062c\u06be\u0646\u0627<\/h3>\n<p>\u06cc\u0627\u062f \u062f\u06c1\u0627\u0646\u06cc \u0628\u0646\u0627\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u0622\u0626\u06cc\u06d2 \u0633\u0645\u062c\u06be\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u06a9\u06cc\u0627 \u06c1\u06d2\u06d4 <code>AsyncNotifier<\/code> \u06cc\u06c1 \u06a9\u06cc\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06cc\u06c1 \u06a9\u06cc\u0633\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><code>AsyncNotifier<\/code>    \u0627\u06cc\u06a9 \u0631\u06cc\u0648\u0631 \u067e\u0648\u0688 2.0 \u06a9\u0644\u0627\u0633 \u062e\u0627\u0635 \u0637\u0648\u0631 \u067e\u0631 \u063a\u06cc\u0631 \u0645\u0637\u0627\u0628\u0642\u062a \u067e\u0630\u06cc\u0631 \u0631\u06cc\u0627\u0633\u062a\u0648\u06ba \u06a9\u06d2 \u0644\u0626\u06d2 \u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2 <code>AsyncValue<t\/><\/code>\u0627\u06cc\u06a9 \u0645\u06c1\u0631\u0628\u0646\u062f \u0642\u0633\u0645 \u06c1\u06d2 \u062c\u0648 \u062a\u06cc\u0646 \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u06c1\u0648 \u0633\u06a9\u062a\u06cc \u06c1\u06d2:<\/p>\n<p><code>AsyncData<t\/><\/code>    \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e\u0631\u06cc\u0634\u0646 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u0631\u06c1\u0627 \u0627\u0648\u0631 \u0688\u06cc\u0679\u0627 \u062f\u0633\u062a\u06cc\u0627\u0628 \u06c1\u06d2\u06d4 <code>AsyncLoading<\/code> \u06cc\u0639\u0646\u06cc \u06a9\u0627\u0645 \u062c\u0627\u0631\u06cc \u06c1\u06d2\u06d4 <code>AsyncError<\/code> \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e\u0631\u06cc\u0634\u0646 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u06af\u06cc\u0627\u06d4<\/p>\n<p>\u062a\u0648\u0633\u06cc\u0639 \u06a9\u0631\u062a\u06d2 \u0648\u0642\u062a <code>AsyncNotifier<t\/><\/code>\u062a\u0645 \u06c1\u0648 <code>build<\/code> \u0627\u06cc\u06a9 \u0637\u0631\u06cc\u0642\u06c1 \u0644\u06a9\u06be\u06cc\u06ba \u062c\u0648 \u0627\u0628\u062a\u062f\u0627\u0626\u06cc \u062d\u0627\u0644\u062a \u06a9\u0648 \u0644\u0648\u0679\u0627\u0626\u06d2 \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0637\u0631\u06cc\u0642\u06c1 \u0644\u06a9\u06be\u06cc\u06ba \u062c\u0648 \u0627\u0633\u06d2 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06d2\u06d4 <code>state<\/code> \u062c\u06cc\u0633\u0627 \u06a9\u06c1 \u063a\u06cc\u0631 \u0645\u0637\u0627\u0628\u0642\u062a \u067e\u0630\u06cc\u0631 \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 \u0622\u06af\u06d2 \u0628\u0691\u06be \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06a9\u0648\u0688 \u062c\u0646\u0631\u06cc\u0634\u0646 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 <code>@riverpod<\/code>\u06a9\u0644\u0627\u0633 \u06a9\u06cc \u062a\u0634\u0631\u06cc\u062d \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0686\u0644\u0627\u0626\u06cc\u06ba\u06d4 <code>flutter pub run build_runner build<\/code>. \u062c\u0646\u0631\u06cc\u0679\u0631 \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u0627\u0648\u0631 \u062a\u0645\u0627\u0645 \u0628\u0648\u0627\u0626\u0644\u0631 \u067e\u0644\u06cc\u0679 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0622\u067e \u067e\u0648\u0631\u06cc \u062a\u0648\u062c\u06c1 \u0645\u0646\u0637\u0642 \u067e\u0631 \u0645\u0631\u06a9\u0648\u0632 \u0631\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06a9\u0648\u0688 \u062c\u0646\u0631\u06cc\u0634\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u06a9\u0645\u0644 \u0633\u06cc\u0679 \u0627\u067e \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-yaml\"># pubspec.yaml\ndependencies:\n  flutter_riverpod: ^2.5.1\n  riverpod_annotation: ^2.3.5\n\ndev_dependencies:\n  riverpod_generator: ^2.4.0\n  build_runner: ^2.4.9\n<\/code><\/pre>\n<h3 id=\"heading-the-thin-notifier\">\u067e\u062a\u0644\u06cc \u06cc\u0627\u062f \u062f\u06c1\u0627\u0646\u06cc<\/h3>\n<pre><code class=\"language-cpp\">\/\/ login_provider.dart\npart 'login_provider.g.dart';\n\n@riverpod\nclass LoginNotifier extends _$LoginNotifier {\n\n  @override\n  AsyncValue<userdto> build() {\n    return const AsyncData(null);\n  }\n\n  Future<void> login(LoginRequest request) async {\n    state = const AsyncLoading();\n\n    final result = await ref.read(loginUseCaseProvider).execute(request);\n\n    result.fold(\n      onSuccess: (user) => state = AsyncData(user),\n      onFailure: (error) => state = AsyncError(error, StackTrace.current),\n    );\n  }\n}\n<\/void><\/userdto><\/code><\/pre>\n<p>\u0622\u0626\u06cc\u06d2 \u0627\u0633 \u0633\u0637\u0631 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0686\u0644\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p><code>part 'login_provider.g.dart'<\/code>    \u0688\u0627\u0631\u0679 \u06a9\u0648 \u0645\u0637\u0644\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062f\u06c1 \u0641\u0627\u0626\u0644 \u0627\u0633 \u0644\u0627\u0626\u0628\u0631\u06cc\u0631\u06cc \u06a9\u0627 \u062d\u0635\u06c1 \u06c1\u06d2\u06d4 \u06a9\u06c1 <code>@riverpod<\/code> \u062a\u0628\u0635\u0631\u06d2 \u0627\u0648\u0631 <code>_$LoginNotifier<\/code> \u0628\u06cc\u0633 \u06a9\u0644\u0627\u0633 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062f\u06c1 \u0641\u0627\u0626\u0644 \u0633\u06d2 \u0622\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><code>build()<\/code>    \u06cc\u06c1 \u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0637\u0631\u06cc\u0642\u06c1 \u06c1\u06d2\u06d4 \u0627\u0633 \u0648\u0642\u062a \u0686\u0644\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0648 \u067e\u06c1\u0644\u06cc \u0628\u0627\u0631 \u067e\u0691\u06be\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0648\u0627\u067e\u0633 \u0622\u062a\u0627 \u06c1\u06d2 <code>AsyncData(null)<\/code>\u06cc\u0639\u0646\u06cc\u060c \u0627\u0628\u062a\u062f\u0627\u0626\u06cc \u062d\u0627\u0644\u062a \u0627\u06cc\u06a9 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u0631\u06cc\u0627\u0633\u062a \u06c1\u06d2 \u062c\u0633 \u0645\u06cc\u06ba \u0627\u0628\u06be\u06cc \u062a\u06a9 \u06a9\u0648\u0626\u06cc \u0635\u0627\u0631\u0641 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062f\u0631\u0633\u062a \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0645\u06cc\u06ba \u0646\u06d2 \u06a9\u0628\u06be\u06cc \u0644\u0627\u06af \u0627\u0646 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0634\u0634 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u06d4<\/p>\n<p>\u0627\u0646\u062f\u0631 <code>login<\/code>\u067e\u06c1\u0644\u06cc \u0686\u06cc\u0632 \u062c\u0648 \u06c1\u0645 \u06a9\u0631\u06cc\u06ba \u06af\u06d2 \u0648\u06c1 \u0633\u06cc\u0679 \u0627\u067e \u06c1\u06d2\u06d4 <code>state = const AsyncLoading()<\/code>. \u06cc\u06c1 \u0627\u0633 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0648 \u062f\u06cc\u06a9\u06be\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0648\u06cc\u062c\u0679 \u06a9\u0648 \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0645\u0637\u0644\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e\u0631\u06cc\u0634\u0646 \u062c\u0627\u0631\u06cc \u06c1\u06d2\u06d4 UI \u0644\u0648\u0688\u0646\u06af \u0627\u0646\u0688\u06cc\u06a9\u06cc\u0679\u0631 \u062f\u06a9\u06be\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u067e\u06be\u0631 \u0627\u067e\u0646\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u06a9\u06cc\u0633 \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 <code>await<\/code> \u0646\u062a\u06cc\u062c\u06d2 \u0645\u06cc\u06ba. \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0627 \u0645\u0639\u0627\u0645\u0644\u06c1 \u06c1\u06d2\u06d4 <code>Result<userdto appexception=\"\"\/><\/code>\u06cc\u06c1 \u0627\u06cc\u06a9 \u0627\u06cc\u0633\u06cc \u0642\u0633\u0645 \u06c1\u06d2 \u062c\u0648 \u06cc\u0627 \u062a\u0648 \u06a9\u0627\u0645\u06cc\u0627\u0628\u06cc \u06a9\u06cc \u0642\u062f\u0631 \u0631\u06a9\u06be\u062a\u06cc \u06c1\u06d2 \u06cc\u0627 \u0646\u0627\u06a9\u0627\u0645\u06cc \u06a9\u06cc \u0642\u062f\u0631\u060c \u0644\u06cc\u06a9\u0646 \u062f\u0648\u0646\u0648\u06ba \u0646\u06c1\u06cc\u06ba\u06d4 \u06c1\u0645 \u06a9\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba <code>fold<\/code> \u06cc\u06c1 \u06c1\u0631 \u06a9\u06cc\u0633 \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u067e\u0631 <code>onSuccess<\/code> \u0634\u0627\u062e\u060c \u06c1\u0645 \u0646\u06d2 \u0645\u0642\u0631\u0631 \u06a9\u06cc\u0627 <code>state = AsyncData(user)<\/code>. \u06cc\u06c1 UI \u06a9\u0648 \u0628\u062a\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e\u0631\u06cc\u0634\u0646 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u0631\u06c1\u0627 \u0627\u0648\u0631 \u0631\u06cc\u0646\u0688\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0635\u0627\u0631\u0641 \u06a9\u0627 \u0688\u06cc\u0679\u0627 \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2\u06d4<\/p>\n<p>\u067e\u0631 <code>onFailure<\/code> \u0634\u0627\u062e\u060c \u06c1\u0645 \u0646\u06d2 \u0645\u0642\u0631\u0631 \u06a9\u06cc\u0627 <code>state = AsyncError(error, StackTrace.current)<\/code>. \u06cc\u06c1 UI \u06a9\u0648 \u0628\u062a\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0686\u06be \u063a\u0644\u0637 \u06c1\u0648 \u06af\u06cc\u0627 \u06c1\u06d2 \u0644\u06c1\u0630\u0627 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0645\u0646\u0627\u0633\u0628 \u062e\u0631\u0627\u0628\u06cc \u06a9\u06cc \u062d\u0627\u0644\u062a \u06a9\u0648 \u0638\u0627\u06c1\u0631 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u0645\u06a9\u0645\u0644 \u06cc\u0627\u062f \u062f\u06c1\u0627\u0646\u06cc \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0628\u0627\u0644\u06a9\u0644 \u0627\u06cc\u06a9 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2: \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u0645\u0639\u0627\u0645\u0644\u06d2 \u06a9\u06d2 \u0646\u062a\u0627\u0626\u062c UI \u062d\u0627\u0644\u062a \u0645\u06cc\u06ba \u0638\u0627\u06c1\u0631 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06cc\u06c1\u0627\u06ba \u06a9\u0648\u0626\u06cc \u0679\u0648\u06a9\u0646 \u0630\u062e\u06cc\u0631\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06a9\u0648\u0626\u06cc \u0646\u06cc\u0648\u06cc\u06af\u06cc\u0634\u0646\u060c \u06a9\u06cc\u0634\u0646\u06af \u06cc\u0627 \u0627\u06cc\u0646\u0627\u0644\u06cc\u0679\u06a9\u0633 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u0633 \u0633\u0628 \u06a9\u0627 \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u062e\u06cc\u0627\u0644 \u0631\u06a9\u06be\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u062c\u0633 \u0644\u0645\u062d\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0627 \u06a9\u06cc\u0633 \u06a9\u06c1\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>_eventBus.publish(UserLoggedIn(...))<\/code> \u0627\u0646\u062f\u0631 <code>execute<\/code>\u062a\u0645\u0627\u0645 \u0631\u062c\u0633\u0679\u0631\u0688 \u06c1\u06cc\u0646\u0688\u0644\u0631\u0632 \u06a9\u0648 \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u0639\u0645\u0644 \u0645\u06cc\u06ba \u0644\u0627\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u062a\u0628 \u062a\u06a9 <code>result<\/code> \u062c\u0628 \u06c1\u0645 \u0627\u0633 \u0646\u0648\u0679\u06cc\u0641\u0627\u0626\u0631 \u067e\u0631 \u0648\u0627\u067e\u0633 \u0622\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u062a\u0645\u0627\u0645 \u0636\u0645\u0646\u06cc \u0627\u062b\u0631\u0627\u062a \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u0645\u06a9\u0645\u0644 \u06c1\u0648 \u0686\u06a9\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0637\u0644\u0627\u0639 \u062f\u06c1\u0646\u062f\u06af\u0627\u0646 \u06a9\u0648 \u0635\u0631\u0641 \u0627\u067e\u0646\u06d2 UI \u06a9\u0648 \u0627\u067e \u0688\u06cc\u0679 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u0633\u0628 \u0633\u06d2 \u0635\u0627\u0641 \u0639\u0644\u06cc\u062d\u062f\u06af\u06cc \u0645\u0645\u06a9\u0646 \u06c1\u06d2\u06d4 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0633 \u0688\u0648\u0645\u06cc\u0646 \u06a9\u06d2 \u0646\u062a\u0627\u0626\u062c \u06a9\u0627 \u0645\u0627\u0644\u06a9 \u06c1\u06d2\u06d4 \u0646\u0648\u0679\u06cc\u0641\u0627\u0626\u0631 \u0631\u06cc\u0646\u0688\u0631\u0646\u06af \u0627\u0633\u0679\u06cc\u0679 \u06a9\u06d2 \u0645\u0627\u0644\u06a9 \u06c1\u06cc\u06ba\u06d4 \u06c1\u0631 \u0627\u06cc\u06a9 \u06a9\u06cc \u0628\u0627\u0644\u06a9\u0644 \u0627\u06cc\u06a9 \u0630\u0645\u06c1 \u062f\u0627\u0631\u06cc \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-the-widget\">\u0648\u06cc\u062c\u06cc\u0679<\/h3>\n<pre><code class=\"language-cpp\">class LoginPage extends ConsumerWidget {\n  @override\n  Widget build(BuildContext context, WidgetRef ref) {\n    final loginState = ref.watch(loginNotifierProvider);\n\n    return Scaffold(\n      body: loginState.when(\n        data: (_) => const LoginForm(),\n        loading: () => const Center(child: CircularProgressIndicator()),\n        error: (error, _) => ErrorView(message: error.toString()),\n      ),\n    );\n  }\n}\n\nclass LoginForm extends ConsumerWidget {\n  @override\n  Widget build(BuildContext context, WidgetRef ref) {\n    return Column(\n      children: [\n        ElevatedButton(\n          onPressed: () {\n            ref.read(loginNotifierProvider.notifier).login(\n              LoginRequest(email: 'user@example.com', password: 'secret'),\n            );\n          },\n          child: const Text('Login'),\n        ),\n      ],\n    );\n  }\n}\n<\/code><\/pre>\n<p><code>ref.watch(loginNotifierProvider)<\/code>    \u0627\u0633 \u0648\u06cc\u062c\u06cc\u0679 \u06a9\u0648 \u0646\u0648\u0679\u06cc\u0641\u0627\u0626\u0631 \u06a9\u06cc \u062d\u0627\u0644\u062a \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0631\u062c\u0633\u0679\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06c1\u0631 \u0628\u0627\u0631 <code>state<\/code> \u0646\u0648\u0679\u06cc\u0641\u0627\u0626\u0631 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba\u061b <code>build<\/code> \u0627\u0633\u06d2 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0628\u0644\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627 \u0627\u0648\u0631 \u0648\u06cc\u062c\u06cc\u0679 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u067e\u06cc\u0634 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4<\/p>\n<p><code>loginState.when<\/code>    \u06cc\u06c1\u0627\u06ba \u06c1\u0631 \u06a9\u06cc\u0633 \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0637\u0631\u06cc\u0642\u06c1 \u06c1\u06d2: <code>AsyncValue<\/code>. \u062c\u0628 \u0631\u06cc\u0627\u0633\u062a \u0645\u06cc\u06ba <code>AsyncData<\/code>\u0644\u0627\u06af \u0627\u0646 \u0641\u0627\u0631\u0645 \u0631\u06cc\u0646\u0688\u0631 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u0633 \u0648\u0642\u062a <code>AsyncLoading<\/code>\u0644\u0648\u0688\u0646\u06af \u0627\u0646\u0688\u06cc\u06a9\u06cc\u0679\u0631 \u067e\u06cc\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u0648\u0642\u062a <code>AsyncError<\/code>\u063a\u0644\u0637\u06cc \u06a9\u0627 \u0645\u0646\u0638\u0631 \u067e\u06cc\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0648\u06cc\u062c\u06cc\u0679 \u0679\u0648\u06a9\u0646\u060c \u0646\u06cc\u0648\u06cc\u06af\u06cc\u0634\u0646\u060c \u06cc\u0627 \u06a9\u06cc\u0634\u0646\u06af \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u062c\u0627\u0646\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0648\u06c1\u06cc \u067e\u06cc\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0631\u06cc\u0627\u0633\u062a \u0627\u0633\u06d2 \u067e\u06cc\u0634 \u06a9\u0631\u0646\u06d2 \u06a9\u0648 \u06a9\u06c1\u062a\u06cc \u06c1\u06d2\u06d4 \u0628\u0633\u06d4<\/p>\n<h3 id=\"heading-wiring-the-composition-root\">\u0633\u0627\u062e\u062a \u062c\u0691 \u06a9\u0646\u06a9\u0634\u0646<\/h3>\n<p>\u0631\u06cc\u0648\u0631 \u067e\u0648\u0688 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0627\u06cc\u067e \u06a9\u06d2 \u0622\u063a\u0627\u0632 \u067e\u0631 \u062a\u0645\u0627\u0645 \u06c1\u06cc\u0646\u0688\u0644\u0631 \u0631\u062c\u0633\u0679\u0631\u06cc\u0634\u0646 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-cpp\">@riverpod\nDomainEventBus eventBus(EventBusRef ref) {\n  final bus = DomainEventBus();\n\n  bus.register<userloggedin>(\n    TokenHandler(ref.read(secureStorageProvider)),\n  );\n  bus.register<userloggedin>(\n    UserCacheHandler(ref.read(userCacheProvider)),\n  );\n  bus.register<userloggedin>(\n    NavigationHandler(ref.read(navigationServiceProvider)),\n  );\n  bus.register<userloggedin>(\n    AnalyticsHandler(ref.read(analyticsServiceProvider)),\n  );\n\n  bus.register<loginfailed>(\n    AnalyticsFailureHandler(ref.read(analyticsServiceProvider)),\n  );\n\n  return bus;\n}\n<\/loginfailed><\/userloggedin><\/userloggedin><\/userloggedin><\/userloggedin><\/code><\/pre>\n<p><code>eventBus<\/code>    \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u062c\u0648 \u0627\u0633\u06d2 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>DomainEventBus<\/code> \u06cc\u06c1 \u062a\u0645\u0627\u0645 \u06c1\u06cc\u0646\u0688\u0644\u0631\u0632 \u06a9\u0648 \u0627\u0633 \u0648\u0642\u062a \u0631\u062c\u0633\u0679\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u0627\u0633\u06d2 \u067e\u06c1\u0644\u06cc \u0628\u0627\u0631 \u067e\u0691\u06be\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0686\u0648\u0646\u06a9\u06c1 \u0631\u06cc\u0648\u0631 \u067e\u0648\u0688 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u0628\u0637\u0648\u0631 \u0688\u06cc\u0641\u0627\u0644\u0679 \u0633\u0633\u062a \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633\u06d2 \u067e\u06c1\u0644\u06cc \u0628\u0627\u0631 \u0628\u0646\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u06a9\u06cc\u0634 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u06cc\u06c1 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0628\u0633 \u067e\u0648\u0631\u06d2 \u0627\u06cc\u067e \u0633\u06cc\u0634\u0646 \u062a\u06a9 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06c1\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u062a\u0645\u0627\u0645 \u06c1\u06cc\u0646\u0688\u0644\u0631\u0632 \u0646\u06d2 \u0627\u067e\u0646\u06cc \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u0648 \u0628\u0630\u0631\u06cc\u0639\u06c1 \u0627\u0646\u062c\u06cc\u06a9\u0634\u0646 \u0644\u06af\u0627\u06cc\u0627 \u06c1\u06d2: <code>ref.read<\/code>. \u06a9\u0686\u06be \u0628\u06be\u06cc \u06c1\u0627\u0631\u0688 \u06a9\u0648\u0688 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06c1\u0645\u0627\u0631\u06d2 \u0679\u06cc\u0633\u0679\u0648\u06ba \u0645\u06cc\u06ba\u060c \u0633\u0628 \u06a9\u0686\u06be \u0628\u062f\u0644\u0646\u06d2 \u0648\u0627\u0644\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u06c1 <code>LoginUseCase<\/code> \u06cc\u06c1 \u0627\u0633 \u0627\u06cc\u0648\u0646\u0679 \u0628\u0633 \u06a9\u0648 \u0627\u067e\u0646\u06d2 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u062d\u0627\u0635\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-cpp\">@riverpod\nLoginUseCase loginUseCase(LoginUseCaseRef ref) {\n  return LoginUseCase(\n    repository: ref.read(authRepositoryProvider),\n    eventBus: ref.read(eventBusProvider),\n  );\n}\n<\/code><\/pre>\n<p>\u0622\u067e \u06a9\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u06a9\u06cc\u0633 \u06a9\u0648 \u0627\u06cc\u0648\u0646\u0679 \u0628\u0633 \u0633\u06d2 \u062c\u0648\u0691\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06cc\u06c1 \u0648\u0627\u062d\u062f \u062c\u06af\u06c1 \u06c1\u06d2\u06d4 \u0646\u0648\u0679\u06cc\u0641\u0627\u0626\u0631 \u0635\u0631\u0641 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u0645\u0639\u0627\u0645\u0644\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u0646\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0648\u06cc\u062c\u06cc\u0679 \u0635\u0631\u0641 \u0646\u0648\u0679\u06cc\u0641\u0627\u0626\u0631 \u06a9\u06cc \u062d\u06cc\u062b\u06cc\u062a \u062d\u0627\u0635\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06c1\u0631 \u067e\u0631\u062a \u0635\u0631\u0641 \u0627\u0633 \u06a9\u06d2 \u0646\u06cc\u0686\u06d2 \u0648\u0627\u0644\u06cc \u067e\u0631\u062a \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u062c\u0627\u0646\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u062f\u0648\u0633\u0631\u06cc \u062a\u06c1\u0648\u06ba \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u06a9\u0686\u06be \u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0644\u0627\u06af \u0627\u0646 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0646\u06cc\u0627 \u0636\u0645\u0646\u06cc \u0627\u062b\u0631 \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u0627\u06cc\u06a9 \u0646\u0626\u06cc \u06c1\u06cc\u0646\u0688\u0644\u0631 \u06a9\u0644\u0627\u0633 \u0628\u0646\u0627\u0646\u0627 \u0627\u0648\u0631 \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u0627\u06d4 <code>bus.register<\/code> \u0633\u0627\u062e\u062a \u06a9\u06cc \u062c\u0691 \u06a9\u06cc \u0644\u06a9\u06cc\u0631\u06d4 \u0646\u0648\u0679\u06cc\u0641\u0627\u0626\u0631\u060c \u06a9\u06cc\u0633 \u0644\u0627\u062c\u06a9 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u060c \u0648\u06cc\u062c\u0679\u060c \u0627\u0648\u0631 \u062a\u0645\u0627\u0645 \u0645\u0648\u062c\u0648\u062f\u06c1 \u06c1\u06cc\u0646\u0688\u0644\u0631\u0632 \u067e\u0648\u0631\u06cc \u0637\u0631\u062d \u0628\u0631\u0642\u0631\u0627\u0631 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-testing-the-observer-architecture\">\u0622\u0628\u0632\u0631\u0648\u0631 \u0622\u0631\u06a9\u06cc\u0679\u06cc\u06a9\u0686\u0631 \u0679\u06cc\u0633\u0679\u0646\u06af<\/h2>\n<p>\u0627\u0633 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u06d2 \u0633\u0628 \u0633\u06d2 \u0627\u06c1\u0645 \u0641\u0648\u0627\u0626\u062f \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u062c\u0627\u0646\u0686 \u06a9\u06d2 \u0645\u0633\u0627\u0626\u0644 \u06a9\u0648 \u06a9\u0633 \u0637\u0631\u062d \u0648\u0627\u0636\u062d \u0637\u0648\u0631 \u067e\u0631 \u0627\u0644\u06af \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06c1\u0631 \u062f\u0631\u062c\u06d2 \u06a9\u06cc \u0627\u067e\u0646\u06cc \u0641\u0648\u06a9\u0633\u0688 \u0679\u06cc\u0633\u0679\u0646\u06af \u06a9\u0648\u0631\u06cc\u062c \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-testing-the-use-case\">\u06a9\u06cc\u0633 \u0679\u06cc\u0633\u0679\u0646\u06af \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<pre><code class=\"language-cpp\">void main() {\n  group('LoginUseCase', () {\n    late LoginUseCase useCase;\n    late MockAuthRepository mockRepository;\n    late MockDomainEventBus mockEventBus;\n\n    setUp(() {\n      mockRepository = MockAuthRepository();\n      mockEventBus = MockDomainEventBus();\n      useCase = LoginUseCase(\n        repository: mockRepository,\n        eventBus: mockEventBus,\n      );\n    });\n\n    test('publishes UserLoggedIn event on success', () async {\n      final user = UserDto(id: '1', token: 'token123');\n      when(() => mockRepository.login(any())).thenAnswer((_) async => user);\n\n      await useCase.execute(LoginRequest(email: 'a@b.com', password: '123'));\n\n      verify(() => mockEventBus.publish(any<userloggedin>())).called(1);\n    });\n\n    test('publishes LoginFailed event on error', () async {\n      when(() => mockRepository.login(any()))\n          .thenThrow(AppException.unauthorized(message: 'Invalid credentials'));\n\n      await useCase.execute(LoginRequest(email: 'a@b.com', password: 'wrong'));\n\n      verify(() => mockEventBus.publish(any<loginfailed>())).called(1);\n    });\n  });\n}\n<\/loginfailed><\/userloggedin><\/code><\/pre>\n<p>\u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0633 \u0679\u06cc\u0633\u0679 \u0631\u06cc\u067e\u0648\u0632\u0679\u0631\u06cc \u0627\u0648\u0631 \u0627\u06cc\u0648\u0646\u0679 \u0628\u0633 \u06a9\u0627 \u0645\u0630\u0627\u0642 \u0627\u0691\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633 \u0628\u0627\u062a \u06a9\u06cc \u062a\u0648\u062b\u06cc\u0642 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u06c1\u0631 \u0646\u062a\u06cc\u062c\u06c1 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0635\u062d\u06cc\u062d \u0648\u0627\u0642\u0639\u06c1 \u06a9\u06cc \u0642\u0633\u0645 \u0634\u0627\u0626\u0639 \u06a9\u06cc \u06af\u0626\u06cc \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062c\u0627\u0646\u0686 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06a9\u06c1 \u06c1\u06cc\u0646\u0688\u0644\u0631 \u06a9\u06cc\u0627 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0633 \u06a9\u06cc \u0630\u0645\u06c1 \u062f\u0627\u0631\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u06cc\u06c1 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0633 \u06a9\u0627 \u0679\u06cc\u0633\u0679 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-testing-each-handler\">\u06c1\u0631 \u06c1\u06cc\u0646\u0688\u0644\u0631 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<pre><code class=\"language-cpp\">void main() {\n  group('TokenHandler', () {\n    late TokenHandler handler;\n    late MockSecureStorageService mockStorage;\n\n    setUp(() {\n      mockStorage = MockSecureStorageService();\n      handler = TokenHandler(mockStorage);\n    });\n\n    test('writes token to secure storage on UserLoggedIn', () {\n      final event = UserLoggedIn(\n        user: UserDto(id: '1', token: 'abc123'),\n        occurredAt: DateTime.now(),\n        eventId: 'event-1',\n      );\n\n      handler.handle(event);\n\n      verify(\n        () => mockStorage.write(key: 'auth_token', value: 'abc123'),\n      ).called(1);\n    });\n  });\n}\n<\/code><\/pre>\n<p>\u06c1\u0631 \u06c1\u06cc\u0646\u0688\u0644\u0631 \u0679\u06cc\u0633\u0679 \u0628\u06c1\u062a \u0686\u06be\u0648\u0679\u0627 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u06c1\u06cc\u0646\u0688\u0644\u0631 \u0628\u0646\u0627\u0646\u06d2\u060c \u0648\u0627\u0642\u0639\u0627\u062a \u06a9\u0648 \u0628\u0691\u06be\u0627\u0646\u06d2\u060c \u0627\u0648\u0631 \u062f\u0631\u0633\u062a \u0636\u0645\u0646\u06cc \u0627\u062b\u0631\u0627\u062a \u06a9\u0627 \u062a\u0639\u06cc\u0646 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0641\u0631\u0636\u06cc \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u062c\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u06cc\u0646\u0688\u0644\u0631 \u0630\u0645\u06c1 \u062f\u0627\u0631 \u06c1\u06d2\u06d4 \u06a9\u0648\u0626\u06cc \u062f\u0648\u0633\u0631\u06d2 \u06c1\u06cc\u0646\u0688\u0644\u0631\u0632\u060c \u0627\u0637\u0644\u0627\u0639\u0627\u062a\u060c \u06cc\u0627 \u0648\u06cc\u062c\u0679 \u0634\u0627\u0645\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-testing-the-notifier\">\u0646\u0648\u0679\u06cc\u0641\u0627\u0626\u0631 \u0679\u06cc\u0633\u0679<\/h3>\n<pre><code class=\"language-cpp\">void main() {\n  group('LoginNotifier', () {\n    test('transitions from loading to data on success', () async {\n      final mockUseCase = MockLoginUseCase();\n      final user = UserDto(id: '1', token: 'token123');\n\n      when(() => mockUseCase.execute(any()))\n          .thenAnswer((_) async => Result.success(user));\n\n      final container = ProviderContainer(overrides: [\n        loginUseCaseProvider.overrideWithValue(mockUseCase),\n      ]);\n\n      final notifier = container.read(loginNotifierProvider.notifier);\n\n      await notifier.login(LoginRequest(email: 'a@b.com', password: '123'));\n\n      expect(\n        container.read(loginNotifierProvider),\n        isA<asyncdata>>(),\n      );\n    });\n\n    test('transitions from loading to error on failure', () async {\n      final mockUseCase = MockLoginUseCase();\n      final error = AppException.unauthorized(message: 'Invalid credentials');\n\n      when(() => mockUseCase.execute(any()))\n          .thenAnswer((_) async => Result.failure(error));\n\n      final container = ProviderContainer(overrides: [\n        loginUseCaseProvider.overrideWithValue(mockUseCase),\n      ]);\n\n      final notifier = container.read(loginNotifierProvider.notifier);\n\n      await notifier.login(LoginRequest(email: 'a@b.com', password: 'wrong'));\n\n      expect(\n        container.read(loginNotifierProvider),\n        isA<asyncerror>(),\n      );\n    });\n  });\n}\n<\/asyncerror><\/asyncdata><\/code><\/pre>\n<p>\u0646\u0648\u0679\u06cc\u0641\u0627\u0626\u0631 \u0679\u06cc\u0633\u0679 \u0635\u0631\u0641 \u0627\u0633\u0679\u06cc\u0679 \u0679\u0631\u0627\u0646\u0632\u06cc\u0634\u0646 \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06cc\u0648\u0646\u0679 \u0628\u0633 \u06a9\u0627 \u0645\u0630\u0627\u0642 \u0627\u0691\u0627\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0646\u0648\u0679\u06cc\u0641\u0627\u0626\u0631 \u0627\u0628 \u0627\u06cc\u0648\u0646\u0679 \u06a9\u06cc \u0628\u0633 \u06a9\u0648 \u0646\u06c1\u06cc\u06ba \u0686\u06be\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0648\u06c1\u06cc \u06c1\u06d2 \u062c\u0648 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0633 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u06a9\u06cc\u0633 \u06a9\u06d2 \u0627\u067e\u0646\u06d2 \u0679\u06cc\u0633\u0679 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0627\u06a9\u06c1 \u06cc\u06c1 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u06d2 \u06a9\u06c1 \u0627\u06cc\u0648\u0646\u0679 \u06a9\u0648 \u0635\u062d\u06cc\u062d \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u067e\u0648\u0633\u0679 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u06c1\u0631 \u067e\u0631\u062a \u06a9\u0627 \u0628\u063a\u06cc\u0631 \u06a9\u0633\u06cc \u0627\u0648\u0648\u0631\u0644\u06cc\u067e \u06a9\u06d2 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0627\u0644\u06af \u0627\u0644\u06af \u0679\u06cc\u0633\u0679 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-when-to-use-the-observer-pattern\">\u0645\u0628\u0635\u0631 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0628 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u0635\u0648\u0631\u062a\u0648\u06ba \u0645\u06cc\u06ba \u0622\u0628\u0632\u0631\u0648\u0631 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba:<\/p>\n<ul>\n<li>\n<p>\u0627\u06cc\u06a9 \u0648\u0627\u0642\u0639\u06c1 \u06a9\u0648 \u0645\u062a\u0639\u062f\u062f \u0622\u0632\u0627\u062f \u0631\u062f\u0639\u0645\u0644 \u06a9\u0648 \u0645\u062a\u062d\u0631\u06a9 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0645\u06cc\u06ba \u0627\u06cc\u0648\u0646\u0679 \u06a9\u06d2 \u0645\u0627\u062e\u0630 \u0645\u06cc\u06ba \u062a\u0631\u0645\u06cc\u0645 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0631\u062f\u0639\u0645\u0644 \u06a9\u0648 \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u0627 \u06cc\u0627 \u06c1\u0679\u0627\u0646\u0627 \u0686\u0627\u06c1\u062a\u0627 \u06c1\u0648\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0636\u0645\u0646\u06cc \u0627\u062b\u0631\u0627\u062a \u06a9\u0648 \u06a9\u0627\u0631\u0648\u0628\u0627\u0631\u06cc \u0645\u0646\u0637\u0642 \u0633\u06d2 \u0627\u0644\u06af \u06a9\u06cc\u0627 \u062c\u0627\u0646\u0627 \u0686\u0627\u06c1\u0626\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u06c1\u0631 \u0631\u062f\u0639\u0645\u0644 \u06a9\u0648 \u0622\u0632\u0627\u062f\u0627\u0646\u06c1 \u0637\u0648\u0631 \u067e\u0631 \u062c\u0627\u0646\u0686\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u0626\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0646\u0638\u0627\u0645 \u06a9\u06d2 \u0645\u062a\u0639\u062f\u062f \u062d\u0635\u0648\u06ba \u06a9\u0648 \u0627\u06cc\u06a9 \u06c1\u06cc \u062d\u0627\u0644\u062a \u06a9\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc \u067e\u0631 \u0631\u062f\u0639\u0645\u0644 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u06c1\u0645 \u0627\u06cc\u0633\u06cc \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u0628\u0646\u0627 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba \u062c\u0646 \u06a9\u06d2 \u0636\u0645\u0646\u06cc \u0627\u062b\u0631\u0627\u062a \u0648\u0642\u062a \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0633\u0627\u062a\u06be \u0628\u0691\u06be \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<\/ul>\n<h2 id=\"heading-when-not-to-use-it\">\u06a9\u0628 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u0646\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u0635\u0648\u0631\u062a\u0648\u06ba \u0645\u06cc\u06ba \u0622\u0628\u0632\u0631\u0648\u0631 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u0646\u06c1 \u06a9\u0631\u06cc\u06ba:<\/p>\n<ul>\n<li>\n<p>\u0635\u0631\u0641 \u0627\u06cc\u06a9 \u0635\u0627\u0631\u0641 \u06c1\u06d2 \u0627\u0648\u0631 \u0645\u0632\u06cc\u062f \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u06cc \u06a9\u0648\u0626\u06cc \u062d\u0642\u06cc\u0642\u062a \u067e\u0633\u0646\u062f\u0627\u0646\u06c1 \u062a\u0648\u0642\u0639 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u067e\u0631\u0648\u0688\u06cc\u0648\u0633\u0631\u0632 \u0627\u0648\u0631 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u062a\u0639\u0644\u0642 \u0633\u0627\u062f\u06c1 \u0627\u0648\u0631 \u0633\u06cc\u062f\u06be\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u067e\u06cc\u0679\u0631\u0646 \u0628\u063a\u06cc\u0631 \u06a9\u0633\u06cc \u0645\u0639\u0646\u06cc \u062e\u06cc\u0632 \u0641\u0627\u0626\u062f\u06c1 \u06a9\u06d2 \u0633\u0627\u062e\u062a\u06cc \u0627\u0648\u0648\u0631 \u06c1\u06cc\u0688 \u06a9\u0648 \u062c\u0648\u0691\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0627\u0633\u0679\u0631\u06cc\u0645\u0632\u060c ChangeNotifier \u06cc\u0627 Riverpod \u06a9\u06cc \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0631\u062f\u0639\u0645\u0644 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u06c1\u06cc \u0642\u062f\u0631\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0645\u0633\u0626\u0644\u06d2 \u06a9\u0648 \u062d\u0644 \u06a9\u0631 \u0631\u06c1\u06cc \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0636\u0645\u0646\u06cc \u0627\u062b\u0631\u0627\u062a \u06a9\u0627 \u0633\u062e\u062a \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u0646\u0627 \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u0641\u06cc\u0646 \u0622\u0624\u0679 \u0627\u0633 \u0628\u0627\u062a \u06a9\u06cc \u0636\u0645\u0627\u0646\u062a \u062f\u06cc\u0646\u0627 \u0645\u0634\u06a9\u0644 \u0628\u0646\u0627 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<h2 id=\"heading-conclusion\">\u0646\u062a\u06cc\u062c\u06c1<\/h2>\n<p>\u0645\u0628\u0635\u0631 \u0688\u06cc\u0632\u0627\u0626\u0646 \u067e\u06cc\u0679\u0631\u0646 \u0633\u0627\u0641\u0679 \u0648\u06cc\u0626\u0631 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631 \u06a9\u06d2 \u06c1\u062a\u06be\u06cc\u0627\u0631\u0648\u06ba \u0645\u06cc\u06ba \u0633\u0628 \u0633\u06d2 \u0627\u06c1\u0645 \u0679\u0648\u0644\u0632 \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0627\u0633 \u0644\u06cc\u06d2 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u06c1\u0648\u0634\u06cc\u0627\u0631 \u06c1\u06d2\u060c \u0628\u0644\u06a9\u06c1 \u0627\u0633 \u0644\u06cc\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0627\u06cc\u0633\u06d2 \u0645\u0633\u0626\u0644\u06d2 \u06a9\u0648 \u062d\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0633 \u06a9\u0627 \u0633\u0627\u0645\u0646\u0627 \u06c1\u0631 \u0628\u0691\u06be\u062a\u06cc \u06c1\u0648\u0626\u06cc \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u06a9\u0648 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u0622\u067e \u0627\u067e\u0646\u06d2 \u06a9\u0648\u0688 \u0628\u06cc\u0633 \u06a9\u0648 \u0645\u0636\u0628\u0648\u0637\u06cc \u0633\u06d2 \u062c\u0648\u0691\u06d2 \u06c1\u0648\u0626\u06d2 \u06af\u0691\u0628\u0691 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0627\u06cc\u06a9 \u0627\u06cc\u0648\u0646\u0679 \u06a9\u0648 \u0628\u06c1\u062a \u0633\u06d2 \u0631\u062f\u0639\u0645\u0644 \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u0645\u062a\u062d\u0631\u06a9 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u061f<\/p>\n<p>\u06c1\u0645 \u0646\u06d2 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0646\u0645\u0648\u0646\u0648\u06ba \u06a9\u0648 \u0633\u0645\u062c\u06be \u06a9\u0631 \u0634\u0631\u0648\u0639 \u06a9\u06cc\u0627\u06d4 \u0645\u0636\u0645\u0648\u0646 \u06a9\u06d2 \u067e\u0627\u0633 \u0645\u0628\u0635\u0631\u06cc\u0646 \u06a9\u06cc \u0641\u06c1\u0631\u0633\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u0648\u0627\u0642\u0639\u0627\u062a \u0631\u0648\u0646\u0645\u0627 \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u0627\u0646\u06c1\u06cc\u06ba \u0645\u0637\u0644\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06c1\u0645 \u0646\u06d2 \u062f\u06cc\u06a9\u06be\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0627\u0633\u06d2 \u0688\u0627\u0631\u0679 \u0645\u06cc\u06ba \u0642\u062f\u0645 \u0628\u06c1 \u0642\u062f\u0645 \u0628\u0646\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u060c \u0627\u0633\u0646\u06cc\u067e \u0634\u0627\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0633\u0627\u062a\u06be \u062a\u0631\u0645\u06cc\u0645 \u06a9\u06cc \u063a\u0644\u0637\u06cc\u0648\u06ba \u06a9\u0648 \u0631\u0648\u06a9\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0641\u06cc \u0645\u0628\u0635\u0631 \u06a9\u06cc \u06a9\u0648\u0634\u0634\/\u06a9\u06cc\u0686 \u0646\u0627\u06a9\u0627\u0645\u06cc \u06a9\u0648 \u0631\u0648\u06a9\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0627\u0648\u0631 \u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u0648 \u0642\u0627\u0628\u0644 \u0622\u0632\u0645\u0627\u0626\u0634 \u0631\u06a9\u06be\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0646\u062d\u0635\u0627\u0631 \u0627\u0644\u0679\u0627\u06d4<\/p>\n<p>\u0645\u06cc\u06ba \u0646\u06d2 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u06cc\u0627 \u06a9\u06c1 \u0622\u0628\u0632\u0631\u0648\u0631 \u067e\u06cc\u0679\u0631\u0646 \u0641\u0644\u0679\u0631 \u06a9\u06cc \u0627\u0633\u0679\u0631\u06cc\u0645\u0632\u060c \u0686\u06cc\u0646\u062c \u0646\u0648\u0679\u06cc\u0641\u0627\u0626\u0631\u060c \u0627\u0648\u0631 \u0628\u06cc \u0627\u06cc\u0644 \u0627\u0648 \u0633\u06cc \u0645\u06cc\u06ba \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u06c1\u06cc \u0634\u0627\u0645\u0644 \u06c1\u06d2\u06d4 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0628\u0627\u062a\u0648\u06ba \u06a9\u0648 \u0633\u0645\u062c\u06be\u0646\u06d2 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u0633\u0645\u062c\u06be\u0646\u0627 \u06a9\u06c1 \u0679\u0648\u0644 \u0627\u0633 \u0637\u0631\u062d \u06a9\u06cc\u0648\u06ba \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u06a9\u06d2 \u0628\u0639\u062f \u06c1\u0645 \u0646\u06d2 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0648 \u0627\u06cc\u0648\u0646\u0679 \u0633\u06d2 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u067e\u0631 \u0644\u0627\u06af\u0648 \u06a9\u06cc\u0627 \u062c\u06c1\u0627\u06ba \u0648\u0627\u0642\u0639\u0627\u062a \u0646\u0627\u0642\u0627\u0628\u0644 \u062a\u063a\u06cc\u0631 \u0688\u0648\u0645\u06cc\u0646 \u062d\u0642\u0627\u0626\u0642 \u0628\u0646 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0633\u0633\u0679\u0645 \u06a9\u0648 \u067e\u0631\u0648\u0688\u06cc\u0648\u0633\u0631\u0632 \u0627\u0648\u0631 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u062c\u0648\u0691\u06d2 \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u0628\u0646\u0627\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06c1\u0645 \u0646\u06d2 \u0627\u0633\u06d2 \u0688\u0648\u0645\u06cc\u0646 \u0633\u06d2 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0644\u0627\u06af\u0648 \u06a9\u06cc\u0627 \u062a\u0627\u06a9\u06c1 \u0627\u06cc\u0648\u0646\u0679\u0633 \u06a9\u0648 \u062e\u0627\u0644\u0635 \u0688\u0627\u0631\u0679 \u0688\u0648\u0645\u06cc\u0646 \u067e\u0631\u062a \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0645\u0646\u0627\u0633\u0628 \u06af\u06be\u0631 \u062f\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u06d2 \u062c\u0648 \u0641\u0631\u06cc\u0645 \u0648\u0631\u06a9 \u0633\u06d2 \u0622\u0632\u0627\u062f\u060c \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u067e\u0648\u0631\u0679\u06cc\u0628\u0644 \u0627\u0648\u0631 \u0642\u0627\u0628\u0644 \u062c\u0627\u0646\u0686 \u06c1\u0648\u06d4<\/p>\n<p>\u0627\u0648\u0631 \u06c1\u0645 \u0646\u06d2 \u062f\u06cc\u06a9\u06be\u0627 \u06a9\u06c1 \u06cc\u06c1 \u06a9\u0633 \u0637\u0631\u062d \u0627\u06cc\u06a9 \u06c1\u0627\u0626\u0628\u0631\u0688 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0631\u06cc\u0648\u0631 \u067e\u0648\u0688 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0636\u0645 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u0648\u0627\u0636\u062d \u0627\u0648\u0631 \u0642\u0627\u0628\u0644 \u0646\u0641\u0627\u0630 \u0627\u0635\u0648\u0644\u0648\u06ba \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2: \u06c1\u06cc\u0646\u0688\u0644\u0631\u0632 \u06a9\u06d2 \u0636\u0645\u0646\u06cc \u0627\u062b\u0631\u0627\u062a\u060c \u0627\u0637\u0644\u0627\u0639 \u062f\u06c1\u0646\u062f\u06af\u0627\u0646 \u06a9\u06cc \u0627\u067e\u0646\u06cc UI \u062d\u0627\u0644\u062a\u060c \u0627\u0648\u0631 \u0648\u06cc\u062c\u0679 \u06a9\u0686\u06be \u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba \u0631\u06a9\u06be\u062a\u06d2\u06d4<\/p>\n<p>\u0646\u062a\u06cc\u062c\u06c1 \u0627\u06cc\u06a9 \u06a9\u0648\u0688 \u0628\u06cc\u0633 \u06c1\u06d2 \u062c\u0648 \u062e\u0648\u0628\u0635\u0648\u0631\u062a\u06cc \u0633\u06d2 \u062a\u0631\u0627\u0632\u0648 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0622\u067e \u06a9\u0648 \u06a9\u0648\u0626\u06cc \u0646\u06cc\u0627 \u0636\u0645\u0646\u06cc \u0627\u062b\u0631 \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2 \u062a\u0648 \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u06c1\u06cc\u0646\u0688\u0644\u0631 \u0628\u0646\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0627\u06cc\u06a9 \u062c\u06af\u06c1 \u0631\u062c\u0633\u0679\u0631 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u0648\u0631 \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u0628\u062f\u0644\u062a\u0627\u06d4 \u06cc\u06c1 \u0645\u0628\u0635\u0631 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0627 \u0648\u0639\u062f\u06c1 \u06c1\u06d2\u06d4 \u0627\u0648\u0631 \u062c\u06cc\u0633\u0627 \u06a9\u06c1 \u0622\u067e \u0627\u0633 \u06c1\u06cc\u0646\u0688 \u0628\u06a9 \u0645\u06cc\u06ba \u062f\u06cc\u06a9\u06be\u06cc\u06ba \u06af\u06d2\u060c \u06cc\u06c1 \u06c1\u0645\u0627\u0631\u06d2 \u0648\u0639\u062f\u0648\u06ba \u06a9\u0648 \u067e\u0648\u0631\u0627 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u0628\u0627\u0631\u06a9 \u06a9\u0648\u0688\u0646\u06af!<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u06c1\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0648 \u06a9\u0633\u06cc \u0646\u06c1 \u06a9\u0633\u06cc \u0648\u0642\u062a \u0628\u0646\u06cc\u0627\u062f\u06cc \u0645\u0633\u0627\u0626\u0644 \u0633\u06d2 \u0646\u0645\u0679\u0646\u0627 \u067e\u0691\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u062c\u0628 \u06a9\u0686\u06be \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u06a9\u0626\u06cc \u0645\u062e\u062a\u0644\u0641 \u06a9\u0627\u0645\u0648\u06ba \u06a9\u0648 \u0627\u0633 \u067e\u0631 \u0631\u062f\u0639\u0645\u0644 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u062c\u0628 \u06a9\u0648\u0626\u06cc \u0635\u0627\u0631\u0641 \u0644\u0627\u06af \u0627\u0646 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0622\u067e \u06a9\u06cc \u0627\u06cc\u067e \u06a9\u0648 \u0679\u0648\u06a9\u0646 \u06a9\u0648 \u0630\u062e\u06cc\u0631\u06c1 \u06a9\u0631\u0646\u0627\u060c \u0635\u0627\u0631\u0641 \u067e\u0631\u0648\u0641\u0627\u0626\u0644 \u06a9\u0648 \u06a9\u06cc\u0634 \u06a9\u0631\u0646\u0627\u060c [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-26859","post","type-post","status-publish","format-standard","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/posts\/26859","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/comments?post=26859"}],"version-history":[{"count":0,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/posts\/26859\/revisions"}],"wp:attachment":[{"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/media?parent=26859"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/categories?post=26859"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/tags?post=26859"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}