{"id":3846,"date":"2023-05-02T15:47:42","date_gmt":"2023-05-02T08:47:42","guid":{"rendered":"https:\/\/laoitdev.com\/?p=3846"},"modified":"2024-02-07T20:56:47","modified_gmt":"2024-02-07T13:56:47","slug":"flutter-riverpod-go-router-part-1-%e0%ba%81%e0%ba%b2%e0%ba%99%e0%bb%83%e0%ba%8a%e0%bb%89-riverpod-%e0%ba%aa%e0%ba%b3%e0%ba%a5%e0%ba%b1%e0%ba%9a%e0%bb%80%e0%ba%ae%e0%ba%b1%e0%ba%94-go-rou","status":"publish","type":"post","link":"https:\/\/laoitdev.com\/lao\/2023\/3846\/","title":{"rendered":"Flutter riverpod + Go Router [part 1] \u2014 \u0e81\u0eb2\u0e99\u0ec3\u0e8a\u0ec9 riverpod \u0eaa\u0eb3\u0ea5\u0eb1\u0e9a\u0ec0\u0eae\u0eb1\u0e94 go router notifier"},"content":{"rendered":"<p><strong>* \u0ec3\u0e99 part 1 \u0e99\u0eb5\u0ec9\u0e88\u0eb0\u0ec0\u0e9b\u0eb1\u0e99\u0e81\u0eb2\u0e99 setup \u0ec3\u0e99\u0ec1\u0e9a\u0e9a\u0e82\u0ead\u0e87\u0e9c\u0eb9\u0ec9\u0e82\u0ebd\u0e99\u0ec0\u0ead\u0e87<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u0ec3\u0e8a\u0ec9 pocketbase \u0ec0\u0e9b\u0eb1\u0e99 backend api (firebase alternative \u0e88\u0eb0\u0e82\u0ebd\u0e99 blog \u0ec0\u0e9e\u0eb5\u0ec8\u0ea1\u0e95\u0ec8\u0eb2\u0e87\u0eab\u0eb2\u0e81\u0e81\u0ec8\u0ebd\u0ea7\u0e81\u0eb1\u0e9a\u0e81\u0eb2\u0e99\u0ec3\u0e8a\u0ec9\u0e87\u0eb2\u0e99\u0e81\u0eb1\u0e9a pocketbase)<\/li>\n\n\n\n<li>hive \u0eaa\u0eb3\u0ea5\u0eb1\u0e9a persist data (login credentials, theme, language, etc)<\/li>\n\n\n\n<li>go router<\/li>\n\n\n\n<li>get_it \u0eaa\u0eb3\u0ea5\u0eb1\u0e9a dependency injection<\/li>\n<\/ul>\n\n\n\n<p><strong>*project setup \u0ec2\u0e94\u0e8d\u0ead\u0eb5\u0e87\u0e95\u0eb2\u0e81 TDD architecture<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"710\" height=\"878\" src=\"https:\/\/laoitdev.com\/wp-content\/uploads\/2023\/05\/2.webp\" alt=\"\" class=\"wp-image-3849\" srcset=\"https:\/\/laoitdev.com\/wp-content\/uploads\/2023\/05\/2.webp 710w, https:\/\/laoitdev.com\/wp-content\/uploads\/2023\/05\/2-243x300.webp 243w, https:\/\/laoitdev.com\/wp-content\/uploads\/2023\/05\/2-10x12.webp 10w, https:\/\/laoitdev.com\/wp-content\/uploads\/2023\/05\/2-600x742.webp 600w\" sizes=\"auto, (max-width: 710px) 100vw, 710px\" \/><\/figure>\n\n\n\n<p class=\"has-text-align-center\">structure \u0e84\u0ec8\u0eb2\u0ea7\u0ec6 \u0eaa\u0eb3\u0ea5\u0eb1\u0e9a project \u0e97\u0ebb\u0e94\u0ea5\u0ead\u0e87<\/p>\n\n\n\n<p><strong>main_dev.dart<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void main() async {\n  runZonedGuarded(\n    () async {\n      WidgetsFlutterBinding.ensureInitialized();\n\n      \/\/ init hive\n      final appDir = await getApplicationDocumentsDirectory();\n      await Hive.initFlutter(appDir.path);\n      await Hive.openBox('prefs-${Env.envName}');\n\n      \/\/ detect platform type\n      final platformType = detectPlatformType();\n\n      \/\/ init dependencies injection\n      dpInit();\n\n      runApp(\n        ProviderScope(\n          overrides: &#91;platformTypeProvider.overrideWithValue(platformType)],\n          observers: &#91;StateLogger()],\n          child: App(\n            key: Key('app-${Env.envName}'),\n          ),\n        ),\n      );\n    },\n    (error, stack) {\n      ...\n    },\n  );\n}<\/code><\/pre>\n\n\n\n<p><strong>app.dart<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class App extends ConsumerWidget {\n  const App({super.key});\n\n  @override\n  Widget build(BuildContext context, WidgetRef ref) {\n    final router = ref.watch(routerProvider);\n    \/\/ final currentLocale =\n    \/\/ final currentThemeMode =\n    return MaterialApp.router(\n      routerConfig: router,\n      builder: (context, child) {\n        child = ResponsiveBreakpoints.builder(\n          child: BouncingScrollWrapper.builder(context, child!),\n          breakpoints: &#91;\n            const Breakpoint(start: 0, end: 450, name: MOBILE),\n            const Breakpoint(start: 451, end: 800, name: TABLET),\n            const Breakpoint(start: 801, end: 1920, name: DESKTOP),\n            const Breakpoint(start: 1921, end: double.infinity, name: '4K'),\n          ],\n        );\n\n        return child;\n      },\n    );\n  }\n}<\/code><\/pre>\n\n\n\n<p id=\"d4e8\">\u0ec0\u0eae\u0ebb\u0eb2\u0e88\u0eb0\u0ec3\u0e8a\u0ec9\u0ec0\u0e9b\u0eb1\u0e99 MaterialApp.router \u0ec1\u0e97\u0e99 Material \u0e97\u0eb3\u0ea1\u0eb0\u0e94\u0eb2. \u0ec2\u0e94\u0e8d\u0e88\u0eb0\u0ea1\u0eb5 routerConfig \u0ec1\u0ea1\u0ec8\u0e99 \u0ea1\u0eb2\u0e88\u0eb2\u0e81 routerProvider (riverpod ref).<\/p>\n\n\n\n<p id=\"202e\">\u0eaa\u0eb3\u0ea5\u0eb1\u0e9a routerProvider \u0ec1\u0ea1\u0ec8\u0e99\u0e9c\u0eb9\u0ec9\u0e82\u0ebd\u0e99\u0ea7\u0eb2\u0e87\u0ec4\u0ea7\u0ec9\u0ec3\u0e99 lib\/app\/core\/routes<\/p>\n\n\n\n<p id=\"3bbe\">\u0ec2\u0e94\u0e8d\u0e88\u0eb0\u0ea1\u0eb5\u0ea2\u0eb9\u0ec8 2 \u0ec4\u0e9f\u0ea5\u0ecc\u0eab\u0ebc\u0eb1\u0e81\u0ec6\u0e84\u0eb7: router_notifier.dart \u0ec1\u0ea5\u0eb0 router_provider.dart<\/p>\n\n\n\n<p><strong>router_provider.dart<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>final key = GlobalKey&lt;NavigatorState&gt;(debugLabel: '${Env.envName}-router-key');\n\nfinal routerProvider = Provider.autoDispose&lt;GoRouter&gt;((ref) {\n  \/\/ router notifier\n  final notifier = ref.watch(routerNotifier.notifier);\n\n  return GoRouter(\n    navigatorKey: key,\n    refreshListenable: notifier,\n    debugLogDiagnostics: kDebugMode,\n    initialLocation: SplashScreen.path,\n    routes: notifier.routes,\n    redirect: notifier.redirect,\n    errorBuilder: (context, state) =&gt; const ErrorRouterWidget(),\n  );\n});<\/code><\/pre>\n\n\n\n<p><strong>router_notifier.dart<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class RouterNotifier extends AutoDisposeAsyncNotifier&lt;void&gt;\n    implements Listenable {\n  VoidCallback? routerListener;\n  bool isAuth = false;\n\n  @override\n  FutureOr&lt;void&gt; build() async {\n    \/\/\/ mock set default initial auth state to false\n    \/\/\/ UNAUTHENTICATED\n    isAuth = false;\n\n    ref.listenSelf((_, __) {\n      \/\/ One could write more conditional logic for when to call redirection\n      if (state.isLoading) return;\n      routerListener?.call();\n    });\n  }\n\n  \/\/\/ Redirects the user when our authentication changes\n  String? redirect(BuildContext context, GoRouterState state) {\n    \/\/\/ redirect none if state == null\n    if (this.state.isLoading || this.state.hasError) return null;\n\n    \/\/ login location\n    final loginLocation = state.location == LoginScreen.path;\n\n    \/\/ splash location\n    final splashLocation = state.location == SplashScreen.path;\n\n    \/\/ redirect from splash location\n    if (splashLocation) {\n      return isAuth ? HomeScreen.path : LoginScreen.path;\n    }\n\n    \/\/ redirect from login location\n    if (loginLocation) {\n      return isAuth ? HomeScreen.path : LoginScreen.path;\n    }\n\n    return null;\n  }\n\n  \/\/\/ all available app routes\n  \/\/\/\n  \/\/\/ `&lt;GoRoute&gt;&#91;]`\n  List&lt;GoRoute&gt; get routes =&gt; &#91;\n        GoRoute(\n          path: SplashScreen.path,\n          builder: (context, state) =&gt; const SplashScreen(),\n        ),\n        GoRoute(\n          path: LoginScreen.path,\n          builder: (context, state) =&gt; const LoginScreen(),\n        ),\n        GoRoute(\n          path: RegisterScreen.path,\n          builder: (context, state) =&gt; const RegisterScreen(),\n        ),\n        GoRoute(\n          path: HomeScreen.path,\n          builder: (context, state) =&gt; const HomeScreen(),\n        ),\n      ];\n\n  \/\/\/ Adds &#91;GoRouter]'s listener as specified by its &#91;Listenable]\n  \/\/\/ &#91;GoRouteInformationProvider] uses this method on creation to handle its\n  \/\/\/ internal &#91;ChangeNotifier].\n  \/\/\/ Check out the internal implementation of &#91;GoRouter] and\n  \/\/\/ &#91;GoRouteInformationProvider] to see this in action.\n  @override\n  void addListener(VoidCallback listener) {\n    routerListener = listener;\n  }\n\n  \/\/\/ Removes &#91;GoRouter]'s listener as specified by its &#91;Listenable].\n  \/\/\/ &#91;GoRouteInformationProvider] uses this method when disposing,\n  \/\/\/ so that it removes its callback when destroyed.\n  \/\/\/ Check out the internal implementation of &#91;GoRouter] and\n  \/\/\/ &#91;GoRouteInformationProvider] to see this in action.\n  @override\n  void removeListener(VoidCallback listener) {\n    routerListener = null;\n  }\n}\n\nfinal routerNotifier = AutoDisposeAsyncNotifierProvider&lt;RouterNotifier, void&gt;(\n  () =&gt; RouterNotifier(),\n);<\/code><\/pre>\n\n\n\n<p id=\"722a\">\u0eab\u0ebc\u0eb1\u0e81\u0ec6\u0ec3\u0e99 router_notifier.dart \u0e99\u0eb5\u0ec9\u0ec1\u0ea1\u0ec8\u0e99\u0e88\u0eb0\u0ec4\u0ea7\u0ec9 listen \u0e81\u0ecd\u0ea5\u0eb0\u0e99\u0eb5\u0ea1\u0eb5 router redirect \u0ec0\u0e8a\u0eb1\u0ec8\u0e99: \u0ec0\u0ea7\u0ea5\u0eb2 user logged in, user token expired, user logged out, \u0ec1\u0ea5\u0eb0 \u0ead\u0eb7\u0ec8\u0e99\u0ec6. \u0ec1\u0ea5\u0eb0 \u0e9c\u0eb9\u0ec9\u0e82\u0ebd\u0e99\u0ec0\u0ead\u0e87\u0e81\u0ecd\u0ec4\u0e94\u0ec9\u0e9b\u0eb0\u0e81\u0eb2\u0e94 List&lt;GoRoute&gt; get routes \u0ec4\u0ea7\u0ec9\u0e99\u0eb3 \u0eab\u0ebc\u0eb7 \u0e81\u0ecd\u0e84\u0eb7 routes \u0e97\u0eb1\u0e87\u0edd\u0ebb\u0e94\u0ec3\u0e99 app \u0ec0\u0eae\u0ebb\u0eb2\u0ec4\u0ea7\u0ec9\u0e97\u0eb5\u0ec8\u0e99\u0eb5\u0ec9.<\/p>\n\n\n\n<p><strong>\u0eab\u0ebc\u0eb1\u0e87\u0e88\u0eb2\u0e81 run<\/strong><\/p>\n\n\n\n<p id=\"f2b5\">\u0e9c\u0ebb\u0e99\u0eab\u0ebc\u0eb1\u0e87\u0e88\u0eb2\u0e81 run \u0e81\u0ecd\u0e88\u0eb0\u0eaa\u0eb0\u0ec1\u0e94\u0e87 GoRouter \u0e95\u0eb2\u0ea1\u0ec3\u0e99\u0eae\u0eb9\u0e9a\u0e94\u0eb1\u0ec8\u0e87\u0e99\u0eb5\u0ec9:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"704\" height=\"234\" src=\"https:\/\/laoitdev.com\/wp-content\/uploads\/2023\/05\/3.webp\" alt=\"\" class=\"wp-image-3850\" srcset=\"https:\/\/laoitdev.com\/wp-content\/uploads\/2023\/05\/3.webp 704w, https:\/\/laoitdev.com\/wp-content\/uploads\/2023\/05\/3-300x100.webp 300w, https:\/\/laoitdev.com\/wp-content\/uploads\/2023\/05\/3-18x6.webp 18w, https:\/\/laoitdev.com\/wp-content\/uploads\/2023\/05\/3-600x199.webp 600w\" sizes=\"auto, (max-width: 704px) 100vw, 704px\" \/><\/figure>\n\n\n\n<p class=\"has-text-align-center\">debug console<\/p>\n\n\n\n<p id=\"7ef0\">\u0ec0\u0e8a\u0eb4\u0ec8\u0e87\u0e88\u0eb0\u0ec0\u0eab\u0eb1\u0e99\u0ea7\u0ec8\u0eb2\u0ea1\u0eb5\u0e97\u0eb1\u0e87\u0edd\u0ebb\u0e94\u0ea2\u0eb9\u0ec8 4 routes \u0e95\u0eb2\u0ea1\u0ec3\u0e99 router_notifier.dart<\/p>\n\n\n\n<p id=\"4c00\">init location \u0ec1\u0ea1\u0ec8\u0e99 \/splash \u0e95\u0eb2\u0ea1\u0ec3\u0e99 router_provider.dart<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>initialLocation: SplashScreen.path,<\/code><\/pre>\n\n\n\n<p id=\"9bae\">redirecting \u0ec1\u0ea1\u0ec8\u0e99\u0ead\u0eb5\u0e87\u0e95\u0eb2\u0ea1 redirect  \u0ec3\u0e99 router_notifier.dart \u0e97\u0eb5\u0ec8 build() \u0ec3\u0e99 redirect \u0e88\u0eb0 return route path \u0ead\u0eb5\u0e87\u0e95\u0eb2\u0ea1\u0e97\u0eb5\u0ec8\u0ec0\u0eae\u0ebb\u0eb2\u0ec4\u0e94\u0ec9 check condition \u0ec4\u0ea7\u0ec9.<\/p>\n\n\n\n<p id=\"4d11\">part 1 \u2014 \u0e81\u0eb2\u0e99\u0ec3\u0e8a\u0ec9 riverpod \u0eaa\u0eb3\u0ea5\u0eb1\u0e9a\u0ec0\u0eae\u0eb1\u0e94 go router notifier<\/p>\n\n\n\n<p id=\"52d9\">\u0e82\u0ecd\u0e88\u0ebb\u0e9a\u0ec4\u0ea7\u0ec9\u0e9e\u0ebd\u0e87\u0ec0\u0e97\u0ebb\u0ec8\u0eb2\u0e99\u0eb5\u0ec9. \u0eaa\u0eb3\u0ea5\u0eb1\u0e9a part \u0e95\u0ecd\u0ec8\u0ec4\u0e9b\u0ec1\u0ea1\u0ec8\u0e99\u0ec0\u0eae\u0ebb\u0eb2\u0e88\u0eb0\u0ec0\u0ea5\u0eb5\u0ec8\u0ea1\u0ec0\u0eae\u0eb1\u0e94 authentication \u0ec1\u0ea5\u0eb0 navigation \u0e9e\u0ec9\u0ead\u0ea1\u0e81\u0eb1\u0e9a\u0e81\u0eb2\u0e99 pass argument.<\/p>\n\n\n\n<p><a rel=\"noreferrer noopener\" href=\"https:\/\/riverpod.dev\/\" target=\"_blank\"><strong>\u0edd\u0eb2\u0e8d\u0ec0\u0eab\u0e94<\/strong><\/a>: \u0eaa\u0eb3\u0ea5\u0eb1\u0e9a project source code \u0e9c\u0eb9\u0ec9\u0e82\u0ebd\u0e99\u0e88\u0eb0 open public \u0ec4\u0ea7\u0ec9\u0e97\u0eb2\u0e87 github \u0ec3\u0e99\u0e9e\u0eb2\u0e8d\u0eab\u0ebc\u0eb1\u0e87.<\/p>\n\n\n\n<p><a data-type=\"URL\" data-id=\"https:\/\/medium.com\/tag\/mobile-development\" href=\"https:\/\/medium.com\/tag\/mobile-development\" target=\"_blank\" rel=\"noreferrer noopener\">Mobile Development<\/a><\/p>\n\n\n\n<p>\u0e82\u0ebd\u0e99\u0ec2\u0e94\u0e8d:\u00a0<a href=\"https:\/\/medium.com\/@noysengxayya\">Noy Sengxayya<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>* \u0ec3\u0e99 part 1 \u0e99\u0eb5\u0ec9\u0e88\u0eb0\u0ec0\u0e9b\u0eb1\u0e99\u0e81\u0eb2\u0e99 setup \u0ec3\u0e99\u0ec1\u0e9a\u0e9a\u0e82\u0ead\u0e87\u0e9c\u0eb9\u0ec9\u0e82\u0ebd\u0e99\u0ec0\u0ead\u0e87 *project setup \u0ec2\u0e94\u0e8d\u0ead\u0eb5\u0e87\u0e95\u0eb2\u0e81 TDD architecture structure \u0e84\u0ec8\u0eb2\u0ea7\u0ec6 \u0eaa\u0eb3\u0ea5\u0eb1\u0e9a project \u0e97\u0ebb\u0e94\u0ea5\u0ead\u0e87 main_dev.dart app.dart \u0ec0\u0eae\u0ebb\u0eb2\u0e88\u0eb0\u0ec3\u0e8a\u0ec9\u0ec0\u0e9b\u0eb1\u0e99 &#8230; <a class=\"cz_readmore\" href=\"https:\/\/laoitdev.com\/lao\/2023\/3846\/\"><i class=\"fa fa-angle-right\"><\/i><span>\u0ead\u0ec8\u0eb2\u0e99\u0ec0\u0e9e\u0eb5\u0ec8\u0ea1\u0ec0\u0e95\u0eb5\u0ea1<\/span><\/a><\/p>","protected":false},"author":6,"featured_media":3847,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-3846","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Flutter riverpod + Go Router [part 1] \u2014 \u0e81\u0eb2\u0e99\u0ec3\u0e8a\u0ec9 riverpod \u0eaa\u0eb3\u0ea5\u0eb1\u0e9a\u0ec0\u0eae\u0eb1\u0e94 go router notifier - Lao IT Dev<\/title>\n<meta name=\"description\" content=\"* \u0ec3\u0e99 part 1 \u0e99\u0eb5\u0ec9\u0e88\u0eb0\u0ec0\u0e9b\u0eb1\u0e99\u0e81\u0eb2\u0e99 setup \u0ec3\u0e99\u0ec1\u0e9a\u0e9a\u0e82\u0ead\u0e87\u0e9c\u0eb9\u0ec9\u0e82\u0ebd\u0e99\u0ec0\u0ead\u0e87 \u0ec3\u0e8a\u0ec9 pocketbase \u0ec0\u0e9b\u0eb1\u0e99 backend api (firebase alternative \u0e88\u0eb0\u0e82\u0ebd\u0e99 blog \u0ec0\u0e9e\u0eb5\u0ec8\u0ea1\u0e95\u0ec8\u0eb2\u0e87\u0eab\u0eb2\u0e81\u0e81\u0ec8\u0ebd\u0ea7\u0e81\u0eb1\u0e9a\u0e81\u0eb2\u0e99\u0ec3\u0e8a\u0ec9\u0e87\u0eb2\u0e99\u0e81\u0eb1\u0e9a Lao IT Dev Flutter riverpod + Go Router [part 1] \u2014 \u0e81\u0eb2\u0e99\u0ec3\u0e8a\u0ec9 riverpod \u0eaa\u0eb3\u0ea5\u0eb1\u0e9a\u0ec0\u0eae\u0eb1\u0e94 go router notifier Domestic and international ICT services, consultants, Mobile app, Web development, application development, Blockchain, AI and Cryptocurrency\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/laoitdev.com\/lao\/2023\/3846\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Flutter riverpod + Go Router [part 1] \u2014 \u0e81\u0eb2\u0e99\u0ec3\u0e8a\u0ec9 riverpod \u0eaa\u0eb3\u0ea5\u0eb1\u0e9a\u0ec0\u0eae\u0eb1\u0e94 go router notifier - Lao IT Dev\" \/>\n<meta property=\"og:description\" content=\"* \u0ec3\u0e99 part 1 \u0e99\u0eb5\u0ec9\u0e88\u0eb0\u0ec0\u0e9b\u0eb1\u0e99\u0e81\u0eb2\u0e99 setup \u0ec3\u0e99\u0ec1\u0e9a\u0e9a\u0e82\u0ead\u0e87\u0e9c\u0eb9\u0ec9\u0e82\u0ebd\u0e99\u0ec0\u0ead\u0e87 \u0ec3\u0e8a\u0ec9 pocketbase \u0ec0\u0e9b\u0eb1\u0e99 backend api (firebase alternative \u0e88\u0eb0\u0e82\u0ebd\u0e99 blog \u0ec0\u0e9e\u0eb5\u0ec8\u0ea1\u0e95\u0ec8\u0eb2\u0e87\u0eab\u0eb2\u0e81\u0e81\u0ec8\u0ebd\u0ea7\u0e81\u0eb1\u0e9a\u0e81\u0eb2\u0e99\u0ec3\u0e8a\u0ec9\u0e87\u0eb2\u0e99\u0e81\u0eb1\u0e9a Lao IT Dev Flutter riverpod + Go Router [part 1] \u2014 \u0e81\u0eb2\u0e99\u0ec3\u0e8a\u0ec9 riverpod \u0eaa\u0eb3\u0ea5\u0eb1\u0e9a\u0ec0\u0eae\u0eb1\u0e94 go router notifier Domestic and international ICT services, consultants, Mobile app, Web development, application development, Blockchain, AI and Cryptocurrency\" \/>\n<meta property=\"og:url\" content=\"https:\/\/laoitdev.com\/lao\/2023\/3846\/\" \/>\n<meta property=\"og:site_name\" content=\"Lao IT Dev\" \/>\n<meta property=\"article:published_time\" content=\"2023-05-02T08:47:42+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-02-07T13:56:47+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/laoitdev.com\/wp-content\/uploads\/2023\/05\/1-1.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"828\" \/>\n\t<meta property=\"og:image:height\" content=\"306\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"tokky\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u0e82\u0ebd\u0e99\u0ec2\u0e94\u0e8d\" \/>\n\t<meta name=\"twitter:data1\" content=\"tokky\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u0ec0\u0ea7\u0ea5\u0eb2\u0ead\u0ec8\u0eb2\u0e99\u0ec2\u0e94\u0e8d\u0e9b\u0eb0\u0ea1\u0eb2\u0e99\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 \u0e99\u0eb2\u0e97\u0eb5\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\\\/\\\/laoitdev.com\\\/2023\\\/3846\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/laoitdev.com\\\/2023\\\/3846\\\/\"},\"author\":{\"name\":\"tokky\",\"@id\":\"https:\\\/\\\/laoitdev.com\\\/#\\\/schema\\\/person\\\/62c6bcfc84b462debc10fa03342f78bf\"},\"headline\":\"Flutter riverpod + Go Router [part 1] \u2014 \u0e81\u0eb2\u0e99\u0ec3\u0e8a\u0ec9 riverpod \u0eaa\u0eb3\u0ea5\u0eb1\u0e9a\u0ec0\u0eae\u0eb1\u0e94 go router notifier\",\"datePublished\":\"2023-05-02T08:47:42+00:00\",\"dateModified\":\"2024-02-07T13:56:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/laoitdev.com\\\/2023\\\/3846\\\/\"},\"wordCount\":137,\"publisher\":{\"@id\":\"https:\\\/\\\/laoitdev.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/laoitdev.com\\\/2023\\\/3846\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/laoitdev.com\\\/wp-content\\\/uploads\\\/2023\\\/05\\\/1-1.webp\",\"articleSection\":[\"News\"],\"inLanguage\":\"lo\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/laoitdev.com\\\/2023\\\/3846\\\/\",\"url\":\"https:\\\/\\\/laoitdev.com\\\/2023\\\/3846\\\/\",\"name\":\"Flutter riverpod + Go Router [part 1] \u2014 \u0e81\u0eb2\u0e99\u0ec3\u0e8a\u0ec9 riverpod \u0eaa\u0eb3\u0ea5\u0eb1\u0e9a\u0ec0\u0eae\u0eb1\u0e94 go router notifier - Lao IT Dev\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/laoitdev.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/laoitdev.com\\\/2023\\\/3846\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/laoitdev.com\\\/2023\\\/3846\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/laoitdev.com\\\/wp-content\\\/uploads\\\/2023\\\/05\\\/1-1.webp\",\"datePublished\":\"2023-05-02T08:47:42+00:00\",\"dateModified\":\"2024-02-07T13:56:47+00:00\",\"description\":\"* \u0ec3\u0e99 part 1 \u0e99\u0eb5\u0ec9\u0e88\u0eb0\u0ec0\u0e9b\u0eb1\u0e99\u0e81\u0eb2\u0e99 setup \u0ec3\u0e99\u0ec1\u0e9a\u0e9a\u0e82\u0ead\u0e87\u0e9c\u0eb9\u0ec9\u0e82\u0ebd\u0e99\u0ec0\u0ead\u0e87 \u0ec3\u0e8a\u0ec9 pocketbase \u0ec0\u0e9b\u0eb1\u0e99 backend api (firebase alternative \u0e88\u0eb0\u0e82\u0ebd\u0e99 blog \u0ec0\u0e9e\u0eb5\u0ec8\u0ea1\u0e95\u0ec8\u0eb2\u0e87\u0eab\u0eb2\u0e81\u0e81\u0ec8\u0ebd\u0ea7\u0e81\u0eb1\u0e9a\u0e81\u0eb2\u0e99\u0ec3\u0e8a\u0ec9\u0e87\u0eb2\u0e99\u0e81\u0eb1\u0e9a Lao IT Dev Flutter riverpod + Go Router [part 1] \u2014 \u0e81\u0eb2\u0e99\u0ec3\u0e8a\u0ec9 riverpod \u0eaa\u0eb3\u0ea5\u0eb1\u0e9a\u0ec0\u0eae\u0eb1\u0e94 go router notifier Domestic and international ICT services, consultants, Mobile app, Web development, application development, Blockchain, AI and Cryptocurrency\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/laoitdev.com\\\/2023\\\/3846\\\/#breadcrumb\"},\"inLanguage\":\"lo\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/laoitdev.com\\\/2023\\\/3846\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"lo\",\"@id\":\"https:\\\/\\\/laoitdev.com\\\/2023\\\/3846\\\/#primaryimage\",\"url\":\"https:\\\/\\\/laoitdev.com\\\/wp-content\\\/uploads\\\/2023\\\/05\\\/1-1.webp\",\"contentUrl\":\"https:\\\/\\\/laoitdev.com\\\/wp-content\\\/uploads\\\/2023\\\/05\\\/1-1.webp\",\"width\":828,\"height\":306},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/laoitdev.com\\\/2023\\\/3846\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/laoitdev.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Flutter riverpod + Go Router [part 1] \u2014 \u0e81\u0eb2\u0e99\u0ec3\u0e8a\u0ec9 riverpod \u0eaa\u0eb3\u0ea5\u0eb1\u0e9a\u0ec0\u0eae\u0eb1\u0e94 go router notifier\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/laoitdev.com\\\/#website\",\"url\":\"https:\\\/\\\/laoitdev.com\\\/\",\"name\":\"Lao IT Dev - Lao ICT Solutions Group\",\"description\":\"LAOITDEV\",\"publisher\":{\"@id\":\"https:\\\/\\\/laoitdev.com\\\/#organization\"},\"alternateName\":\"Domestic and international ICT services, consultants, Mobile app, Web development, application development, Blockchain, AI and Cryptocurrency\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/laoitdev.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"lo\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/laoitdev.com\\\/#organization\",\"name\":\"Lao IT Dev Co., Ltd.\",\"url\":\"https:\\\/\\\/laoitdev.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"lo\",\"@id\":\"https:\\\/\\\/laoitdev.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/laoitdev.com\\\/wp-content\\\/uploads\\\/2021\\\/08\\\/Default-feature-image.jpg\",\"contentUrl\":\"https:\\\/\\\/laoitdev.com\\\/wp-content\\\/uploads\\\/2021\\\/08\\\/Default-feature-image.jpg\",\"width\":800,\"height\":600,\"caption\":\"Lao IT Dev Co., Ltd.\"},\"image\":{\"@id\":\"https:\\\/\\\/laoitdev.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/laoitdev.com\\\/#\\\/schema\\\/person\\\/62c6bcfc84b462debc10fa03342f78bf\",\"name\":\"tokky\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"lo\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/27a02a239b23482f31f7926e9d4fcc9213d6ec730a49849035affbfd90580ab0?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/27a02a239b23482f31f7926e9d4fcc9213d6ec730a49849035affbfd90580ab0?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/27a02a239b23482f31f7926e9d4fcc9213d6ec730a49849035affbfd90580ab0?s=96&d=mm&r=g\",\"caption\":\"tokky\"},\"url\":\"https:\\\/\\\/laoitdev.com\\\/lao\\\/author\\\/tokky\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Flutter riverpod + Go Router [part 1] \u2014 \u0e81\u0eb2\u0e99\u0ec3\u0e8a\u0ec9 riverpod \u0eaa\u0eb3\u0ea5\u0eb1\u0e9a\u0ec0\u0eae\u0eb1\u0e94 go router notifier - Lao IT Dev","description":"* \u0ec3\u0e99 part 1 \u0e99\u0eb5\u0ec9\u0e88\u0eb0\u0ec0\u0e9b\u0eb1\u0e99\u0e81\u0eb2\u0e99 setup \u0ec3\u0e99\u0ec1\u0e9a\u0e9a\u0e82\u0ead\u0e87\u0e9c\u0eb9\u0ec9\u0e82\u0ebd\u0e99\u0ec0\u0ead\u0e87 \u0ec3\u0e8a\u0ec9 pocketbase \u0ec0\u0e9b\u0eb1\u0e99 backend api (firebase alternative \u0e88\u0eb0\u0e82\u0ebd\u0e99 blog \u0ec0\u0e9e\u0eb5\u0ec8\u0ea1\u0e95\u0ec8\u0eb2\u0e87\u0eab\u0eb2\u0e81\u0e81\u0ec8\u0ebd\u0ea7\u0e81\u0eb1\u0e9a\u0e81\u0eb2\u0e99\u0ec3\u0e8a\u0ec9\u0e87\u0eb2\u0e99\u0e81\u0eb1\u0e9a Lao IT Dev Flutter riverpod + Go Router [part 1] \u2014 \u0e81\u0eb2\u0e99\u0ec3\u0e8a\u0ec9 riverpod \u0eaa\u0eb3\u0ea5\u0eb1\u0e9a\u0ec0\u0eae\u0eb1\u0e94 go router notifier Domestic and international ICT services, consultants, Mobile app, Web development, application development, Blockchain, AI and Cryptocurrency","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/laoitdev.com\/lao\/2023\/3846\/","og_locale":"en_US","og_type":"article","og_title":"Flutter riverpod + Go Router [part 1] \u2014 \u0e81\u0eb2\u0e99\u0ec3\u0e8a\u0ec9 riverpod \u0eaa\u0eb3\u0ea5\u0eb1\u0e9a\u0ec0\u0eae\u0eb1\u0e94 go router notifier - Lao IT Dev","og_description":"* \u0ec3\u0e99 part 1 \u0e99\u0eb5\u0ec9\u0e88\u0eb0\u0ec0\u0e9b\u0eb1\u0e99\u0e81\u0eb2\u0e99 setup \u0ec3\u0e99\u0ec1\u0e9a\u0e9a\u0e82\u0ead\u0e87\u0e9c\u0eb9\u0ec9\u0e82\u0ebd\u0e99\u0ec0\u0ead\u0e87 \u0ec3\u0e8a\u0ec9 pocketbase \u0ec0\u0e9b\u0eb1\u0e99 backend api (firebase alternative \u0e88\u0eb0\u0e82\u0ebd\u0e99 blog \u0ec0\u0e9e\u0eb5\u0ec8\u0ea1\u0e95\u0ec8\u0eb2\u0e87\u0eab\u0eb2\u0e81\u0e81\u0ec8\u0ebd\u0ea7\u0e81\u0eb1\u0e9a\u0e81\u0eb2\u0e99\u0ec3\u0e8a\u0ec9\u0e87\u0eb2\u0e99\u0e81\u0eb1\u0e9a Lao IT Dev Flutter riverpod + Go Router [part 1] \u2014 \u0e81\u0eb2\u0e99\u0ec3\u0e8a\u0ec9 riverpod \u0eaa\u0eb3\u0ea5\u0eb1\u0e9a\u0ec0\u0eae\u0eb1\u0e94 go router notifier Domestic and international ICT services, consultants, Mobile app, Web development, application development, Blockchain, AI and Cryptocurrency","og_url":"https:\/\/laoitdev.com\/lao\/2023\/3846\/","og_site_name":"Lao IT Dev","article_published_time":"2023-05-02T08:47:42+00:00","article_modified_time":"2024-02-07T13:56:47+00:00","og_image":[{"width":828,"height":306,"url":"https:\/\/laoitdev.com\/wp-content\/uploads\/2023\/05\/1-1.webp","type":"image\/webp"}],"author":"tokky","twitter_card":"summary_large_image","twitter_misc":{"\u0e82\u0ebd\u0e99\u0ec2\u0e94\u0e8d":"tokky","\u0ec0\u0ea7\u0ea5\u0eb2\u0ead\u0ec8\u0eb2\u0e99\u0ec2\u0e94\u0e8d\u0e9b\u0eb0\u0ea1\u0eb2\u0e99":"2 \u0e99\u0eb2\u0e97\u0eb5"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/laoitdev.com\/2023\/3846\/#article","isPartOf":{"@id":"https:\/\/laoitdev.com\/2023\/3846\/"},"author":{"name":"tokky","@id":"https:\/\/laoitdev.com\/#\/schema\/person\/62c6bcfc84b462debc10fa03342f78bf"},"headline":"Flutter riverpod + Go Router [part 1] \u2014 \u0e81\u0eb2\u0e99\u0ec3\u0e8a\u0ec9 riverpod \u0eaa\u0eb3\u0ea5\u0eb1\u0e9a\u0ec0\u0eae\u0eb1\u0e94 go router notifier","datePublished":"2023-05-02T08:47:42+00:00","dateModified":"2024-02-07T13:56:47+00:00","mainEntityOfPage":{"@id":"https:\/\/laoitdev.com\/2023\/3846\/"},"wordCount":137,"publisher":{"@id":"https:\/\/laoitdev.com\/#organization"},"image":{"@id":"https:\/\/laoitdev.com\/2023\/3846\/#primaryimage"},"thumbnailUrl":"https:\/\/laoitdev.com\/wp-content\/uploads\/2023\/05\/1-1.webp","articleSection":["News"],"inLanguage":"lo"},{"@type":"WebPage","@id":"https:\/\/laoitdev.com\/2023\/3846\/","url":"https:\/\/laoitdev.com\/2023\/3846\/","name":"Flutter riverpod + Go Router [part 1] \u2014 \u0e81\u0eb2\u0e99\u0ec3\u0e8a\u0ec9 riverpod \u0eaa\u0eb3\u0ea5\u0eb1\u0e9a\u0ec0\u0eae\u0eb1\u0e94 go router notifier - Lao IT Dev","isPartOf":{"@id":"https:\/\/laoitdev.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/laoitdev.com\/2023\/3846\/#primaryimage"},"image":{"@id":"https:\/\/laoitdev.com\/2023\/3846\/#primaryimage"},"thumbnailUrl":"https:\/\/laoitdev.com\/wp-content\/uploads\/2023\/05\/1-1.webp","datePublished":"2023-05-02T08:47:42+00:00","dateModified":"2024-02-07T13:56:47+00:00","description":"* \u0ec3\u0e99 part 1 \u0e99\u0eb5\u0ec9\u0e88\u0eb0\u0ec0\u0e9b\u0eb1\u0e99\u0e81\u0eb2\u0e99 setup \u0ec3\u0e99\u0ec1\u0e9a\u0e9a\u0e82\u0ead\u0e87\u0e9c\u0eb9\u0ec9\u0e82\u0ebd\u0e99\u0ec0\u0ead\u0e87 \u0ec3\u0e8a\u0ec9 pocketbase \u0ec0\u0e9b\u0eb1\u0e99 backend api (firebase alternative \u0e88\u0eb0\u0e82\u0ebd\u0e99 blog \u0ec0\u0e9e\u0eb5\u0ec8\u0ea1\u0e95\u0ec8\u0eb2\u0e87\u0eab\u0eb2\u0e81\u0e81\u0ec8\u0ebd\u0ea7\u0e81\u0eb1\u0e9a\u0e81\u0eb2\u0e99\u0ec3\u0e8a\u0ec9\u0e87\u0eb2\u0e99\u0e81\u0eb1\u0e9a Lao IT Dev Flutter riverpod + Go Router [part 1] \u2014 \u0e81\u0eb2\u0e99\u0ec3\u0e8a\u0ec9 riverpod \u0eaa\u0eb3\u0ea5\u0eb1\u0e9a\u0ec0\u0eae\u0eb1\u0e94 go router notifier Domestic and international ICT services, consultants, Mobile app, Web development, application development, Blockchain, AI and Cryptocurrency","breadcrumb":{"@id":"https:\/\/laoitdev.com\/2023\/3846\/#breadcrumb"},"inLanguage":"lo","potentialAction":[{"@type":"ReadAction","target":["https:\/\/laoitdev.com\/2023\/3846\/"]}]},{"@type":"ImageObject","inLanguage":"lo","@id":"https:\/\/laoitdev.com\/2023\/3846\/#primaryimage","url":"https:\/\/laoitdev.com\/wp-content\/uploads\/2023\/05\/1-1.webp","contentUrl":"https:\/\/laoitdev.com\/wp-content\/uploads\/2023\/05\/1-1.webp","width":828,"height":306},{"@type":"BreadcrumbList","@id":"https:\/\/laoitdev.com\/2023\/3846\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/laoitdev.com\/"},{"@type":"ListItem","position":2,"name":"Flutter riverpod + Go Router [part 1] \u2014 \u0e81\u0eb2\u0e99\u0ec3\u0e8a\u0ec9 riverpod \u0eaa\u0eb3\u0ea5\u0eb1\u0e9a\u0ec0\u0eae\u0eb1\u0e94 go router notifier"}]},{"@type":"WebSite","@id":"https:\/\/laoitdev.com\/#website","url":"https:\/\/laoitdev.com\/","name":"Lao IT Dev - Lao ICT Solutions Group","description":"LAOITDEV","publisher":{"@id":"https:\/\/laoitdev.com\/#organization"},"alternateName":"Domestic and international ICT services, consultants, Mobile app, Web development, application development, Blockchain, AI and Cryptocurrency","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/laoitdev.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"lo"},{"@type":"Organization","@id":"https:\/\/laoitdev.com\/#organization","name":"Lao IT Dev Co., Ltd.","url":"https:\/\/laoitdev.com\/","logo":{"@type":"ImageObject","inLanguage":"lo","@id":"https:\/\/laoitdev.com\/#\/schema\/logo\/image\/","url":"https:\/\/laoitdev.com\/wp-content\/uploads\/2021\/08\/Default-feature-image.jpg","contentUrl":"https:\/\/laoitdev.com\/wp-content\/uploads\/2021\/08\/Default-feature-image.jpg","width":800,"height":600,"caption":"Lao IT Dev Co., Ltd."},"image":{"@id":"https:\/\/laoitdev.com\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/laoitdev.com\/#\/schema\/person\/62c6bcfc84b462debc10fa03342f78bf","name":"tokky","image":{"@type":"ImageObject","inLanguage":"lo","@id":"https:\/\/secure.gravatar.com\/avatar\/27a02a239b23482f31f7926e9d4fcc9213d6ec730a49849035affbfd90580ab0?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/27a02a239b23482f31f7926e9d4fcc9213d6ec730a49849035affbfd90580ab0?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/27a02a239b23482f31f7926e9d4fcc9213d6ec730a49849035affbfd90580ab0?s=96&d=mm&r=g","caption":"tokky"},"url":"https:\/\/laoitdev.com\/lao\/author\/tokky\/"}]}},"_links":{"self":[{"href":"https:\/\/laoitdev.com\/lao\/wp-json\/wp\/v2\/posts\/3846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/laoitdev.com\/lao\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/laoitdev.com\/lao\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/laoitdev.com\/lao\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/laoitdev.com\/lao\/wp-json\/wp\/v2\/comments?post=3846"}],"version-history":[{"count":4,"href":"https:\/\/laoitdev.com\/lao\/wp-json\/wp\/v2\/posts\/3846\/revisions"}],"predecessor-version":[{"id":3864,"href":"https:\/\/laoitdev.com\/lao\/wp-json\/wp\/v2\/posts\/3846\/revisions\/3864"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/laoitdev.com\/lao\/wp-json\/wp\/v2\/media\/3847"}],"wp:attachment":[{"href":"https:\/\/laoitdev.com\/lao\/wp-json\/wp\/v2\/media?parent=3846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/laoitdev.com\/lao\/wp-json\/wp\/v2\/categories?post=3846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/laoitdev.com\/lao\/wp-json\/wp\/v2\/tags?post=3846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}