[{"data":1,"prerenderedAt":2323},["ShallowReactive",2],{"navigation_docs":3,"-flutter-setup":265,"-flutter-setup-surround":2318},[4,35,49,89,117,164,193,235,253,257,261],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"/getting-started","1.getting-started",[10,15,20,25,30],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","/getting-started/introduction","1.getting-started/2.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Installation","/getting-started/installation","1.getting-started/3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Quick Start","/getting-started/quick-start","1.getting-started/4.quick-start","i-lucide-rocket",{"title":26,"path":27,"stem":28,"icon":29},"Configuration","/getting-started/configuration","1.getting-started/5.configuration","i-lucide-sliders-horizontal",{"title":31,"path":32,"stem":33,"icon":34},"First Auth","/getting-started/first-auth","1.getting-started/6.first-auth","i-lucide-key-round",{"title":36,"path":37,"stem":38,"children":39,"page":6},"Migration","/migration","10.migration",[40,45],{"title":41,"path":42,"stem":43,"icon":44},"Migration depuis Firebase Auth","/migration/from-firebase","10.migration/1.from-firebase","i-lucide-arrow-right-left",{"title":46,"path":47,"stem":48,"icon":44},"Migration depuis Supabase Auth","/migration/from-supabase","10.migration/2.from-supabase",{"title":50,"path":51,"stem":52,"children":53,"page":6},"Core Concepts","/core-concepts","2.core-concepts",[54,59,64,69,74,79,84],{"title":55,"path":56,"stem":57,"icon":58},"Architecture","/core-concepts/architecture","2.core-concepts/1.architecture","i-lucide-layers",{"title":60,"path":61,"stem":62,"icon":63},"Providers","/core-concepts/providers","2.core-concepts/2.providers","i-lucide-plug",{"title":65,"path":66,"stem":67,"icon":68},"Sessions","/core-concepts/sessions","2.core-concepts/3.sessions","i-lucide-timer",{"title":70,"path":71,"stem":72,"icon":73},"Storage","/core-concepts/storage","2.core-concepts/4.storage","i-lucide-database",{"title":75,"path":76,"stem":77,"icon":78},"Reactivity","/core-concepts/reactivity","2.core-concepts/5.reactivity","i-lucide-activity",{"title":80,"path":81,"stem":82,"icon":83},"Callbacks","/core-concepts/callbacks","2.core-concepts/6.callbacks","i-lucide-shield-check",{"title":85,"path":86,"stem":87,"icon":88},"Events","/core-concepts/events","2.core-concepts/7.events","i-lucide-radio",{"title":60,"path":90,"stem":91,"children":92,"page":6},"/providers","3.providers",[93,97,101,105,109,113],{"title":94,"path":95,"stem":96},"Credentials Provider","/providers/credentials","3.providers/1.credentials",{"title":98,"path":99,"stem":100},"OAuth2 Provider","/providers/oauth2","3.providers/2.oauth2",{"title":102,"path":103,"stem":104},"Google Provider","/providers/google","3.providers/3.google",{"title":106,"path":107,"stem":108},"GitHub Provider","/providers/github","3.providers/4.github",{"title":110,"path":111,"stem":112},"Apple Provider","/providers/apple","3.providers/5.apple",{"title":114,"path":115,"stem":116},"Proxy OAuth Provider","/providers/proxy-oauth","3.providers/6.proxy-oauth",{"title":118,"path":119,"stem":120,"children":121,"page":6},"Guides","/guides","4.guides",[122,126,131,136,141,146,151,155,159],{"title":123,"path":124,"stem":125},"Email / Password Auth","/guides/email-auth","4.guides/1.email-auth",{"title":127,"path":128,"stem":129,"icon":130},"Custom OAuth2 Flow","/guides/oauth2-flow","4.guides/2.oauth2-flow","i-lucide-workflow",{"title":132,"path":133,"stem":134,"icon":135},"Deep Links & OAuth2 Callbacks","/guides/deep-links","4.guides/3.deep-links","i-lucide-link",{"title":137,"path":138,"stem":139,"icon":140},"Token Refresh","/guides/token-refresh","4.guides/4.token-refresh","i-lucide-refresh-cw",{"title":142,"path":143,"stem":144,"icon":145},"Multi-Account","/guides/multi-account","4.guides/5.multi-account","i-lucide-users",{"title":147,"path":148,"stem":149,"icon":150},"Route Protection","/guides/route-protection","4.guides/6.route-protection","i-lucide-lock",{"title":152,"path":153,"stem":154,"icon":63},"Custom Provider","/guides/custom-provider","4.guides/7.custom-provider",{"title":156,"path":157,"stem":158,"icon":73},"Custom Storage","/guides/custom-storage","4.guides/8.custom-storage",{"title":160,"path":161,"stem":162,"icon":163},"Testing","/guides/testing","4.guides/9.testing","i-lucide-flask-conical",{"title":165,"path":166,"stem":167,"children":168,"page":6},"Flutter","/flutter","5.flutter",[169,173,178,183,188],{"title":170,"path":171,"stem":172},"Flutter Setup","/flutter/setup","5.flutter/1.setup",{"title":174,"path":175,"stem":176,"icon":177},"Secure Storage","/flutter/secure-storage","5.flutter/2.secure-storage","i-lucide-vault",{"title":179,"path":180,"stem":181,"icon":182},"Widgets","/flutter/widgets","5.flutter/3.widgets","i-lucide-layout",{"title":184,"path":185,"stem":186,"icon":187},"Router Guard","/flutter/router-guard","5.flutter/4.router-guard","i-lucide-signpost",{"title":189,"path":190,"stem":191,"icon":192},"App Binding","/flutter/app-binding","5.flutter/5.app-binding","i-lucide-cpu",{"title":194,"path":195,"stem":196,"children":197,"page":6},"API Reference","/api-reference","6.api-reference",[198,202,206,211,216,221,225,230],{"title":199,"path":200,"stem":201},"AuthyraClient","/api-reference/authyra-client","6.api-reference/1.authyra-client",{"title":203,"path":204,"stem":205},"AuthyraInstance","/api-reference/authyra-instance","6.api-reference/2.authyra-instance",{"title":207,"path":208,"stem":209,"icon":210},"AccountManager","/api-reference/account-manager","6.api-reference/3.account-manager","i-lucide-users-round",{"title":212,"path":213,"stem":214,"icon":215},"AuthProvider","/api-reference/auth-provider","6.api-reference/4.auth-provider","i-lucide-plug-zap",{"title":217,"path":218,"stem":219,"icon":220},"AuthStorage","/api-reference/auth-storage","6.api-reference/5.auth-storage","i-lucide-hard-drive",{"title":222,"path":223,"stem":224,"icon":68},"AuthSession","/api-reference/auth-session","6.api-reference/6.auth-session",{"title":226,"path":227,"stem":228,"icon":229},"AuthState","/api-reference/auth-state","6.api-reference/7.auth-state","i-lucide-toggle-right",{"title":231,"path":232,"stem":233,"icon":234},"Exceptions","/api-reference/auth-exceptions","6.api-reference/8.auth-exceptions","i-lucide-triangle-alert",{"title":236,"path":237,"stem":238,"children":239,"page":6},"Examples","/examples","7.examples",[240,244,249],{"title":241,"path":242,"stem":243},"Flutter App Example","/examples/flutter-app","7.examples/1.flutter-app",{"title":245,"path":246,"stem":247,"icon":248},"Dart Backend","/examples/dart-backend","7.examples/2.dart-backend","i-lucide-server",{"title":250,"path":251,"stem":252,"icon":163},"Testing Setup","/examples/testing-setup","7.examples/3.testing-setup",{"title":254,"path":255,"stem":256},"Troubleshooting","/troubleshooting","8.troubleshooting",{"title":258,"path":259,"stem":260},"FAQ","/faq","9.faq",{"title":262,"path":263,"stem":264},"Changelog","/changelog","changelog",{"id":266,"title":170,"body":267,"description":2310,"extension":2311,"links":2312,"meta":2313,"navigation":456,"path":171,"seo":2314,"stem":172,"__hash__":2317},"docs/5.flutter/1.setup.md",{"type":268,"value":269,"toc":2292},"minimark",[270,282,322,325,330,366,385,388,407,409,413,428,909,914,916,920,933,958,963,980,998,1000,1004,1007,1018,1023,1028,1105,1109,1124,1349,1353,1356,1364,1401,1409,1459,1461,1465,1479,1785,1804,1806,1810,1814,2008,2012,2105,2109,2189,2191,2195,2198,2260,2262,2266,2288],[271,272,273,277,278,281],"p",{},[274,275,276],"code",{},"authyra_flutter"," is the Flutter layer of Authyra. It re-exports the entire ",[274,279,280],{},"authyra"," core and adds:",[283,284,285,306,316],"ul",{},[286,287,288,289,292,293,292,296,292,299,292,302,305],"li",{},"OAuth2 providers (",[274,290,291],{},"GoogleProvider",", ",[274,294,295],{},"GitHubOAuth2Provider",[274,297,298],{},"AppleProvider",[274,300,301],{},"OAuth2Provider",[274,303,304],{},"ProxyOAuthProvider",")",[286,307,308,311,312,315],{},[274,309,310],{},"SecureAuthStorage"," — ready-to-use ",[274,313,314],{},"flutter_secure_storage"," implementation",[286,317,318,321],{},[274,319,320],{},"OAuth2CallbackHandler"," — deep-link router for OAuth redirects",[323,324],"hr",{},[326,327,329],"h2",{"id":328},"_1-install","1. Install",[331,332,338],"pre",{"className":333,"code":334,"filename":335,"language":336,"meta":337,"style":337},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dependencies:\n  authyra_flutter: ^0.1.0\n","pubspec.yaml","yaml","",[274,339,340,353],{"__ignoreMap":337},[341,342,345,349],"span",{"class":343,"line":344},"line",1,[341,346,348],{"class":347},"swJcz","dependencies",[341,350,352],{"class":351},"sMK4o",":\n",[341,354,356,359,362],{"class":343,"line":355},2,[341,357,358],{"class":347},"  authyra_flutter",[341,360,361],{"class":351},":",[341,363,365],{"class":364},"sfazB"," ^0.1.0\n",[331,367,371],{"className":368,"code":369,"language":370,"meta":337,"style":337},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","flutter pub get\n","bash",[274,372,373],{"__ignoreMap":337},[341,374,375,379,382],{"class":343,"line":344},[341,376,378],{"class":377},"sBMFI","flutter",[341,380,381],{"class":364}," pub",[341,383,384],{"class":364}," get\n",[271,386,387],{},"One import covers everything:",[331,389,393],{"className":390,"code":391,"language":392,"meta":337,"style":337},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import 'package:authyra_flutter/authyra_flutter.dart';\n","dart",[274,394,395],{"__ignoreMap":337},[341,396,397,401,404],{"class":343,"line":344},[341,398,400],{"class":399},"sbssI","import",[341,402,403],{"class":364}," 'package:authyra_flutter/authyra_flutter.dart'",[341,405,406],{"class":351},";\n",[323,408],{},[326,410,412],{"id":411},"_2-initialize-at-app-startup","2. Initialize at app startup",[271,414,415,416,419,420,423,424,427],{},"Call ",[274,417,418],{},"Authyra.initialize"," before ",[274,421,422],{},"runApp",". This loads any session persisted from a previous run and makes ",[274,425,426],{},"Authyra.instance"," available throughout the app.",[331,429,432],{"className":390,"code":430,"filename":431,"language":392,"meta":337,"style":337},"import 'package:authyra_flutter/authyra_flutter.dart';\nimport 'package:flutter/material.dart';\n\nvoid main() async {\n  WidgetsFlutterBinding.ensureInitialized();\n\n  await Authyra.initialize(\n    client: AuthyraClient(\n      providers: [\n        CredentialsProvider.withTokens(\n          id: 'email',\n          authorize: (creds) async {\n            // call your backend\n            final res = await myApi.post('/auth/login', body: creds);\n            if (res.statusCode != 200) return null;\n            return AuthSignInResult(\n              user: AuthUser(id: res.data['id'], email: res.data['email']),\n              accessToken:  res.data['accessToken'],\n              refreshToken: res.data['refreshToken'],\n              expiresAt:    DateTime.parse(res.data['expiresAt']),\n            );\n          },\n        ),\n        GoogleProvider(clientId: 'YOUR_GOOGLE_CLIENT_ID'),\n      ],\n      storage: SecureAuthStorage(),\n    ),\n  );\n\n  runApp(const MyApp());\n}\n","lib/main.dart",[274,433,434,442,451,458,480,497,502,519,532,543,556,570,585,592,634,663,674,725,747,768,798,806,814,822,840,848,863,871,879,884,903],{"__ignoreMap":337},[341,435,436,438,440],{"class":343,"line":344},[341,437,400],{"class":399},[341,439,403],{"class":364},[341,441,406],{"class":351},[341,443,444,446,449],{"class":343,"line":355},[341,445,400],{"class":399},[341,447,448],{"class":364}," 'package:flutter/material.dart'",[341,450,406],{"class":351},[341,452,454],{"class":343,"line":453},3,[341,455,457],{"emptyLinePlaceholder":456},true,"\n",[341,459,461,465,469,473,477],{"class":343,"line":460},4,[341,462,464],{"class":463},"spNyl","void",[341,466,468],{"class":467},"s2Zo4"," main",[341,470,472],{"class":471},"sTEyZ","() ",[341,474,476],{"class":475},"s7zQu","async",[341,478,479],{"class":471}," {\n",[341,481,483,486,489,492,495],{"class":343,"line":482},5,[341,484,485],{"class":377},"  WidgetsFlutterBinding",[341,487,488],{"class":351},".",[341,490,491],{"class":467},"ensureInitialized",[341,493,494],{"class":471},"()",[341,496,406],{"class":351},[341,498,500],{"class":343,"line":499},6,[341,501,457],{"emptyLinePlaceholder":456},[341,503,505,508,511,513,516],{"class":343,"line":504},7,[341,506,507],{"class":475},"  await",[341,509,510],{"class":377}," Authyra",[341,512,488],{"class":351},[341,514,515],{"class":467},"initialize",[341,517,518],{"class":471},"(\n",[341,520,522,525,527,530],{"class":343,"line":521},8,[341,523,524],{"class":471},"    client",[341,526,361],{"class":351},[341,528,529],{"class":377}," AuthyraClient",[341,531,518],{"class":471},[341,533,535,538,540],{"class":343,"line":534},9,[341,536,537],{"class":471},"      providers",[341,539,361],{"class":351},[341,541,542],{"class":471}," [\n",[341,544,546,549,551,554],{"class":343,"line":545},10,[341,547,548],{"class":377},"        CredentialsProvider",[341,550,488],{"class":351},[341,552,553],{"class":467},"withTokens",[341,555,518],{"class":471},[341,557,559,562,564,567],{"class":343,"line":558},11,[341,560,561],{"class":471},"          id",[341,563,361],{"class":351},[341,565,566],{"class":364}," 'email'",[341,568,569],{"class":351},",\n",[341,571,573,576,578,581,583],{"class":343,"line":572},12,[341,574,575],{"class":471},"          authorize",[341,577,361],{"class":351},[341,579,580],{"class":471}," (creds) ",[341,582,476],{"class":475},[341,584,479],{"class":471},[341,586,588],{"class":343,"line":587},13,[341,589,591],{"class":590},"sHwdD","            // call your backend\n",[341,593,595,598,601,604,607,610,612,615,618,621,624,627,629,632],{"class":343,"line":594},14,[341,596,597],{"class":463},"            final",[341,599,600],{"class":471}," res ",[341,602,603],{"class":351},"=",[341,605,606],{"class":475}," await",[341,608,609],{"class":471}," myApi",[341,611,488],{"class":351},[341,613,614],{"class":467},"post",[341,616,617],{"class":471},"(",[341,619,620],{"class":364},"'/auth/login'",[341,622,623],{"class":351},",",[341,625,626],{"class":471}," body",[341,628,361],{"class":351},[341,630,631],{"class":471}," creds)",[341,633,406],{"class":351},[341,635,637,640,643,645,648,651,654,657,660],{"class":343,"line":636},15,[341,638,639],{"class":475},"            if",[341,641,642],{"class":471}," (res",[341,644,488],{"class":351},[341,646,647],{"class":471},"statusCode ",[341,649,650],{"class":351},"!=",[341,652,653],{"class":399}," 200",[341,655,656],{"class":471},") ",[341,658,659],{"class":475},"return",[341,661,662],{"class":351}," null;\n",[341,664,666,669,672],{"class":343,"line":665},16,[341,667,668],{"class":475},"            return",[341,670,671],{"class":377}," AuthSignInResult",[341,673,518],{"class":471},[341,675,677,680,682,685,688,690,693,695,698,701,704,706,709,711,713,715,717,720,723],{"class":343,"line":676},17,[341,678,679],{"class":471},"              user",[341,681,361],{"class":351},[341,683,684],{"class":377}," AuthUser",[341,686,687],{"class":471},"(id",[341,689,361],{"class":351},[341,691,692],{"class":471}," res",[341,694,488],{"class":351},[341,696,697],{"class":471},"data[",[341,699,700],{"class":364},"'id'",[341,702,703],{"class":471},"]",[341,705,623],{"class":351},[341,707,708],{"class":471}," email",[341,710,361],{"class":351},[341,712,692],{"class":471},[341,714,488],{"class":351},[341,716,697],{"class":471},[341,718,719],{"class":364},"'email'",[341,721,722],{"class":471},"])",[341,724,569],{"class":351},[341,726,728,731,733,736,738,740,743,745],{"class":343,"line":727},18,[341,729,730],{"class":471},"              accessToken",[341,732,361],{"class":351},[341,734,735],{"class":471},"  res",[341,737,488],{"class":351},[341,739,697],{"class":471},[341,741,742],{"class":364},"'accessToken'",[341,744,703],{"class":471},[341,746,569],{"class":351},[341,748,750,753,755,757,759,761,764,766],{"class":343,"line":749},19,[341,751,752],{"class":471},"              refreshToken",[341,754,361],{"class":351},[341,756,692],{"class":471},[341,758,488],{"class":351},[341,760,697],{"class":471},[341,762,763],{"class":364},"'refreshToken'",[341,765,703],{"class":471},[341,767,569],{"class":351},[341,769,771,774,776,779,781,784,787,789,791,794,796],{"class":343,"line":770},20,[341,772,773],{"class":471},"              expiresAt",[341,775,361],{"class":351},[341,777,778],{"class":377},"    DateTime",[341,780,488],{"class":351},[341,782,783],{"class":467},"parse",[341,785,786],{"class":471},"(res",[341,788,488],{"class":351},[341,790,697],{"class":471},[341,792,793],{"class":364},"'expiresAt'",[341,795,722],{"class":471},[341,797,569],{"class":351},[341,799,801,804],{"class":343,"line":800},21,[341,802,803],{"class":471},"            )",[341,805,406],{"class":351},[341,807,809,812],{"class":343,"line":808},22,[341,810,811],{"class":471},"          }",[341,813,569],{"class":351},[341,815,817,820],{"class":343,"line":816},23,[341,818,819],{"class":471},"        )",[341,821,569],{"class":351},[341,823,825,828,831,833,836,838],{"class":343,"line":824},24,[341,826,827],{"class":377},"        GoogleProvider",[341,829,830],{"class":471},"(clientId",[341,832,361],{"class":351},[341,834,835],{"class":364}," 'YOUR_GOOGLE_CLIENT_ID'",[341,837,305],{"class":471},[341,839,569],{"class":351},[341,841,843,846],{"class":343,"line":842},25,[341,844,845],{"class":471},"      ]",[341,847,569],{"class":351},[341,849,851,854,856,859,861],{"class":343,"line":850},26,[341,852,853],{"class":471},"      storage",[341,855,361],{"class":351},[341,857,858],{"class":377}," SecureAuthStorage",[341,860,494],{"class":471},[341,862,569],{"class":351},[341,864,866,869],{"class":343,"line":865},27,[341,867,868],{"class":471},"    )",[341,870,569],{"class":351},[341,872,874,877],{"class":343,"line":873},28,[341,875,876],{"class":471},"  )",[341,878,406],{"class":351},[341,880,882],{"class":343,"line":881},29,[341,883,457],{"emptyLinePlaceholder":456},[341,885,887,890,892,895,898,901],{"class":343,"line":886},30,[341,888,889],{"class":467},"  runApp",[341,891,617],{"class":471},[341,893,894],{"class":463},"const",[341,896,897],{"class":377}," MyApp",[341,899,900],{"class":471},"())",[341,902,406],{"class":351},[341,904,906],{"class":343,"line":905},31,[341,907,908],{"class":471},"}\n",[271,910,911,913],{},[274,912,418],{}," is idempotent — calling it a second time returns the existing instance unchanged.",[323,915],{},[326,917,919],{"id":918},"_3-configure-secureauthstorage","3. Configure SecureAuthStorage",[271,921,922,924,925,361],{},[274,923,310],{}," wraps ",[926,927,931],"a",{"href":928,"rel":929},"https://pub.dev/packages/flutter_secure_storage",[930],"nofollow",[274,932,314],{},[283,934,935,942,948],{},[286,936,937,941],{},[938,939,940],"strong",{},"iOS / macOS"," → Keychain",[286,943,944,947],{},[938,945,946],{},"Android"," → Keystore (EncryptedSharedPreferences)",[286,949,950,953,954,957],{},[938,951,952],{},"Web"," → ",[274,955,956],{},"localStorage"," with Web Crypto encryption",[271,959,960,961,361],{},"No configuration needed beyond passing it to ",[274,962,199],{},[331,964,966],{"className":390,"code":965,"language":392,"meta":337,"style":337},"storage: SecureAuthStorage()\n",[274,967,968],{"__ignoreMap":337},[341,969,970,973,975,977],{"class":343,"line":344},[341,971,972],{"class":471},"storage",[341,974,361],{"class":351},[341,976,858],{"class":377},[341,978,979],{"class":471},"()\n",[981,982,984,985,988,989,991,992,994,995,997],"callout",{"icon":983},"i-lucide-shield","Never use ",[274,986,987],{},"SharedPreferences"," or plain ",[274,990,956],{}," for token storage — they are not encrypted. Always use ",[274,993,310],{}," (or your own encrypted implementation of ",[274,996,217],{},") in production.",[323,999],{},[326,1001,1003],{"id":1002},"_4-wire-oauth2-deep-links","4. Wire OAuth2 deep links",[271,1005,1006],{},"OAuth2 providers redirect back to your app via a custom URI scheme after the user authenticates. You need to:",[1008,1009,1010,1015],"ol",{},[286,1011,1012,1013],{},"Register each provider with ",[274,1014,320],{},[286,1016,1017],{},"Forward matching deep links from your link handler",[1019,1020,1022],"h3",{"id":1021},"register-providers","Register providers",[271,1024,1025,1026,361],{},"Do this once, before or alongside ",[274,1027,418],{},[331,1029,1031],{"className":390,"code":1030,"language":392,"meta":337,"style":337},"// Register each provider under the URI scheme it handles\nOAuth2CallbackHandler.registerProvider(\n  'com.googleusercontent.apps.YOUR_CLIENT_ID', // Google's reverse client ID\n  googleProvider,\n);\nOAuth2CallbackHandler.registerProvider(\n  'myapp', // your custom scheme for GitHub, etc.\n  githubProvider,\n);\n",[274,1032,1033,1038,1049,1059,1066,1072,1082,1092,1099],{"__ignoreMap":337},[341,1034,1035],{"class":343,"line":344},[341,1036,1037],{"class":590},"// Register each provider under the URI scheme it handles\n",[341,1039,1040,1042,1044,1047],{"class":343,"line":355},[341,1041,320],{"class":377},[341,1043,488],{"class":351},[341,1045,1046],{"class":467},"registerProvider",[341,1048,518],{"class":471},[341,1050,1051,1054,1056],{"class":343,"line":453},[341,1052,1053],{"class":364},"  'com.googleusercontent.apps.YOUR_CLIENT_ID'",[341,1055,623],{"class":351},[341,1057,1058],{"class":590}," // Google's reverse client ID\n",[341,1060,1061,1064],{"class":343,"line":460},[341,1062,1063],{"class":471},"  googleProvider",[341,1065,569],{"class":351},[341,1067,1068,1070],{"class":343,"line":482},[341,1069,305],{"class":471},[341,1071,406],{"class":351},[341,1073,1074,1076,1078,1080],{"class":343,"line":499},[341,1075,320],{"class":377},[341,1077,488],{"class":351},[341,1079,1046],{"class":467},[341,1081,518],{"class":471},[341,1083,1084,1087,1089],{"class":343,"line":504},[341,1085,1086],{"class":364},"  'myapp'",[341,1088,623],{"class":351},[341,1090,1091],{"class":590}," // your custom scheme for GitHub, etc.\n",[341,1093,1094,1097],{"class":343,"line":521},[341,1095,1096],{"class":471},"  githubProvider",[341,1098,569],{"class":351},[341,1100,1101,1103],{"class":343,"line":534},[341,1102,305],{"class":471},[341,1104,406],{"class":351},[1019,1106,1108],{"id":1107},"forward-deep-links","Forward deep links",[271,1110,1111,1112,1119,1120,1123],{},"Use ",[926,1113,1116],{"href":1114,"rel":1115},"https://pub.dev/packages/app_links",[930],[274,1117,1118],{},"app_links"," (or ",[274,1121,1122],{},"uni_links",") to receive incoming URIs and pass them to the handler:",[331,1125,1127],{"className":390,"code":1126,"filename":431,"language":392,"meta":337,"style":337},"import 'package:app_links/app_links.dart';\n\nvoid main() async {\n  WidgetsFlutterBinding.ensureInitialized();\n\n  // Wire OAuth2 callback handler before Authyra.initialize\n  final googleProvider = GoogleProvider(clientId: 'YOUR_GOOGLE_CLIENT_ID');\n  OAuth2CallbackHandler.registerProvider(\n    'com.googleusercontent.apps.YOUR_CLIENT_ID',\n    googleProvider,\n  );\n\n  // Forward all incoming links to Authyra's handler\n  AppLinks().uriLinkStream.listen(OAuth2CallbackHandler.handleCallback);\n\n  await Authyra.initialize(\n    client: AuthyraClient(\n      providers: [googleProvider],\n      storage: SecureAuthStorage(),\n    ),\n  );\n\n  runApp(const MyApp());\n}\n",[274,1128,1129,1138,1142,1154,1166,1170,1175,1198,1209,1216,1223,1229,1233,1238,1266,1270,1282,1292,1303,1315,1321,1327,1331,1345],{"__ignoreMap":337},[341,1130,1131,1133,1136],{"class":343,"line":344},[341,1132,400],{"class":399},[341,1134,1135],{"class":364}," 'package:app_links/app_links.dart'",[341,1137,406],{"class":351},[341,1139,1140],{"class":343,"line":355},[341,1141,457],{"emptyLinePlaceholder":456},[341,1143,1144,1146,1148,1150,1152],{"class":343,"line":453},[341,1145,464],{"class":463},[341,1147,468],{"class":467},[341,1149,472],{"class":471},[341,1151,476],{"class":475},[341,1153,479],{"class":471},[341,1155,1156,1158,1160,1162,1164],{"class":343,"line":460},[341,1157,485],{"class":377},[341,1159,488],{"class":351},[341,1161,491],{"class":467},[341,1163,494],{"class":471},[341,1165,406],{"class":351},[341,1167,1168],{"class":343,"line":482},[341,1169,457],{"emptyLinePlaceholder":456},[341,1171,1172],{"class":343,"line":499},[341,1173,1174],{"class":590},"  // Wire OAuth2 callback handler before Authyra.initialize\n",[341,1176,1177,1180,1183,1185,1188,1190,1192,1194,1196],{"class":343,"line":504},[341,1178,1179],{"class":463},"  final",[341,1181,1182],{"class":471}," googleProvider ",[341,1184,603],{"class":351},[341,1186,1187],{"class":377}," GoogleProvider",[341,1189,830],{"class":471},[341,1191,361],{"class":351},[341,1193,835],{"class":364},[341,1195,305],{"class":471},[341,1197,406],{"class":351},[341,1199,1200,1203,1205,1207],{"class":343,"line":521},[341,1201,1202],{"class":377},"  OAuth2CallbackHandler",[341,1204,488],{"class":351},[341,1206,1046],{"class":467},[341,1208,518],{"class":471},[341,1210,1211,1214],{"class":343,"line":534},[341,1212,1213],{"class":364},"    'com.googleusercontent.apps.YOUR_CLIENT_ID'",[341,1215,569],{"class":351},[341,1217,1218,1221],{"class":343,"line":545},[341,1219,1220],{"class":471},"    googleProvider",[341,1222,569],{"class":351},[341,1224,1225,1227],{"class":343,"line":558},[341,1226,876],{"class":471},[341,1228,406],{"class":351},[341,1230,1231],{"class":343,"line":572},[341,1232,457],{"emptyLinePlaceholder":456},[341,1234,1235],{"class":343,"line":587},[341,1236,1237],{"class":590},"  // Forward all incoming links to Authyra's handler\n",[341,1239,1240,1243,1245,1247,1250,1252,1255,1257,1259,1261,1264],{"class":343,"line":594},[341,1241,1242],{"class":377},"  AppLinks",[341,1244,494],{"class":471},[341,1246,488],{"class":351},[341,1248,1249],{"class":471},"uriLinkStream",[341,1251,488],{"class":351},[341,1253,1254],{"class":467},"listen",[341,1256,617],{"class":471},[341,1258,320],{"class":377},[341,1260,488],{"class":351},[341,1262,1263],{"class":471},"handleCallback)",[341,1265,406],{"class":351},[341,1267,1268],{"class":343,"line":636},[341,1269,457],{"emptyLinePlaceholder":456},[341,1271,1272,1274,1276,1278,1280],{"class":343,"line":665},[341,1273,507],{"class":475},[341,1275,510],{"class":377},[341,1277,488],{"class":351},[341,1279,515],{"class":467},[341,1281,518],{"class":471},[341,1283,1284,1286,1288,1290],{"class":343,"line":676},[341,1285,524],{"class":471},[341,1287,361],{"class":351},[341,1289,529],{"class":377},[341,1291,518],{"class":471},[341,1293,1294,1296,1298,1301],{"class":343,"line":727},[341,1295,537],{"class":471},[341,1297,361],{"class":351},[341,1299,1300],{"class":471}," [googleProvider]",[341,1302,569],{"class":351},[341,1304,1305,1307,1309,1311,1313],{"class":343,"line":749},[341,1306,853],{"class":471},[341,1308,361],{"class":351},[341,1310,858],{"class":377},[341,1312,494],{"class":471},[341,1314,569],{"class":351},[341,1316,1317,1319],{"class":343,"line":770},[341,1318,868],{"class":471},[341,1320,569],{"class":351},[341,1322,1323,1325],{"class":343,"line":800},[341,1324,876],{"class":471},[341,1326,406],{"class":351},[341,1328,1329],{"class":343,"line":808},[341,1330,457],{"emptyLinePlaceholder":456},[341,1332,1333,1335,1337,1339,1341,1343],{"class":343,"line":816},[341,1334,889],{"class":467},[341,1336,617],{"class":471},[341,1338,894],{"class":463},[341,1340,897],{"class":377},[341,1342,900],{"class":471},[341,1344,406],{"class":351},[341,1346,1347],{"class":343,"line":824},[341,1348,908],{"class":471},[1019,1350,1352],{"id":1351},"platform-deep-link-configuration","Platform deep-link configuration",[271,1354,1355],{},"You must also register the custom URI scheme in your platform manifests:",[271,1357,1358,1360,1361,361],{},[938,1359,946],{}," — ",[274,1362,1363],{},"android/app/src/main/AndroidManifest.xml",[331,1365,1369],{"className":1366,"code":1367,"language":1368,"meta":337,"style":337},"language-xml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cintent-filter>\n  \u003Caction android:name=\"android.intent.action.VIEW\" />\n  \u003Ccategory android:name=\"android.intent.category.DEFAULT\" />\n  \u003Ccategory android:name=\"android.intent.category.BROWSABLE\" />\n  \u003Cdata android:scheme=\"com.googleusercontent.apps.YOUR_CLIENT_ID\" />\n\u003C/intent-filter>\n","xml",[274,1370,1371,1376,1381,1386,1391,1396],{"__ignoreMap":337},[341,1372,1373],{"class":343,"line":344},[341,1374,1375],{},"\u003Cintent-filter>\n",[341,1377,1378],{"class":343,"line":355},[341,1379,1380],{},"  \u003Caction android:name=\"android.intent.action.VIEW\" />\n",[341,1382,1383],{"class":343,"line":453},[341,1384,1385],{},"  \u003Ccategory android:name=\"android.intent.category.DEFAULT\" />\n",[341,1387,1388],{"class":343,"line":460},[341,1389,1390],{},"  \u003Ccategory android:name=\"android.intent.category.BROWSABLE\" />\n",[341,1392,1393],{"class":343,"line":482},[341,1394,1395],{},"  \u003Cdata android:scheme=\"com.googleusercontent.apps.YOUR_CLIENT_ID\" />\n",[341,1397,1398],{"class":343,"line":499},[341,1399,1400],{},"\u003C/intent-filter>\n",[271,1402,1403,1360,1406,361],{},[938,1404,1405],{},"iOS",[274,1407,1408],{},"ios/Runner/Info.plist",[331,1410,1412],{"className":1366,"code":1411,"language":1368,"meta":337,"style":337},"\u003Ckey>CFBundleURLTypes\u003C/key>\n\u003Carray>\n  \u003Cdict>\n    \u003Ckey>CFBundleURLSchemes\u003C/key>\n    \u003Carray>\n      \u003Cstring>com.googleusercontent.apps.YOUR_CLIENT_ID\u003C/string>\n    \u003C/array>\n  \u003C/dict>\n\u003C/array>\n",[274,1413,1414,1419,1424,1429,1434,1439,1444,1449,1454],{"__ignoreMap":337},[341,1415,1416],{"class":343,"line":344},[341,1417,1418],{},"\u003Ckey>CFBundleURLTypes\u003C/key>\n",[341,1420,1421],{"class":343,"line":355},[341,1422,1423],{},"\u003Carray>\n",[341,1425,1426],{"class":343,"line":453},[341,1427,1428],{},"  \u003Cdict>\n",[341,1430,1431],{"class":343,"line":460},[341,1432,1433],{},"    \u003Ckey>CFBundleURLSchemes\u003C/key>\n",[341,1435,1436],{"class":343,"line":482},[341,1437,1438],{},"    \u003Carray>\n",[341,1440,1441],{"class":343,"line":499},[341,1442,1443],{},"      \u003Cstring>com.googleusercontent.apps.YOUR_CLIENT_ID\u003C/string>\n",[341,1445,1446],{"class":343,"line":504},[341,1447,1448],{},"    \u003C/array>\n",[341,1450,1451],{"class":343,"line":521},[341,1452,1453],{},"  \u003C/dict>\n",[341,1455,1456],{"class":343,"line":534},[341,1457,1458],{},"\u003C/array>\n",[323,1460],{},[326,1462,1464],{"id":1463},"_5-connect-to-gorouter","5. Connect to GoRouter",[271,1466,1467,1470,1471,1474,1475,1478],{},[274,1468,1469],{},"authStateChanges"," is a ",[274,1472,1473],{},"Stream\u003CAuthState>"," — wire it to GoRouter's ",[274,1476,1477],{},"refreshListenable"," for automatic redirects:",[331,1480,1483],{"className":390,"code":1481,"filename":1482,"language":392,"meta":337,"style":337},"import 'package:authyra_flutter/authyra_flutter.dart';\nimport 'package:go_router/go_router.dart';\n\nfinal router = GoRouter(\n  refreshListenable: StreamToListenable(Authyra.instance.authStateChanges),\n  redirect: (context, state) {\n    final authenticated = Authyra.instance.isAuthenticated;\n    final goingToLogin  = state.uri.path.startsWith('/login');\n\n    if (!authenticated && !goingToLogin) return '/login';\n    if (authenticated  &&  goingToLogin) return '/home';\n    return null;\n  },\n  routes: [\n    GoRoute(path: '/login', builder: (_, __) => const LoginPage()),\n    GoRoute(path: '/home',  builder: (_, __) => const HomePage()),\n  ],\n);\n","lib/router.dart",[274,1484,1485,1493,1502,1506,1521,1548,1563,1586,1622,1626,1656,1675,1682,1689,1698,1738,1772,1779],{"__ignoreMap":337},[341,1486,1487,1489,1491],{"class":343,"line":344},[341,1488,400],{"class":399},[341,1490,403],{"class":364},[341,1492,406],{"class":351},[341,1494,1495,1497,1500],{"class":343,"line":355},[341,1496,400],{"class":399},[341,1498,1499],{"class":364}," 'package:go_router/go_router.dart'",[341,1501,406],{"class":351},[341,1503,1504],{"class":343,"line":453},[341,1505,457],{"emptyLinePlaceholder":456},[341,1507,1508,1511,1514,1516,1519],{"class":343,"line":460},[341,1509,1510],{"class":463},"final",[341,1512,1513],{"class":471}," router ",[341,1515,603],{"class":351},[341,1517,1518],{"class":377}," GoRouter",[341,1520,518],{"class":471},[341,1522,1523,1526,1528,1531,1533,1536,1538,1541,1543,1546],{"class":343,"line":482},[341,1524,1525],{"class":471},"  refreshListenable",[341,1527,361],{"class":351},[341,1529,1530],{"class":377}," StreamToListenable",[341,1532,617],{"class":471},[341,1534,1535],{"class":377},"Authyra",[341,1537,488],{"class":351},[341,1539,1540],{"class":471},"instance",[341,1542,488],{"class":351},[341,1544,1545],{"class":471},"authStateChanges)",[341,1547,569],{"class":351},[341,1549,1550,1553,1555,1558,1560],{"class":343,"line":499},[341,1551,1552],{"class":471},"  redirect",[341,1554,361],{"class":351},[341,1556,1557],{"class":471}," (context",[341,1559,623],{"class":351},[341,1561,1562],{"class":471}," state) {\n",[341,1564,1565,1568,1571,1573,1575,1577,1579,1581,1584],{"class":343,"line":504},[341,1566,1567],{"class":463},"    final",[341,1569,1570],{"class":471}," authenticated ",[341,1572,603],{"class":351},[341,1574,510],{"class":377},[341,1576,488],{"class":351},[341,1578,1540],{"class":471},[341,1580,488],{"class":351},[341,1582,1583],{"class":471},"isAuthenticated",[341,1585,406],{"class":351},[341,1587,1588,1590,1593,1595,1598,1600,1603,1605,1608,1610,1613,1615,1618,1620],{"class":343,"line":521},[341,1589,1567],{"class":463},[341,1591,1592],{"class":471}," goingToLogin  ",[341,1594,603],{"class":351},[341,1596,1597],{"class":471}," state",[341,1599,488],{"class":351},[341,1601,1602],{"class":471},"uri",[341,1604,488],{"class":351},[341,1606,1607],{"class":471},"path",[341,1609,488],{"class":351},[341,1611,1612],{"class":467},"startsWith",[341,1614,617],{"class":471},[341,1616,1617],{"class":364},"'/login'",[341,1619,305],{"class":471},[341,1621,406],{"class":351},[341,1623,1624],{"class":343,"line":534},[341,1625,457],{"emptyLinePlaceholder":456},[341,1627,1628,1631,1634,1637,1640,1643,1646,1649,1651,1654],{"class":343,"line":545},[341,1629,1630],{"class":475},"    if",[341,1632,1633],{"class":471}," (",[341,1635,1636],{"class":351},"!",[341,1638,1639],{"class":471},"authenticated ",[341,1641,1642],{"class":351},"&&",[341,1644,1645],{"class":351}," !",[341,1647,1648],{"class":471},"goingToLogin) ",[341,1650,659],{"class":475},[341,1652,1653],{"class":364}," '/login'",[341,1655,406],{"class":351},[341,1657,1658,1660,1663,1665,1668,1670,1673],{"class":343,"line":558},[341,1659,1630],{"class":475},[341,1661,1662],{"class":471}," (authenticated  ",[341,1664,1642],{"class":351},[341,1666,1667],{"class":471},"  goingToLogin) ",[341,1669,659],{"class":475},[341,1671,1672],{"class":364}," '/home'",[341,1674,406],{"class":351},[341,1676,1677,1680],{"class":343,"line":572},[341,1678,1679],{"class":475},"    return",[341,1681,662],{"class":351},[341,1683,1684,1687],{"class":343,"line":587},[341,1685,1686],{"class":471},"  }",[341,1688,569],{"class":351},[341,1690,1691,1694,1696],{"class":343,"line":594},[341,1692,1693],{"class":471},"  routes",[341,1695,361],{"class":351},[341,1697,542],{"class":471},[341,1699,1700,1703,1706,1708,1710,1712,1715,1717,1720,1722,1725,1728,1731,1734,1736],{"class":343,"line":636},[341,1701,1702],{"class":377},"    GoRoute",[341,1704,1705],{"class":471},"(path",[341,1707,361],{"class":351},[341,1709,1653],{"class":364},[341,1711,623],{"class":351},[341,1713,1714],{"class":471}," builder",[341,1716,361],{"class":351},[341,1718,1719],{"class":471}," (_",[341,1721,623],{"class":351},[341,1723,1724],{"class":471}," __) ",[341,1726,1727],{"class":351},"=>",[341,1729,1730],{"class":463}," const",[341,1732,1733],{"class":377}," LoginPage",[341,1735,900],{"class":471},[341,1737,569],{"class":351},[341,1739,1740,1742,1744,1746,1748,1750,1753,1755,1757,1759,1761,1763,1765,1768,1770],{"class":343,"line":665},[341,1741,1702],{"class":377},[341,1743,1705],{"class":471},[341,1745,361],{"class":351},[341,1747,1672],{"class":364},[341,1749,623],{"class":351},[341,1751,1752],{"class":471},"  builder",[341,1754,361],{"class":351},[341,1756,1719],{"class":471},[341,1758,623],{"class":351},[341,1760,1724],{"class":471},[341,1762,1727],{"class":351},[341,1764,1730],{"class":463},[341,1766,1767],{"class":377}," HomePage",[341,1769,900],{"class":471},[341,1771,569],{"class":351},[341,1773,1774,1777],{"class":343,"line":676},[341,1775,1776],{"class":471},"  ]",[341,1778,569],{"class":351},[341,1780,1781,1783],{"class":343,"line":727},[341,1782,305],{"class":471},[341,1784,406],{"class":351},[981,1786,1788,1791,1792,1795,1796,1799,1800,1803],{"icon":1787},"i-lucide-info",[274,1789,1790],{},"StreamToListenable"," is a small adapter that bridges Dart ",[274,1793,1794],{},"Stream"," to Flutter's ",[274,1797,1798],{},"Listenable"," interface. Implement it yourself or use the one from ",[274,1801,1802],{},"go_router_builder"," or your routing package.",[323,1805],{},[326,1807,1809],{"id":1808},"_6-reactive-ui","6. Reactive UI",[1019,1811,1813],{"id":1812},"streambuilder","StreamBuilder",[331,1815,1817],{"className":390,"code":1816,"language":392,"meta":337,"style":337},"StreamBuilder\u003CAuthState>(\n  stream: Authyra.instance.authStateChanges,\n  builder: (context, snapshot) {\n    final state = snapshot.data ?? AuthState.unauthenticated();\n    return switch (state.type) {\n      AuthStateType.authenticated   => HomePage(user: state.user!),\n      AuthStateType.unauthenticated => const LoginPage(),\n      AuthStateType.error           => ErrorPage(state.error!),\n    };\n  },\n);\n",[274,1818,1819,1831,1850,1863,1895,1910,1942,1961,1989,1996,2002],{"__ignoreMap":337},[341,1820,1821,1823,1826,1828],{"class":343,"line":344},[341,1822,1813],{"class":377},[341,1824,1825],{"class":471},"\u003C",[341,1827,226],{"class":377},[341,1829,1830],{"class":471},">(\n",[341,1832,1833,1836,1838,1840,1842,1844,1846,1848],{"class":343,"line":355},[341,1834,1835],{"class":471},"  stream",[341,1837,361],{"class":351},[341,1839,510],{"class":377},[341,1841,488],{"class":351},[341,1843,1540],{"class":471},[341,1845,488],{"class":351},[341,1847,1469],{"class":471},[341,1849,569],{"class":351},[341,1851,1852,1854,1856,1858,1860],{"class":343,"line":453},[341,1853,1752],{"class":471},[341,1855,361],{"class":351},[341,1857,1557],{"class":471},[341,1859,623],{"class":351},[341,1861,1862],{"class":471}," snapshot) {\n",[341,1864,1865,1867,1870,1872,1875,1877,1880,1883,1886,1888,1891,1893],{"class":343,"line":460},[341,1866,1567],{"class":463},[341,1868,1869],{"class":471}," state ",[341,1871,603],{"class":351},[341,1873,1874],{"class":471}," snapshot",[341,1876,488],{"class":351},[341,1878,1879],{"class":471},"data ",[341,1881,1882],{"class":351},"??",[341,1884,1885],{"class":377}," AuthState",[341,1887,488],{"class":351},[341,1889,1890],{"class":467},"unauthenticated",[341,1892,494],{"class":471},[341,1894,406],{"class":351},[341,1896,1897,1899,1902,1905,1907],{"class":343,"line":482},[341,1898,1679],{"class":475},[341,1900,1901],{"class":475}," switch",[341,1903,1904],{"class":471}," (state",[341,1906,488],{"class":351},[341,1908,1909],{"class":471},"type) {\n",[341,1911,1912,1915,1917,1920,1922,1924,1927,1929,1931,1933,1936,1938,1940],{"class":343,"line":499},[341,1913,1914],{"class":377},"      AuthStateType",[341,1916,488],{"class":351},[341,1918,1919],{"class":471},"authenticated   ",[341,1921,1727],{"class":351},[341,1923,1767],{"class":377},[341,1925,1926],{"class":471},"(user",[341,1928,361],{"class":351},[341,1930,1597],{"class":471},[341,1932,488],{"class":351},[341,1934,1935],{"class":471},"user",[341,1937,1636],{"class":351},[341,1939,305],{"class":471},[341,1941,569],{"class":351},[341,1943,1944,1946,1948,1951,1953,1955,1957,1959],{"class":343,"line":504},[341,1945,1914],{"class":377},[341,1947,488],{"class":351},[341,1949,1950],{"class":471},"unauthenticated ",[341,1952,1727],{"class":351},[341,1954,1730],{"class":463},[341,1956,1733],{"class":377},[341,1958,494],{"class":471},[341,1960,569],{"class":351},[341,1962,1963,1965,1967,1970,1972,1975,1978,1980,1983,1985,1987],{"class":343,"line":521},[341,1964,1914],{"class":377},[341,1966,488],{"class":351},[341,1968,1969],{"class":471},"error           ",[341,1971,1727],{"class":351},[341,1973,1974],{"class":377}," ErrorPage",[341,1976,1977],{"class":471},"(state",[341,1979,488],{"class":351},[341,1981,1982],{"class":471},"error",[341,1984,1636],{"class":351},[341,1986,305],{"class":471},[341,1988,569],{"class":351},[341,1990,1991,1994],{"class":343,"line":534},[341,1992,1993],{"class":471},"    }",[341,1995,406],{"class":351},[341,1997,1998,2000],{"class":343,"line":545},[341,1999,1686],{"class":471},[341,2001,569],{"class":351},[341,2003,2004,2006],{"class":343,"line":558},[341,2005,305],{"class":471},[341,2007,406],{"class":351},[1019,2009,2011],{"id":2010},"riverpod","Riverpod",[331,2013,2015],{"className":390,"code":2014,"language":392,"meta":337,"style":337},"final authStateProvider = StreamProvider\u003CAuthState>((ref) {\n  return Authyra.instance.authStateChanges;\n});\n\n// In a widget:\nfinal state = ref.watch(authStateProvider).value ?? AuthState.unauthenticated();\n",[274,2016,2017,2036,2053,2060,2064,2069],{"__ignoreMap":337},[341,2018,2019,2021,2024,2026,2029,2031,2033],{"class":343,"line":344},[341,2020,1510],{"class":463},[341,2022,2023],{"class":471}," authStateProvider ",[341,2025,603],{"class":351},[341,2027,2028],{"class":377}," StreamProvider",[341,2030,1825],{"class":471},[341,2032,226],{"class":377},[341,2034,2035],{"class":471},">((ref) {\n",[341,2037,2038,2041,2043,2045,2047,2049,2051],{"class":343,"line":355},[341,2039,2040],{"class":475},"  return",[341,2042,510],{"class":377},[341,2044,488],{"class":351},[341,2046,1540],{"class":471},[341,2048,488],{"class":351},[341,2050,1469],{"class":471},[341,2052,406],{"class":351},[341,2054,2055,2058],{"class":343,"line":453},[341,2056,2057],{"class":471},"})",[341,2059,406],{"class":351},[341,2061,2062],{"class":343,"line":460},[341,2063,457],{"emptyLinePlaceholder":456},[341,2065,2066],{"class":343,"line":482},[341,2067,2068],{"class":590},"// In a widget:\n",[341,2070,2071,2073,2075,2077,2080,2082,2085,2088,2090,2093,2095,2097,2099,2101,2103],{"class":343,"line":499},[341,2072,1510],{"class":463},[341,2074,1869],{"class":471},[341,2076,603],{"class":351},[341,2078,2079],{"class":471}," ref",[341,2081,488],{"class":351},[341,2083,2084],{"class":467},"watch",[341,2086,2087],{"class":471},"(authStateProvider)",[341,2089,488],{"class":351},[341,2091,2092],{"class":471},"value ",[341,2094,1882],{"class":351},[341,2096,1885],{"class":377},[341,2098,488],{"class":351},[341,2100,1890],{"class":467},[341,2102,494],{"class":471},[341,2104,406],{"class":351},[1019,2106,2108],{"id":2107},"synchronous-reads-safe-in-build","Synchronous reads (safe in build())",[331,2110,2112],{"className":390,"code":2111,"language":392,"meta":337,"style":337},"final user    = Authyra.instance.currentUser;        // AuthUser?\nfinal isAuth  = Authyra.instance.isAuthenticated;    // bool\nfinal state   = Authyra.instance.currentState;       // AuthState\n",[274,2113,2114,2140,2164],{"__ignoreMap":337},[341,2115,2116,2118,2121,2123,2125,2127,2129,2131,2134,2137],{"class":343,"line":344},[341,2117,1510],{"class":463},[341,2119,2120],{"class":471}," user    ",[341,2122,603],{"class":351},[341,2124,510],{"class":377},[341,2126,488],{"class":351},[341,2128,1540],{"class":471},[341,2130,488],{"class":351},[341,2132,2133],{"class":471},"currentUser",[341,2135,2136],{"class":351},";",[341,2138,2139],{"class":590},"        // AuthUser?\n",[341,2141,2142,2144,2147,2149,2151,2153,2155,2157,2159,2161],{"class":343,"line":355},[341,2143,1510],{"class":463},[341,2145,2146],{"class":471}," isAuth  ",[341,2148,603],{"class":351},[341,2150,510],{"class":377},[341,2152,488],{"class":351},[341,2154,1540],{"class":471},[341,2156,488],{"class":351},[341,2158,1583],{"class":471},[341,2160,2136],{"class":351},[341,2162,2163],{"class":590},"    // bool\n",[341,2165,2166,2168,2171,2173,2175,2177,2179,2181,2184,2186],{"class":343,"line":453},[341,2167,1510],{"class":463},[341,2169,2170],{"class":471}," state   ",[341,2172,603],{"class":351},[341,2174,510],{"class":377},[341,2176,488],{"class":351},[341,2178,1540],{"class":471},[341,2180,488],{"class":351},[341,2182,2183],{"class":471},"currentState",[341,2185,2136],{"class":351},[341,2187,2188],{"class":590},"       // AuthState\n",[323,2190],{},[326,2192,2194],{"id":2193},"_7-teardown-tests-only","7. Teardown (tests only)",[271,2196,2197],{},"In tests, reset the singleton between test cases:",[331,2199,2201],{"className":390,"code":2200,"language":392,"meta":337,"style":337},"tearDown(() async {\n  if (Authyra.isInitialized) {\n    await Authyra.instance.dispose();\n  }\n});\n",[274,2202,2203,2215,2229,2249,2254],{"__ignoreMap":337},[341,2204,2205,2208,2211,2213],{"class":343,"line":344},[341,2206,2207],{"class":467},"tearDown",[341,2209,2210],{"class":471},"(() ",[341,2212,476],{"class":475},[341,2214,479],{"class":471},[341,2216,2217,2220,2222,2224,2226],{"class":343,"line":355},[341,2218,2219],{"class":475},"  if",[341,2221,1633],{"class":471},[341,2223,1535],{"class":377},[341,2225,488],{"class":351},[341,2227,2228],{"class":471},"isInitialized) {\n",[341,2230,2231,2234,2236,2238,2240,2242,2245,2247],{"class":343,"line":453},[341,2232,2233],{"class":475},"    await",[341,2235,510],{"class":377},[341,2237,488],{"class":351},[341,2239,1540],{"class":471},[341,2241,488],{"class":351},[341,2243,2244],{"class":467},"dispose",[341,2246,494],{"class":471},[341,2248,406],{"class":351},[341,2250,2251],{"class":343,"line":460},[341,2252,2253],{"class":471},"  }\n",[341,2255,2256,2258],{"class":343,"line":482},[341,2257,2057],{"class":471},[341,2259,406],{"class":351},[323,2261],{},[326,2263,2265],{"id":2264},"next-steps","Next steps",[283,2267,2268,2273,2278,2283],{},[286,2269,2270],{},[926,2271,2272],{"href":103},"Google Sign-In →",[286,2274,2275],{},[926,2276,2277],{"href":107},"GitHub OAuth →",[286,2279,2280],{},[926,2281,2282],{"href":148},"Route Protection →",[286,2284,2285],{},[926,2286,2287],{"href":242},"Full Flutter App Example →",[2289,2290,2291],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":337,"searchDepth":355,"depth":355,"links":2293},[2294,2295,2296,2297,2302,2303,2308,2309],{"id":328,"depth":355,"text":329},{"id":411,"depth":355,"text":412},{"id":918,"depth":355,"text":919},{"id":1002,"depth":355,"text":1003,"children":2298},[2299,2300,2301],{"id":1021,"depth":453,"text":1022},{"id":1107,"depth":453,"text":1108},{"id":1351,"depth":453,"text":1352},{"id":1463,"depth":355,"text":1464},{"id":1808,"depth":355,"text":1809,"children":2304},[2305,2306,2307],{"id":1812,"depth":453,"text":1813},{"id":2010,"depth":453,"text":2011},{"id":2107,"depth":453,"text":2108},{"id":2193,"depth":355,"text":2194},{"id":2264,"depth":355,"text":2265},"Initialize authyra_flutter, wire OAuth2 deep links, and configure SecureAuthStorage.","md",null,{},{"title":2315,"description":2316},"Flutter Setup | Authyra","Complete setup guide for authyra_flutter — initialization, SecureAuthStorage, OAuth2 deep-link wiring, and GoRouter integration.","OxE872cjz6ZhP2kYzXNHU9rksSUrQYums1Z8TbkjGUw",[2319,2321],{"title":160,"path":161,"stem":162,"description":2320,"icon":163,"children":-1},"Tester l'authentification avec AuthyraClient directement et InMemoryStorage — sans singleton, sans mock.",{"title":174,"path":175,"stem":176,"description":2322,"icon":177,"children":-1},"SecureAuthStorage — stockage chiffré des tokens avec flutter_secure_storage (Keychain, Keystore, Web Crypto).",1782700506039]