{"id":109412,"date":"2025-05-17T22:23:13","date_gmt":"2025-05-17T18:53:13","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/go-router-navigation-observer-1gj4\/"},"modified":"2025-05-17T22:23:13","modified_gmt":"2025-05-17T18:53:13","slug":"go-router-navigation-observer-1gj4","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/go-router-navigation-observer-1gj4\/","title":{"rendered":"Go Router Navigation Observer &#8211; Community Dev"},"content":{"rendered":"<div data-article-id=\"2497373\" id=\"article-body\">\n<p>GO_ROUTER \u06cc\u06a9\u06cc \u0627\u0632 \u0645\u062d\u0628\u0648\u0628 \u062a\u0631\u06cc\u0646 \u0628\u0633\u062a\u0647 \u0647\u0627 \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0646\u0627\u0648\u0628\u0631\u06cc \u062f\u0631 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 Flutter \u0627\u0633\u062a \u0648 \u0627\u0632 \u0622\u0646\u062c\u0627 \u06a9\u0647 \u0628\u062e\u0634\u06cc \u0627\u0632 \u062a\u06cc\u0645 Flutter \u0634\u062f \u060c \u0628\u0647 \u0631\u0627\u0647 \u062d\u0644 \u0627\u0635\u0644\u06cc \u062a\u0648\u0635\u06cc\u0647 \u0634\u062f\u0647 \u062a\u0628\u062f\u06cc\u0644 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0622\u0646 \u0628\u0633\u06cc\u0627\u0631 \u0622\u0633\u0627\u0646 \u0648 \u062f\u0631 \u0639\u06cc\u0646 \u062d\u0627\u0644 \u063a\u0646\u06cc \u0627\u0632 \u0648\u06cc\u0698\u06af\u06cc \u0627\u0633\u062a.<\/p>\n<p>\u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644 \u060c \u0628\u0627 \u0645\u0639\u0631\u0641\u06cc <code>ShellRoute<\/code>\u0645\u0634\u0627\u0647\u062f\u0647 \u062c\u0631\u06cc\u0627\u0646 \u0646\u0627\u0648\u0628\u0631\u06cc \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0648 \u062f\u0627\u0634\u062a\u0646 \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0627\u0632 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0646\u0627\u0648\u0628\u0631\u06cc &#8220;\u0622\u06af\u0627\u0647 \u0647\u0633\u062a\u0646\u062f&#8221; \u062f\u0634\u0648\u0627\u0631\u062a\u0631 \u0634\u062f\u0647 \u0627\u0633\u062a. \u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u062f\u0631 \u0627\u06cc\u0646 \u0634\u0645\u0627\u0631\u0647 \u0628\u0631\u062c\u0633\u062a\u0647 \u0634\u062f \u060c \u0648\u0642\u062a\u06cc \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u062f <code>ShellRoute<\/code>\u060c \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0627\u06a9\u0646\u0634 \u067e\u0630\u06cc\u0631\u06cc \u0631\u0627 \u0646\u0633\u0628\u062a \u0628\u0647 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0645\u0633\u06cc\u0631 \u0627\u0632 \u062f\u0633\u062a \u0645\u06cc \u062f\u0647\u062f: <code>NavigationObserver<\/code> \u062f\u06cc\u06af\u0631 \u062a\u062d\u0631\u06cc\u06a9 \u0646\u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>\u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u0645\u0646\u062a\u0638\u0631 \u06cc\u06a9 \u0631\u0627\u0647 \u062d\u0644 \u0631\u0633\u0645\u06cc \u06cc\u0627 \u0631\u0627\u0647 \u062d\u0644 \u062f\u0627\u062e\u0644\u06cc \u0627\u0632 \u062a\u06cc\u0645 Flutter \u0647\u0633\u062a\u06cc\u0645 \u060c \u0645\u0627 \u0647\u0646\u0648\u0632 \u0647\u0645 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0628\u0627 \u06af\u0648\u0634 \u062f\u0627\u062f\u0646 \u0628\u0647 \u0622\u0646 \u0631\u0641\u062a\u0627\u0631 \u0622\u06af\u0627\u0647\u0627\u0646\u0647 \u0645\u0633\u06cc\u0631 \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u0645 <code>GoRouterDelegate<\/code>\u0628\u0634\u0631<\/p>\n<p>\u06a9\u062f \u0632\u06cc\u0631 \u0628\u0647 <code>GoRouterDelegate<\/code> \u062f\u0631 \u0637\u0648\u0644 \u0686\u0631\u062e\u0647 \u0639\u0645\u0631 \u0648\u06cc\u062c\u062a \u0648 \u0627\u0632 \u0648\u0636\u0639\u06cc\u062a \u062f\u0627\u062e\u0644\u06cc \u0628\u0647 \u0647\u0645\u0631\u0627\u0647 \u0645\u0642\u0627\u06cc\u0633\u0647 \u0645\u0633\u06cc\u0631 \u0628\u0627\u0644\u0627 \u0628\u0631\u0627\u06cc \u0627\u0641\u0634\u0627\u06cc \u062a\u0645\u0627\u0633 \u0647\u0627\u06cc \u062a\u0645\u0627\u0633 \u062f\u0631 \u067e\u0627\u0633\u062e \u0628\u0647 \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc \u0646\u0627\u0648\u0628\u0631\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u0644\u0628\u062a\u0647 \u060c \u0627\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0645\u062a\u0646\u0627\u0633\u0628 \u0628\u0627 \u0646\u06cc\u0627\u0632\u0647\u0627\u06cc \u0634\u0645\u0627 \u0628\u0627\u0634\u062f &#8211; \u0628\u0631\u0627\u06cc \u0645\u062b\u0627\u0644 \u060c \u0648\u0627\u06a9\u0646\u0634 \u0628\u0647 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u067e\u0627\u0631\u0627\u0645\u062a\u0631 \u067e\u0631\u0633 \u0648 \u062c\u0648 \u0648 \u0645\u0648\u0627\u0631\u062f \u062f\u06cc\u06af\u0631.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight dart\"><code><span class=\"kn\">import<\/span> <span class=\"s\">'package:flutter\/material.dart'<\/span><span class=\"o\">;<\/span>\n<span class=\"kn\">import<\/span> <span class=\"s\">'package:go_router\/go_router.dart'<\/span><span class=\"o\">;<\/span>\n\n<span class=\"c1\">\/\/\/ A mixin that allows a widget to be aware of the current route.<\/span>\n<span class=\"kd\">mixin<\/span> <span class=\"nc\">GoRouterAware<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">T<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">StatefulWidget<\/span><span class=\"p\">&gt;<\/span> <span class=\"kd\">on<\/span> <span class=\"n\">State<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">T<\/span><span class=\"p\">&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"c1\">\/\/\/ The route to be aware of.<\/span>\n  <span class=\"kd\">late<\/span> <span class=\"kd\">final<\/span> <span class=\"kt\">Uri<\/span> <span class=\"n\">_observerLocation<\/span><span class=\"p\">;<\/span>\n\n  <span class=\"c1\">\/\/\/ The current state of the [_observerLocation].<\/span>\n  <span class=\"kd\">late<\/span> <span class=\"n\">_GoRouterAwareState<\/span> <span class=\"n\">_state<\/span><span class=\"p\">;<\/span>\n\n  <span class=\"c1\">\/\/\/ go router delegate.<\/span>\n  <span class=\"kd\">late<\/span> <span class=\"n\">GoRouterDelegate<\/span> <span class=\"n\">_delegate<\/span><span class=\"p\">;<\/span>\n\n  <span class=\"c1\">\/\/\/ The context of the widget.<\/span>\n  <span class=\"kd\">late<\/span> <span class=\"n\">BuildContext<\/span> <span class=\"n\">_context<\/span><span class=\"p\">;<\/span>\n\n  <span class=\"c1\">\/\/\/ The location of the top route<\/span>\n  <span class=\"kt\">Uri<\/span><span class=\"o\">?<\/span> <span class=\"n\">_currentLocation<\/span><span class=\"p\">;<\/span>\n\n  <span class=\"nd\">@override<\/span>\n  <span class=\"kt\">void<\/span> <span class=\"n\">initState<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">_context<\/span> <span class=\"o\">=<\/span> <span class=\"n\">context<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"kd\">final<\/span> <span class=\"n\">router<\/span> <span class=\"o\">=<\/span> <span class=\"n\">GoRouter<\/span><span class=\"o\">.<\/span><span class=\"na\">of<\/span><span class=\"p\">(<\/span><span class=\"n\">_context<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"n\">_state<\/span> <span class=\"o\">=<\/span> <span class=\"n\">_GoRouterAwareState<\/span><span class=\"o\">.<\/span><span class=\"na\">topRoute<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">_observerLocation<\/span> <span class=\"o\">=<\/span> <span class=\"n\">router<\/span><span class=\"o\">.<\/span><span class=\"na\">state<\/span><span class=\"o\">.<\/span><span class=\"na\">uri<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">_delegate<\/span> <span class=\"o\">=<\/span> <span class=\"n\">router<\/span><span class=\"o\">.<\/span><span class=\"na\">routerDelegate<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"n\">_onChange<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">_delegate<\/span><span class=\"o\">.<\/span><span class=\"na\">addListener<\/span><span class=\"p\">(<\/span><span class=\"n\">_onChange<\/span><span class=\"p\">);<\/span>\n    <span class=\"k\">super<\/span><span class=\"o\">.<\/span><span class=\"na\">initState<\/span><span class=\"p\">();<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"nd\">@override<\/span>\n  <span class=\"kt\">void<\/span> <span class=\"n\">didChangeDependencies<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">_context<\/span> <span class=\"o\">=<\/span> <span class=\"n\">context<\/span><span class=\"p\">;<\/span>\n    <span class=\"k\">super<\/span><span class=\"o\">.<\/span><span class=\"na\">didChangeDependencies<\/span><span class=\"p\">();<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"kt\">void<\/span> <span class=\"n\">_onChange<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">_currentLocation<\/span> <span class=\"o\">=<\/span> <span class=\"n\">GoRouter<\/span><span class=\"o\">.<\/span><span class=\"na\">of<\/span><span class=\"p\">(<\/span><span class=\"n\">_context<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"na\">state<\/span><span class=\"o\">.<\/span><span class=\"na\">uri<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">_currentLocation<\/span> <span class=\"o\">==<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"c1\">\/\/\/ If the current route is the top route and the current location is the same as the observer location then [_observerLocation] is the top route.<\/span>\n    <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">_state<\/span><span class=\"o\">.<\/span><span class=\"na\">isTopRoute<\/span> <span class=\"o\">&amp;&amp;<\/span>\n        <span class=\"n\">_sameLocation<\/span><span class=\"p\">(<\/span><span class=\"n\">_currentLocation<\/span><span class=\"o\">!<\/span><span class=\"p\">,<\/span> <span class=\"n\">_observerLocation<\/span><span class=\"p\">))<\/span> <span class=\"p\">{<\/span>\n      <span class=\"n\">didPush<\/span><span class=\"p\">();<\/span>\n      <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"c1\">\/\/\/ If the current route is pushed next and the current location is the same as the observer location then [_observerLocation] is returned to the top route.<\/span>\n    <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">_state<\/span><span class=\"o\">.<\/span><span class=\"na\">isPushedNext<\/span> <span class=\"o\">&amp;&amp;<\/span>\n        <span class=\"n\">_sameLocation<\/span><span class=\"p\">(<\/span><span class=\"n\">_currentLocation<\/span><span class=\"o\">!<\/span><span class=\"p\">,<\/span> <span class=\"n\">_observerLocation<\/span><span class=\"p\">))<\/span> <span class=\"p\">{<\/span>\n      <span class=\"n\">didPopNext<\/span><span class=\"p\">();<\/span>\n      <span class=\"n\">_state<\/span> <span class=\"o\">=<\/span> <span class=\"n\">_GoRouterAwareState<\/span><span class=\"o\">.<\/span><span class=\"na\">topRoute<\/span><span class=\"p\">;<\/span>\n      <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"c1\">\/\/\/ If the current route is not the top route and the current location contains the observer location then [_observerLocation] is no longer the top route.<\/span>\n    <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"n\">_sameLocation<\/span><span class=\"p\">(<\/span><span class=\"n\">_currentLocation<\/span><span class=\"o\">!<\/span><span class=\"p\">,<\/span> <span class=\"n\">_observerLocation<\/span><span class=\"p\">)<\/span> <span class=\"o\">&amp;&amp;<\/span>\n        <span class=\"n\">_currentLocation<\/span><span class=\"o\">!.<\/span><span class=\"na\">path<\/span><span class=\"o\">.<\/span><span class=\"na\">toString<\/span><span class=\"p\">()<\/span><span class=\"o\">.<\/span><span class=\"na\">contains<\/span><span class=\"p\">(<\/span><span class=\"n\">_observerLocation<\/span><span class=\"o\">.<\/span><span class=\"na\">path<\/span><span class=\"p\">))<\/span> <span class=\"p\">{<\/span>\n      <span class=\"n\">_state<\/span> <span class=\"o\">=<\/span> <span class=\"n\">_GoRouterAwareState<\/span><span class=\"o\">.<\/span><span class=\"na\">pushedNext<\/span><span class=\"p\">;<\/span>\n      <span class=\"n\">didPushNext<\/span><span class=\"p\">();<\/span>\n      <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"c1\">\/\/\/ If the current route is the top route and the current location does not contain the observer location then [_observerLocation] is popped off.<\/span>\n    <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">_state<\/span><span class=\"o\">.<\/span><span class=\"na\">isTopRoute<\/span> <span class=\"o\">&amp;&amp;<\/span>\n        <span class=\"o\">!<\/span><span class=\"n\">_currentLocation<\/span><span class=\"o\">!.<\/span><span class=\"na\">path<\/span><span class=\"o\">.<\/span><span class=\"na\">toString<\/span><span class=\"p\">()<\/span><span class=\"o\">.<\/span><span class=\"na\">contains<\/span><span class=\"p\">(<\/span><span class=\"n\">_observerLocation<\/span><span class=\"o\">.<\/span><span class=\"na\">path<\/span><span class=\"p\">))<\/span> <span class=\"p\">{<\/span>\n      <span class=\"n\">didPop<\/span><span class=\"p\">();<\/span>\n      <span class=\"n\">_state<\/span> <span class=\"o\">=<\/span> <span class=\"n\">_GoRouterAwareState<\/span><span class=\"o\">.<\/span><span class=\"na\">poppedOff<\/span><span class=\"p\">;<\/span>\n      <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"c1\">\/\/\/ Check if two locations have the same path.<\/span>\n  <span class=\"kt\">bool<\/span> <span class=\"n\">_sameLocation<\/span><span class=\"p\">(<\/span><span class=\"kt\">Uri<\/span> <span class=\"n\">a<\/span><span class=\"p\">,<\/span> <span class=\"kt\">Uri<\/span> <span class=\"n\">b<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"n\">a<\/span><span class=\"o\">.<\/span><span class=\"na\">path<\/span><span class=\"o\">.<\/span><span class=\"na\">toString<\/span><span class=\"p\">()<\/span> <span class=\"o\">==<\/span> <span class=\"n\">b<\/span><span class=\"o\">.<\/span><span class=\"na\">path<\/span><span class=\"o\">.<\/span><span class=\"na\">toString<\/span><span class=\"p\">();<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"c1\">\/\/\/ Called when the top route has been popped off, and the current route<\/span>\n  <span class=\"c1\">\/\/\/ shows up.<\/span>\n  <span class=\"kt\">void<\/span> <span class=\"n\">didPopNext<\/span><span class=\"p\">()<\/span> <span class=\"p\">{}<\/span>\n\n  <span class=\"c1\">\/\/\/ Called when the current route has been pushed.<\/span>\n  <span class=\"kt\">void<\/span> <span class=\"n\">didPush<\/span><span class=\"p\">()<\/span> <span class=\"p\">{}<\/span>\n\n  <span class=\"c1\">\/\/\/ Called when the current route has been popped off.<\/span>\n  <span class=\"kt\">void<\/span> <span class=\"n\">didPop<\/span><span class=\"p\">()<\/span> <span class=\"p\">{}<\/span>\n\n  <span class=\"c1\">\/\/\/ Called when a new route has been pushed, and the current route is no<\/span>\n  <span class=\"c1\">\/\/\/ longer visible.<\/span>\n  <span class=\"kt\">void<\/span> <span class=\"n\">didPushNext<\/span><span class=\"p\">()<\/span> <span class=\"p\">{}<\/span>\n\n  <span class=\"nd\">@override<\/span>\n  <span class=\"kt\">void<\/span> <span class=\"n\">dispose<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">_delegate<\/span><span class=\"o\">.<\/span><span class=\"na\">removeListener<\/span><span class=\"p\">(<\/span><span class=\"n\">_onChange<\/span><span class=\"p\">);<\/span>\n    <span class=\"k\">super<\/span><span class=\"o\">.<\/span><span class=\"na\">dispose<\/span><span class=\"p\">();<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"kt\">enum<\/span> <span class=\"n\">_GoRouterAwareState<\/span> <span class=\"p\">{<\/span>\n  <span class=\"n\">pushedNext<\/span><span class=\"p\">,<\/span>\n  <span class=\"n\">topRoute<\/span><span class=\"p\">,<\/span>\n  <span class=\"n\">poppedOff<\/span><span class=\"p\">;<\/span>\n\n  <span class=\"kt\">bool<\/span> <span class=\"kd\">get<\/span> <span class=\"n\">isTopRoute<\/span> <span class=\"o\">=<\/span><span class=\"p\">&gt;<\/span> <span class=\"k\">this<\/span> <span class=\"o\">==<\/span> <span class=\"n\">topRoute<\/span><span class=\"p\">;<\/span>\n  <span class=\"kt\">bool<\/span> <span class=\"kd\">get<\/span> <span class=\"n\">isPushedNext<\/span> <span class=\"o\">=<\/span><span class=\"p\">&gt;<\/span> <span class=\"k\">this<\/span> <span class=\"o\">==<\/span> <span class=\"n\">pushedNext<\/span><span class=\"p\">;<\/span>\n  <span class=\"kt\">bool<\/span> <span class=\"kd\">get<\/span> <span class=\"n\">isPoppedOff<\/span> <span class=\"o\">=<\/span><span class=\"p\">&gt;<\/span> <span class=\"k\">this<\/span> <span class=\"o\">==<\/span> <span class=\"n\">poppedOff<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u067e\u06cc\u0648\u0646\u062f GitHub.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>GO_ROUTER \u06cc\u06a9\u06cc \u0627\u0632 \u0645\u062d\u0628\u0648\u0628 \u062a\u0631\u06cc\u0646 \u0628\u0633\u062a\u0647 \u0647\u0627 \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0646\u0627\u0648\u0628\u0631\u06cc \u062f\u0631 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 Flutter \u0627\u0633\u062a \u0648 \u0627\u0632 \u0622\u0646\u062c\u0627 \u06a9\u0647 \u0628\u062e\u0634\u06cc \u0627\u0632 \u062a\u06cc\u0645 Flutter \u0634\u062f \u060c \u0628\u0647 \u0631\u0627\u0647 \u062d\u0644 \u0627\u0635\u0644\u06cc \u062a\u0648\u0635\u06cc\u0647 \u0634\u062f\u0647 \u062a\u0628\u062f\u06cc\u0644 \u0634\u062f\u0647 \u0627\u0633\u062a. \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0622\u0646 \u0628\u0633\u06cc\u0627\u0631 \u0622\u0633\u0627\u0646 \u0648 \u062f\u0631 \u0639\u06cc\u0646 \u062d\u0627\u0644 \u063a\u0646\u06cc \u0627\u0632 \u0648\u06cc\u0698\u06af\u06cc \u0627\u0633\u062a. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644 \u060c \u0628\u0627 \u0645\u0639\u0631\u0641\u06cc ShellRoute\u0645\u0634\u0627\u0647\u062f\u0647 \u062c\u0631\u06cc\u0627\u0646 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":109413,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-109412","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/109412","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=109412"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/109412\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/109413"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=109412"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=109412"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=109412"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}