[{"data":1,"prerenderedAt":2316},["ShallowReactive",2],{"page-\u002Fdart\u002F13-packages-and-libraries":3},{"id":4,"title":5,"body":6,"description":2309,"extension":2310,"meta":2311,"navigation":67,"path":2312,"seo":2313,"stem":2314,"__hash__":2315},"content\u002Fdart\u002F13-packages-and-libraries.md","Dart — Libraries, Visibility & Package Architecture",{"type":7,"value":8,"toc":2295},"minimark",[9,13,23,1490,1494,1694,1698,1801,1805,1976,1980,1987,2077,2080,2291],[10,11,5],"h1",{"id":12},"dart-libraries-visibility-package-architecture",[14,15,17,18,22],"h2",{"id":16},"library-visibility-the-_-prefix-is-library-level","Library Visibility — The ",[19,20,21],"code",{},"_"," Prefix Is Library-Level",[24,25,27,380,393,627,631,782,786,1130,1134,1292,1296],"code-wrapper",{"language":26},"dart",[28,29,33],"pre",{"className":30,"code":31,"language":26,"meta":32,"style":32},"language-dart shiki shiki-themes github-light github-dark","\u002F\u002F Dart has ONE privacy modifier: the underscore prefix (`_`).\n\u002F\u002F `_name` is library-private — accessible within the same library (file or\n\u002F\u002F files sharing a `library` declaration), NOT from other libraries.\n\u002F\u002F There is NO `public`\u002F`private`\u002F`protected` — no class-private visibility.\n\n\u002F\u002F lib\u002Fsrc\u002Fcache.dart\nclass Cache {\n  final Map\u003CString, _Entry> _entries = {};  \u002F\u002F both _Entry and _entries are private\n  String? _key;  \u002F\u002F private field — accessible from other classes in THIS file\n\n  void put(String key, String value) {\n    _entries[key] = _Entry(value);  \u002F\u002F ✓ accessing _Entry from same library\n  }\n}\n\nclass _Entry {  \u002F\u002F private class — not exported, not visible outside this file\n  final String value;\n  _Entry(this.value);\n}\n\n\u002F\u002F ❌ Anti-pattern: expecting `_` to be class-private.\nclass Counter {\n  int _count = 0;  \u002F\u002F library-private, NOT class-private\n  void increment() => _count++;\n}\n\nclass CounterHelper {\n  final Counter counter;\n  CounterHelper(this.counter);\n  void reset() {\n    \u002F\u002F counter._count = 0;  \u002F\u002F ✓ compiles if in the same file! _count is library-private.\n  }\n}\n","",[19,34,35,44,50,56,62,69,75,90,123,138,143,166,183,189,195,200,213,224,238,243,248,254,264,284,307,312,317,327,337,350,361,370,375],{"__ignoreMap":32},[36,37,40],"span",{"class":38,"line":39},"line",1,[36,41,43],{"class":42},"sdCPZ","\u002F\u002F Dart has ONE privacy modifier: the underscore prefix (`_`).\n",[36,45,47],{"class":38,"line":46},2,[36,48,49],{"class":42},"\u002F\u002F `_name` is library-private — accessible within the same library (file or\n",[36,51,53],{"class":38,"line":52},3,[36,54,55],{"class":42},"\u002F\u002F files sharing a `library` declaration), NOT from other libraries.\n",[36,57,59],{"class":38,"line":58},4,[36,60,61],{"class":42},"\u002F\u002F There is NO `public`\u002F`private`\u002F`protected` — no class-private visibility.\n",[36,63,65],{"class":38,"line":64},5,[36,66,68],{"emptyLinePlaceholder":67},true,"\n",[36,70,72],{"class":38,"line":71},6,[36,73,74],{"class":42},"\u002F\u002F lib\u002Fsrc\u002Fcache.dart\n",[36,76,78,82,86],{"class":38,"line":77},7,[36,79,81],{"class":80},"svdQ7","class",[36,83,85],{"class":84},"snvgF"," Cache",[36,87,89],{"class":88},"ssxIu"," {\n",[36,91,93,96,99,102,105,108,111,114,117,120],{"class":38,"line":92},8,[36,94,95],{"class":80},"  final",[36,97,98],{"class":84}," Map",[36,100,101],{"class":88},"\u003C",[36,103,104],{"class":84},"String",[36,106,107],{"class":88},", ",[36,109,110],{"class":84},"_Entry",[36,112,113],{"class":88},"> _entries ",[36,115,116],{"class":80},"=",[36,118,119],{"class":88}," {};  ",[36,121,122],{"class":42},"\u002F\u002F both _Entry and _entries are private\n",[36,124,126,129,132,135],{"class":38,"line":125},9,[36,127,128],{"class":84},"  String",[36,130,131],{"class":80},"?",[36,133,134],{"class":88}," _key;  ",[36,136,137],{"class":42},"\u002F\u002F private field — accessible from other classes in THIS file\n",[36,139,141],{"class":38,"line":140},10,[36,142,68],{"emptyLinePlaceholder":67},[36,144,146,149,153,156,158,161,163],{"class":38,"line":145},11,[36,147,148],{"class":80},"  void",[36,150,152],{"class":151},"sIsaT"," put",[36,154,155],{"class":88},"(",[36,157,104],{"class":84},[36,159,160],{"class":88}," key, ",[36,162,104],{"class":84},[36,164,165],{"class":88}," value) {\n",[36,167,169,172,174,177,180],{"class":38,"line":168},12,[36,170,171],{"class":88},"    _entries[key] ",[36,173,116],{"class":80},[36,175,176],{"class":84}," _Entry",[36,178,179],{"class":88},"(value);  ",[36,181,182],{"class":42},"\u002F\u002F ✓ accessing _Entry from same library\n",[36,184,186],{"class":38,"line":185},13,[36,187,188],{"class":88},"  }\n",[36,190,192],{"class":38,"line":191},14,[36,193,194],{"class":88},"}\n",[36,196,198],{"class":38,"line":197},15,[36,199,68],{"emptyLinePlaceholder":67},[36,201,203,205,207,210],{"class":38,"line":202},16,[36,204,81],{"class":80},[36,206,176],{"class":84},[36,208,209],{"class":88}," {  ",[36,211,212],{"class":42},"\u002F\u002F private class — not exported, not visible outside this file\n",[36,214,216,218,221],{"class":38,"line":215},17,[36,217,95],{"class":80},[36,219,220],{"class":84}," String",[36,222,223],{"class":88}," value;\n",[36,225,227,230,232,235],{"class":38,"line":226},18,[36,228,229],{"class":84},"  _Entry",[36,231,155],{"class":88},[36,233,234],{"class":84},"this",[36,236,237],{"class":88},".value);\n",[36,239,241],{"class":38,"line":240},19,[36,242,194],{"class":88},[36,244,246],{"class":38,"line":245},20,[36,247,68],{"emptyLinePlaceholder":67},[36,249,251],{"class":38,"line":250},21,[36,252,253],{"class":42},"\u002F\u002F ❌ Anti-pattern: expecting `_` to be class-private.\n",[36,255,257,259,262],{"class":38,"line":256},22,[36,258,81],{"class":80},[36,260,261],{"class":84}," Counter",[36,263,89],{"class":88},[36,265,267,270,273,275,278,281],{"class":38,"line":266},23,[36,268,269],{"class":84},"  int",[36,271,272],{"class":88}," _count ",[36,274,116],{"class":80},[36,276,277],{"class":84}," 0",[36,279,280],{"class":88},";  ",[36,282,283],{"class":42},"\u002F\u002F library-private, NOT class-private\n",[36,285,287,289,292,295,298,301,304],{"class":38,"line":286},24,[36,288,148],{"class":80},[36,290,291],{"class":151}," increment",[36,293,294],{"class":88},"() ",[36,296,297],{"class":80},"=>",[36,299,300],{"class":88}," _count",[36,302,303],{"class":80},"++",[36,305,306],{"class":88},";\n",[36,308,310],{"class":38,"line":309},25,[36,311,194],{"class":88},[36,313,315],{"class":38,"line":314},26,[36,316,68],{"emptyLinePlaceholder":67},[36,318,320,322,325],{"class":38,"line":319},27,[36,321,81],{"class":80},[36,323,324],{"class":84}," CounterHelper",[36,326,89],{"class":88},[36,328,330,332,334],{"class":38,"line":329},28,[36,331,95],{"class":80},[36,333,261],{"class":84},[36,335,336],{"class":88}," counter;\n",[36,338,340,343,345,347],{"class":38,"line":339},29,[36,341,342],{"class":84},"  CounterHelper",[36,344,155],{"class":88},[36,346,234],{"class":84},[36,348,349],{"class":88},".counter);\n",[36,351,353,355,358],{"class":38,"line":352},30,[36,354,148],{"class":80},[36,356,357],{"class":151}," reset",[36,359,360],{"class":88},"() {\n",[36,362,364,367],{"class":38,"line":363},31,[36,365,366],{"class":42},"    \u002F\u002F counter._count = 0;",[36,368,369],{"class":42},"  \u002F\u002F ✓ compiles if in the same file! _count is library-private.\n",[36,371,373],{"class":38,"line":372},32,[36,374,188],{"class":88},[36,376,378],{"class":38,"line":377},33,[36,379,194],{"class":88},[14,381,383,384,107,387,107,390],{"id":382},"import-variants-as-show-hide","Import Variants — ",[19,385,386],{},"as",[19,388,389],{},"show",[19,391,392],{},"hide",[24,394,395],{"language":26},[28,396,398],{"className":30,"code":397,"language":26,"meta":32,"style":32},"\u002F\u002F ── `as`: namespace prefix (avoid name clashes) ──\nimport 'package:http\u002Fhttp.dart' as http;\n\u002F\u002F http.get(...), http.post(...) — all http members are prefixed.\n\n\u002F\u002F ── `show`: import only specific names ──\nimport 'package:shelf\u002Fshelf.dart' show Request, Response, Pipeline;\n\u002F\u002F Only Request, Response, Pipeline are available — no Router, no logRequests.\n\n\u002F\u002F ── `hide`: import everything except specific names ──\nimport 'package:shelf\u002Fshelf.dart' hide logRequests;\n\u002F\u002F Everything except logRequests.\n\n\u002F\u002F ── Combining: prefix + show\u002Fhide ──\nimport 'package:shelf\u002Fshelf.dart' as shelf show Request, Response;\n\n\u002F\u002F ❌ Anti-pattern: name clash from two libraries exporting the same name.\nimport 'package:app_a\u002Fconfig.dart';  \u002F\u002F exports Config\nimport 'package:app_b\u002Fconfig.dart';  \u002F\u002F also exports Config\n\u002F\u002F Error: 'Config' is defined in both libraries.\n\n\u002F\u002F ✓ Correct: prefix one or both.\nimport 'package:app_a\u002Fconfig.dart';\nimport 'package:app_b\u002Fconfig.dart' as app_b;\n\nvoid main() {\n  var a = Config();       \u002F\u002F app_a's Config\n  var b = app_b.Config();  \u002F\u002F app_b's Config\n}\n",[19,399,400,405,420,425,429,434,447,452,456,461,473,478,482,487,503,507,512,524,536,541,545,550,558,569,573,583,602,623],{"__ignoreMap":32},[36,401,402],{"class":38,"line":39},[36,403,404],{"class":42},"\u002F\u002F ── `as`: namespace prefix (avoid name clashes) ──\n",[36,406,407,410,414,417],{"class":38,"line":46},[36,408,409],{"class":80},"import",[36,411,413],{"class":412},"sJ6F3"," 'package:http\u002Fhttp.dart'",[36,415,416],{"class":80}," as",[36,418,419],{"class":88}," http;\n",[36,421,422],{"class":38,"line":52},[36,423,424],{"class":42},"\u002F\u002F http.get(...), http.post(...) — all http members are prefixed.\n",[36,426,427],{"class":38,"line":58},[36,428,68],{"emptyLinePlaceholder":67},[36,430,431],{"class":38,"line":64},[36,432,433],{"class":42},"\u002F\u002F ── `show`: import only specific names ──\n",[36,435,436,438,441,444],{"class":38,"line":71},[36,437,409],{"class":80},[36,439,440],{"class":412}," 'package:shelf\u002Fshelf.dart'",[36,442,443],{"class":80}," show",[36,445,446],{"class":88}," Request, Response, Pipeline;\n",[36,448,449],{"class":38,"line":77},[36,450,451],{"class":42},"\u002F\u002F Only Request, Response, Pipeline are available — no Router, no logRequests.\n",[36,453,454],{"class":38,"line":92},[36,455,68],{"emptyLinePlaceholder":67},[36,457,458],{"class":38,"line":125},[36,459,460],{"class":42},"\u002F\u002F ── `hide`: import everything except specific names ──\n",[36,462,463,465,467,470],{"class":38,"line":140},[36,464,409],{"class":80},[36,466,440],{"class":412},[36,468,469],{"class":80}," hide",[36,471,472],{"class":88}," logRequests;\n",[36,474,475],{"class":38,"line":145},[36,476,477],{"class":42},"\u002F\u002F Everything except logRequests.\n",[36,479,480],{"class":38,"line":168},[36,481,68],{"emptyLinePlaceholder":67},[36,483,484],{"class":38,"line":185},[36,485,486],{"class":42},"\u002F\u002F ── Combining: prefix + show\u002Fhide ──\n",[36,488,489,491,493,495,498,500],{"class":38,"line":191},[36,490,409],{"class":80},[36,492,440],{"class":412},[36,494,416],{"class":80},[36,496,497],{"class":88}," shelf ",[36,499,389],{"class":80},[36,501,502],{"class":88}," Request, Response;\n",[36,504,505],{"class":38,"line":197},[36,506,68],{"emptyLinePlaceholder":67},[36,508,509],{"class":38,"line":202},[36,510,511],{"class":42},"\u002F\u002F ❌ Anti-pattern: name clash from two libraries exporting the same name.\n",[36,513,514,516,519,521],{"class":38,"line":215},[36,515,409],{"class":80},[36,517,518],{"class":412}," 'package:app_a\u002Fconfig.dart'",[36,520,280],{"class":88},[36,522,523],{"class":42},"\u002F\u002F exports Config\n",[36,525,526,528,531,533],{"class":38,"line":226},[36,527,409],{"class":80},[36,529,530],{"class":412}," 'package:app_b\u002Fconfig.dart'",[36,532,280],{"class":88},[36,534,535],{"class":42},"\u002F\u002F also exports Config\n",[36,537,538],{"class":38,"line":240},[36,539,540],{"class":42},"\u002F\u002F Error: 'Config' is defined in both libraries.\n",[36,542,543],{"class":38,"line":245},[36,544,68],{"emptyLinePlaceholder":67},[36,546,547],{"class":38,"line":250},[36,548,549],{"class":42},"\u002F\u002F ✓ Correct: prefix one or both.\n",[36,551,552,554,556],{"class":38,"line":256},[36,553,409],{"class":80},[36,555,518],{"class":412},[36,557,306],{"class":88},[36,559,560,562,564,566],{"class":38,"line":266},[36,561,409],{"class":80},[36,563,530],{"class":412},[36,565,416],{"class":80},[36,567,568],{"class":88}," app_b;\n",[36,570,571],{"class":38,"line":286},[36,572,68],{"emptyLinePlaceholder":67},[36,574,575,578,581],{"class":38,"line":309},[36,576,577],{"class":80},"void",[36,579,580],{"class":151}," main",[36,582,360],{"class":88},[36,584,585,588,591,593,596,599],{"class":38,"line":314},[36,586,587],{"class":80},"  var",[36,589,590],{"class":88}," a ",[36,592,116],{"class":80},[36,594,595],{"class":84}," Config",[36,597,598],{"class":88},"();       ",[36,600,601],{"class":42},"\u002F\u002F app_a's Config\n",[36,603,604,606,609,611,614,617,620],{"class":38,"line":319},[36,605,587],{"class":80},[36,607,608],{"class":88}," b ",[36,610,116],{"class":80},[36,612,613],{"class":88}," app_b.",[36,615,616],{"class":84},"Config",[36,618,619],{"class":88},"();  ",[36,621,622],{"class":42},"\u002F\u002F app_b's Config\n",[36,624,625],{"class":38,"line":329},[36,626,194],{"class":88},[14,628,630],{"id":629},"barrel-files-aggregating-public-apis","Barrel Files — Aggregating Public APIs",[24,632,633],{"language":26},[28,634,636],{"className":30,"code":635,"language":26,"meta":32,"style":32},"\u002F\u002F A barrel file re-exports multiple libraries as a single import surface.\n\u002F\u002F Users import one file instead of many — clean API boundary.\n\n\u002F\u002F lib\u002Fmodels.dart — barrel file\nexport 'src\u002Fmodels\u002Fuser.dart';\nexport 'src\u002Fmodels\u002Fpost.dart';\nexport 'src\u002Fmodels\u002Fcomment.dart';\nexport 'src\u002Fmodels\u002Fevent.dart' show Event, ClickEvent;  \u002F\u002F selective export\n\n\u002F\u002F User code:\nimport 'package:my_app\u002Fmodels.dart';  \u002F\u002F gets User, Post, Comment, Event, ClickEvent\n\n\u002F\u002F ── Package public API barrel ──\n\u002F\u002F lib\u002Fmy_package.dart — the single entry point for consumers\nlibrary my_package;\n\nexport 'src\u002Fcore.dart';\nexport 'src\u002Futils.dart' show StringUtils, DateUtils;\nexport 'src\u002Ftypes.dart';\n\u002F\u002F src\u002F is convention-private — users shouldn't import src\u002F directly.\n",[19,637,638,643,648,652,657,667,676,685,700,704,709,721,725,730,735,743,747,756,768,777],{"__ignoreMap":32},[36,639,640],{"class":38,"line":39},[36,641,642],{"class":42},"\u002F\u002F A barrel file re-exports multiple libraries as a single import surface.\n",[36,644,645],{"class":38,"line":46},[36,646,647],{"class":42},"\u002F\u002F Users import one file instead of many — clean API boundary.\n",[36,649,650],{"class":38,"line":52},[36,651,68],{"emptyLinePlaceholder":67},[36,653,654],{"class":38,"line":58},[36,655,656],{"class":42},"\u002F\u002F lib\u002Fmodels.dart — barrel file\n",[36,658,659,662,665],{"class":38,"line":64},[36,660,661],{"class":80},"export",[36,663,664],{"class":412}," 'src\u002Fmodels\u002Fuser.dart'",[36,666,306],{"class":88},[36,668,669,671,674],{"class":38,"line":71},[36,670,661],{"class":80},[36,672,673],{"class":412}," 'src\u002Fmodels\u002Fpost.dart'",[36,675,306],{"class":88},[36,677,678,680,683],{"class":38,"line":77},[36,679,661],{"class":80},[36,681,682],{"class":412}," 'src\u002Fmodels\u002Fcomment.dart'",[36,684,306],{"class":88},[36,686,687,689,692,694,697],{"class":38,"line":92},[36,688,661],{"class":80},[36,690,691],{"class":412}," 'src\u002Fmodels\u002Fevent.dart'",[36,693,443],{"class":80},[36,695,696],{"class":88}," Event, ClickEvent;  ",[36,698,699],{"class":42},"\u002F\u002F selective export\n",[36,701,702],{"class":38,"line":125},[36,703,68],{"emptyLinePlaceholder":67},[36,705,706],{"class":38,"line":140},[36,707,708],{"class":42},"\u002F\u002F User code:\n",[36,710,711,713,716,718],{"class":38,"line":145},[36,712,409],{"class":80},[36,714,715],{"class":412}," 'package:my_app\u002Fmodels.dart'",[36,717,280],{"class":88},[36,719,720],{"class":42},"\u002F\u002F gets User, Post, Comment, Event, ClickEvent\n",[36,722,723],{"class":38,"line":168},[36,724,68],{"emptyLinePlaceholder":67},[36,726,727],{"class":38,"line":185},[36,728,729],{"class":42},"\u002F\u002F ── Package public API barrel ──\n",[36,731,732],{"class":38,"line":191},[36,733,734],{"class":42},"\u002F\u002F lib\u002Fmy_package.dart — the single entry point for consumers\n",[36,736,737,740],{"class":38,"line":197},[36,738,739],{"class":80},"library",[36,741,742],{"class":88}," my_package;\n",[36,744,745],{"class":38,"line":202},[36,746,68],{"emptyLinePlaceholder":67},[36,748,749,751,754],{"class":38,"line":215},[36,750,661],{"class":80},[36,752,753],{"class":412}," 'src\u002Fcore.dart'",[36,755,306],{"class":88},[36,757,758,760,763,765],{"class":38,"line":226},[36,759,661],{"class":80},[36,761,762],{"class":412}," 'src\u002Futils.dart'",[36,764,443],{"class":80},[36,766,767],{"class":88}," StringUtils, DateUtils;\n",[36,769,770,772,775],{"class":38,"line":240},[36,771,661],{"class":80},[36,773,774],{"class":412}," 'src\u002Ftypes.dart'",[36,776,306],{"class":88},[36,778,779],{"class":38,"line":245},[36,780,781],{"class":42},"\u002F\u002F src\u002F is convention-private — users shouldn't import src\u002F directly.\n",[14,783,785],{"id":784},"conditional-imports-platform-specific-code","Conditional Imports — Platform-Specific Code",[24,787,788],{"language":26},[28,789,791],{"className":30,"code":790,"language":26,"meta":32,"style":32},"\u002F\u002F Conditional imports select an implementation at COMPILE TIME based on\n\u002F\u002F which dart: libraries are available. Zero runtime cost — the compiler\n\u002F\u002F includes only the matching file and dead-code-eliminates the other.\n\n\u002F\u002F platform.dart — public API (both implementations must export the same API)\nexport 'platform_io.dart'     \u002F\u002F native: dart:io is available\n    if (dart.library.html) 'platform_web.dart';  \u002F\u002F web: dart:html is available\n\n\u002F\u002F platform_io.dart\nimport 'dart:io';\nString get platformName => Platform.operatingSystem;\nFuture\u003CList\u003Cint>> readFile(String path) => File(path).readAsBytes();\n\n\u002F\u002F platform_web.dart — same API, web implementation\nimport 'dart:html';\nString get platformName => 'web';\nFuture\u003CList\u003Cint>> readFile(String url) async {\n  final response = await HttpRequest.request(url, responseType: 'arraybuffer');\n  return (response.response as ByteBuffer).asUint8List();\n}\n\n\u002F\u002F ── Using the conditional import ──\nimport 'platform.dart';  \u002F\u002F resolves to io or web at compile time\n\nvoid main() async {\n  print(platformName);  \u002F\u002F 'macos' on native, 'web' on web\n  final bytes = await readFile('data.bin');\n}\n\n\u002F\u002F ❌ Anti-pattern: importing dart:io directly in cross-platform code.\n\u002F\u002F import 'dart:io';  \u002F\u002F ✗ fails on web — compile error\n",[19,792,793,798,803,808,812,817,827,843,847,852,861,879,921,925,930,939,954,982,1015,1036,1040,1044,1049,1061,1065,1077,1088,1109,1113,1117,1122],{"__ignoreMap":32},[36,794,795],{"class":38,"line":39},[36,796,797],{"class":42},"\u002F\u002F Conditional imports select an implementation at COMPILE TIME based on\n",[36,799,800],{"class":38,"line":46},[36,801,802],{"class":42},"\u002F\u002F which dart: libraries are available. Zero runtime cost — the compiler\n",[36,804,805],{"class":38,"line":52},[36,806,807],{"class":42},"\u002F\u002F includes only the matching file and dead-code-eliminates the other.\n",[36,809,810],{"class":38,"line":58},[36,811,68],{"emptyLinePlaceholder":67},[36,813,814],{"class":38,"line":64},[36,815,816],{"class":42},"\u002F\u002F platform.dart — public API (both implementations must export the same API)\n",[36,818,819,821,824],{"class":38,"line":71},[36,820,661],{"class":80},[36,822,823],{"class":412}," 'platform_io.dart'",[36,825,826],{"class":42},"     \u002F\u002F native: dart:io is available\n",[36,828,829,832,835,838,840],{"class":38,"line":77},[36,830,831],{"class":80},"    if",[36,833,834],{"class":88}," (dart.library.html) ",[36,836,837],{"class":412},"'platform_web.dart'",[36,839,280],{"class":88},[36,841,842],{"class":42},"\u002F\u002F web: dart:html is available\n",[36,844,845],{"class":38,"line":92},[36,846,68],{"emptyLinePlaceholder":67},[36,848,849],{"class":38,"line":125},[36,850,851],{"class":42},"\u002F\u002F platform_io.dart\n",[36,853,854,856,859],{"class":38,"line":140},[36,855,409],{"class":80},[36,857,858],{"class":412}," 'dart:io'",[36,860,306],{"class":88},[36,862,863,865,868,871,873,876],{"class":38,"line":145},[36,864,104],{"class":84},[36,866,867],{"class":80}," get",[36,869,870],{"class":88}," platformName ",[36,872,297],{"class":80},[36,874,875],{"class":84}," Platform",[36,877,878],{"class":88},".operatingSystem;\n",[36,880,881,884,886,889,891,894,897,900,902,904,907,909,912,915,918],{"class":38,"line":168},[36,882,883],{"class":84},"Future",[36,885,101],{"class":88},[36,887,888],{"class":84},"List",[36,890,101],{"class":88},[36,892,893],{"class":84},"int",[36,895,896],{"class":88},">> ",[36,898,899],{"class":151},"readFile",[36,901,155],{"class":88},[36,903,104],{"class":84},[36,905,906],{"class":88}," path) ",[36,908,297],{"class":80},[36,910,911],{"class":84}," File",[36,913,914],{"class":88},"(path).",[36,916,917],{"class":151},"readAsBytes",[36,919,920],{"class":88},"();\n",[36,922,923],{"class":38,"line":185},[36,924,68],{"emptyLinePlaceholder":67},[36,926,927],{"class":38,"line":191},[36,928,929],{"class":42},"\u002F\u002F platform_web.dart — same API, web implementation\n",[36,931,932,934,937],{"class":38,"line":197},[36,933,409],{"class":80},[36,935,936],{"class":412}," 'dart:html'",[36,938,306],{"class":88},[36,940,941,943,945,947,949,952],{"class":38,"line":202},[36,942,104],{"class":84},[36,944,867],{"class":80},[36,946,870],{"class":88},[36,948,297],{"class":80},[36,950,951],{"class":412}," 'web'",[36,953,306],{"class":88},[36,955,956,958,960,962,964,966,968,970,972,974,977,980],{"class":38,"line":215},[36,957,883],{"class":84},[36,959,101],{"class":88},[36,961,888],{"class":84},[36,963,101],{"class":88},[36,965,893],{"class":84},[36,967,896],{"class":88},[36,969,899],{"class":151},[36,971,155],{"class":88},[36,973,104],{"class":84},[36,975,976],{"class":88}," url) ",[36,978,979],{"class":80},"async",[36,981,89],{"class":88},[36,983,984,986,989,991,994,997,1000,1003,1006,1009,1012],{"class":38,"line":226},[36,985,95],{"class":80},[36,987,988],{"class":88}," response ",[36,990,116],{"class":80},[36,992,993],{"class":80}," await",[36,995,996],{"class":84}," HttpRequest",[36,998,999],{"class":88},".",[36,1001,1002],{"class":151},"request",[36,1004,1005],{"class":88},"(url, responseType",[36,1007,1008],{"class":80},":",[36,1010,1011],{"class":412}," 'arraybuffer'",[36,1013,1014],{"class":88},");\n",[36,1016,1017,1020,1023,1025,1028,1031,1034],{"class":38,"line":240},[36,1018,1019],{"class":80},"  return",[36,1021,1022],{"class":88}," (response.response ",[36,1024,386],{"class":80},[36,1026,1027],{"class":84}," ByteBuffer",[36,1029,1030],{"class":88},").",[36,1032,1033],{"class":151},"asUint8List",[36,1035,920],{"class":88},[36,1037,1038],{"class":38,"line":245},[36,1039,194],{"class":88},[36,1041,1042],{"class":38,"line":250},[36,1043,68],{"emptyLinePlaceholder":67},[36,1045,1046],{"class":38,"line":256},[36,1047,1048],{"class":42},"\u002F\u002F ── Using the conditional import ──\n",[36,1050,1051,1053,1056,1058],{"class":38,"line":266},[36,1052,409],{"class":80},[36,1054,1055],{"class":412}," 'platform.dart'",[36,1057,280],{"class":88},[36,1059,1060],{"class":42},"\u002F\u002F resolves to io or web at compile time\n",[36,1062,1063],{"class":38,"line":286},[36,1064,68],{"emptyLinePlaceholder":67},[36,1066,1067,1069,1071,1073,1075],{"class":38,"line":309},[36,1068,577],{"class":80},[36,1070,580],{"class":151},[36,1072,294],{"class":88},[36,1074,979],{"class":80},[36,1076,89],{"class":88},[36,1078,1079,1082,1085],{"class":38,"line":314},[36,1080,1081],{"class":151},"  print",[36,1083,1084],{"class":88},"(platformName);  ",[36,1086,1087],{"class":42},"\u002F\u002F 'macos' on native, 'web' on web\n",[36,1089,1090,1092,1095,1097,1099,1102,1104,1107],{"class":38,"line":319},[36,1091,95],{"class":80},[36,1093,1094],{"class":88}," bytes ",[36,1096,116],{"class":80},[36,1098,993],{"class":80},[36,1100,1101],{"class":151}," readFile",[36,1103,155],{"class":88},[36,1105,1106],{"class":412},"'data.bin'",[36,1108,1014],{"class":88},[36,1110,1111],{"class":38,"line":329},[36,1112,194],{"class":88},[36,1114,1115],{"class":38,"line":339},[36,1116,68],{"emptyLinePlaceholder":67},[36,1118,1119],{"class":38,"line":352},[36,1120,1121],{"class":42},"\u002F\u002F ❌ Anti-pattern: importing dart:io directly in cross-platform code.\n",[36,1123,1124,1127],{"class":38,"line":363},[36,1125,1126],{"class":42},"\u002F\u002F import 'dart:io';",[36,1128,1129],{"class":42},"  \u002F\u002F ✗ fails on web — compile error\n",[14,1131,1133],{"id":1132},"deferred-loading-code-splitting-web","Deferred Loading — Code Splitting (Web)",[24,1135,1136],{"language":26},[28,1137,1139],{"className":30,"code":1138,"language":26,"meta":32,"style":32},"\u002F\u002F `deferred as` loads a library on DEMAND (via loadLibrary()).\n\u002F\u002F Useful on web for code-splitting — smaller initial bundle.\n\u002F\u002F The library is downloaded only when loadLibrary() is called.\n\nimport 'heavy_editor.dart' deferred as editor;\n\nvoid main() async {\n  \u002F\u002F The editor library is NOT loaded yet — smaller initial bundle.\n  print('App started');\n\n  \u002F\u002F Load on demand (e.g., when user opens the editor):\n  await editor.loadLibrary();  \u002F\u002F downloads + compiles the library\n  editor.openEditor();  \u002F\u002F now available\n}\n\n\u002F\u002F ── Flutter deferred components ──\n\u002F\u002F On Flutter mobile, deferred loading enables dynamic feature delivery\n\u002F\u002F (download features on demand). Configure in build.gradle \u002F Info.plist.\n\n\u002F\u002F Limitations:\n\u002F\u002F - Can't use deferred types at compile time before loadLibrary().\n\u002F\u002F - `editor.Editor` is available as a type, but instantiating before\n\u002F\u002F   loadLibrary() throws.\n",[19,1140,1141,1146,1151,1156,1160,1175,1179,1191,1196,1207,1211,1216,1232,1245,1249,1253,1258,1263,1268,1272,1277,1282,1287],{"__ignoreMap":32},[36,1142,1143],{"class":38,"line":39},[36,1144,1145],{"class":42},"\u002F\u002F `deferred as` loads a library on DEMAND (via loadLibrary()).\n",[36,1147,1148],{"class":38,"line":46},[36,1149,1150],{"class":42},"\u002F\u002F Useful on web for code-splitting — smaller initial bundle.\n",[36,1152,1153],{"class":38,"line":52},[36,1154,1155],{"class":42},"\u002F\u002F The library is downloaded only when loadLibrary() is called.\n",[36,1157,1158],{"class":38,"line":58},[36,1159,68],{"emptyLinePlaceholder":67},[36,1161,1162,1164,1167,1170,1172],{"class":38,"line":64},[36,1163,409],{"class":80},[36,1165,1166],{"class":412}," 'heavy_editor.dart'",[36,1168,1169],{"class":88}," deferred ",[36,1171,386],{"class":80},[36,1173,1174],{"class":88}," editor;\n",[36,1176,1177],{"class":38,"line":71},[36,1178,68],{"emptyLinePlaceholder":67},[36,1180,1181,1183,1185,1187,1189],{"class":38,"line":77},[36,1182,577],{"class":80},[36,1184,580],{"class":151},[36,1186,294],{"class":88},[36,1188,979],{"class":80},[36,1190,89],{"class":88},[36,1192,1193],{"class":38,"line":92},[36,1194,1195],{"class":42},"  \u002F\u002F The editor library is NOT loaded yet — smaller initial bundle.\n",[36,1197,1198,1200,1202,1205],{"class":38,"line":125},[36,1199,1081],{"class":151},[36,1201,155],{"class":88},[36,1203,1204],{"class":412},"'App started'",[36,1206,1014],{"class":88},[36,1208,1209],{"class":38,"line":140},[36,1210,68],{"emptyLinePlaceholder":67},[36,1212,1213],{"class":38,"line":145},[36,1214,1215],{"class":42},"  \u002F\u002F Load on demand (e.g., when user opens the editor):\n",[36,1217,1218,1221,1224,1227,1229],{"class":38,"line":168},[36,1219,1220],{"class":80},"  await",[36,1222,1223],{"class":88}," editor.",[36,1225,1226],{"class":151},"loadLibrary",[36,1228,619],{"class":88},[36,1230,1231],{"class":42},"\u002F\u002F downloads + compiles the library\n",[36,1233,1234,1237,1240,1242],{"class":38,"line":185},[36,1235,1236],{"class":88},"  editor.",[36,1238,1239],{"class":151},"openEditor",[36,1241,619],{"class":88},[36,1243,1244],{"class":42},"\u002F\u002F now available\n",[36,1246,1247],{"class":38,"line":191},[36,1248,194],{"class":88},[36,1250,1251],{"class":38,"line":197},[36,1252,68],{"emptyLinePlaceholder":67},[36,1254,1255],{"class":38,"line":202},[36,1256,1257],{"class":42},"\u002F\u002F ── Flutter deferred components ──\n",[36,1259,1260],{"class":38,"line":215},[36,1261,1262],{"class":42},"\u002F\u002F On Flutter mobile, deferred loading enables dynamic feature delivery\n",[36,1264,1265],{"class":38,"line":226},[36,1266,1267],{"class":42},"\u002F\u002F (download features on demand). Configure in build.gradle \u002F Info.plist.\n",[36,1269,1270],{"class":38,"line":240},[36,1271,68],{"emptyLinePlaceholder":67},[36,1273,1274],{"class":38,"line":245},[36,1275,1276],{"class":42},"\u002F\u002F Limitations:\n",[36,1278,1279],{"class":38,"line":250},[36,1280,1281],{"class":42},"\u002F\u002F - Can't use deferred types at compile time before loadLibrary().\n",[36,1283,1284],{"class":38,"line":256},[36,1285,1286],{"class":42},"\u002F\u002F - `editor.Editor` is available as a type, but instantiating before\n",[36,1288,1289],{"class":38,"line":266},[36,1290,1291],{"class":42},"\u002F\u002F   loadLibrary() throws.\n",[14,1293,1295],{"id":1294},"monorepo-path-dependencies","Monorepo — Path Dependencies",[24,1297,1299,1390],{"language":1298},"yaml",[28,1300,1303],{"className":1301,"code":1302,"language":1298,"meta":32,"style":32},"language-yaml shiki shiki-themes github-light github-dark","# In a monorepo, packages depend on each other via path: dependencies.\n# pubspec.yaml for my_service\u002F\ndependencies:\n  shared_models:\n    path: ..\u002Fshared_models  # relative path to the sibling package\n  my_lib:\n    path: ..\u002F..\u002Fpackages\u002Fmy_lib\n\n# ── Melos for monorepo management ──\n# For large monorepos, use `melos` to manage multiple packages:\n# melos bootstrap — run `pub get` for all packages\n# melos exec -- dart test — run tests in all packages\n# melos publish — publish all packages\n",[19,1304,1305,1310,1315,1324,1331,1345,1352,1361,1365,1370,1375,1380,1385],{"__ignoreMap":32},[36,1306,1307],{"class":38,"line":39},[36,1308,1309],{"class":42},"# In a monorepo, packages depend on each other via path: dependencies.\n",[36,1311,1312],{"class":38,"line":46},[36,1313,1314],{"class":42},"# pubspec.yaml for my_service\u002F\n",[36,1316,1317,1321],{"class":38,"line":52},[36,1318,1320],{"class":1319},"sk71V","dependencies",[36,1322,1323],{"class":88},":\n",[36,1325,1326,1329],{"class":38,"line":58},[36,1327,1328],{"class":1319},"  shared_models",[36,1330,1323],{"class":88},[36,1332,1333,1336,1339,1342],{"class":38,"line":64},[36,1334,1335],{"class":1319},"    path",[36,1337,1338],{"class":88},": ",[36,1340,1341],{"class":412},"..\u002Fshared_models",[36,1343,1344],{"class":42},"  # relative path to the sibling package\n",[36,1346,1347,1350],{"class":38,"line":71},[36,1348,1349],{"class":1319},"  my_lib",[36,1351,1323],{"class":88},[36,1353,1354,1356,1358],{"class":38,"line":77},[36,1355,1335],{"class":1319},[36,1357,1338],{"class":88},[36,1359,1360],{"class":412},"..\u002F..\u002Fpackages\u002Fmy_lib\n",[36,1362,1363],{"class":38,"line":92},[36,1364,68],{"emptyLinePlaceholder":67},[36,1366,1367],{"class":38,"line":125},[36,1368,1369],{"class":42},"# ── Melos for monorepo management ──\n",[36,1371,1372],{"class":38,"line":140},[36,1373,1374],{"class":42},"# For large monorepos, use `melos` to manage multiple packages:\n",[36,1376,1377],{"class":38,"line":145},[36,1378,1379],{"class":42},"# melos bootstrap — run `pub get` for all packages\n",[36,1381,1382],{"class":38,"line":168},[36,1383,1384],{"class":42},"# melos exec -- dart test — run tests in all packages\n",[36,1386,1387],{"class":38,"line":185},[36,1388,1389],{"class":42},"# melos publish — publish all packages\n",[24,1391,1393],{"language":1392},"bash",[28,1394,1397],{"className":1395,"code":1396,"language":1392,"meta":32,"style":32},"language-bash shiki shiki-themes github-light github-dark","# Bootstrap a monorepo (install deps for all packages):\ndart pub global activate melos\nmelos bootstrap\n\n# Run a command in all packages:\nmelos exec -- dart analyze\nmelos exec -- dart test\n\n# The root melos.yaml configures the workspace:\n# packages:\n#   - 'packages\u002F*'\n#   - 'apps\u002F*'\n",[19,1398,1399,1404,1420,1428,1432,1437,1453,1466,1470,1475,1480,1485],{"__ignoreMap":32},[36,1400,1401],{"class":38,"line":39},[36,1402,1403],{"class":42},"# Bootstrap a monorepo (install deps for all packages):\n",[36,1405,1406,1408,1411,1414,1417],{"class":38,"line":46},[36,1407,26],{"class":151},[36,1409,1410],{"class":412}," pub",[36,1412,1413],{"class":412}," global",[36,1415,1416],{"class":412}," activate",[36,1418,1419],{"class":412}," melos\n",[36,1421,1422,1425],{"class":38,"line":52},[36,1423,1424],{"class":151},"melos",[36,1426,1427],{"class":412}," bootstrap\n",[36,1429,1430],{"class":38,"line":58},[36,1431,68],{"emptyLinePlaceholder":67},[36,1433,1434],{"class":38,"line":64},[36,1435,1436],{"class":42},"# Run a command in all packages:\n",[36,1438,1439,1441,1444,1447,1450],{"class":38,"line":71},[36,1440,1424],{"class":151},[36,1442,1443],{"class":412}," exec",[36,1445,1446],{"class":84}," --",[36,1448,1449],{"class":412}," dart",[36,1451,1452],{"class":412}," analyze\n",[36,1454,1455,1457,1459,1461,1463],{"class":38,"line":77},[36,1456,1424],{"class":151},[36,1458,1443],{"class":412},[36,1460,1446],{"class":84},[36,1462,1449],{"class":412},[36,1464,1465],{"class":412}," test\n",[36,1467,1468],{"class":38,"line":92},[36,1469,68],{"emptyLinePlaceholder":67},[36,1471,1472],{"class":38,"line":125},[36,1473,1474],{"class":42},"# The root melos.yaml configures the workspace:\n",[36,1476,1477],{"class":38,"line":140},[36,1478,1479],{"class":42},"# packages:\n",[36,1481,1482],{"class":38,"line":145},[36,1483,1484],{"class":42},"#   - 'packages\u002F*'\n",[36,1486,1487],{"class":38,"line":168},[36,1488,1489],{"class":42},"#   - 'apps\u002F*'\n",[14,1491,1493],{"id":1492},"sdk-libraries-whats-available","SDK Libraries — What's Available",[24,1495,1496],{"language":26},[28,1497,1499],{"className":30,"code":1498,"language":26,"meta":32,"style":32},"\u002F\u002F ── dart:core (auto-imported) ──\n\u002F\u002F int, String, List, Map, Set, bool, num, Object, print, DateTime, Duration, etc.\n\n\u002F\u002F ── dart:async ──\nimport 'dart:async';\n\u002F\u002F Future, Stream, Completer, StreamController, runZonedGuarded, Timer\n\n\u002F\u002F ── dart:io (native only — not web) ──\nimport 'dart:io';\n\u002F\u002F File, Directory, HttpServer, HttpClient, Platform, Process, stdin, stdout\n\n\u002F\u002F ── dart:convert ──\nimport 'dart:convert';\n\u002F\u002F jsonEncode, jsonDecode, utf8, base64, Base64Encoder\u002FDecoder\n\n\u002F\u002F ── dart:math ──\nimport 'dart:math';\n\u002F\u002F Random, pi, e, max, min, sqrt, pow, exp, log\n\n\u002F\u002F ── dart:collection ──\nimport 'dart:collection';\n\u002F\u002F HashMap, LinkedHashMap, LinkedList, Queue, DoubleLinkedQueue\n\n\u002F\u002F ── dart:typed_data ──\nimport 'dart:typed_data';\n\u002F\u002F Uint8List, Int32List, Float64List, ByteBuffer, ByteData, TransferableTypedData\n\n\u002F\u002F ── dart:html (web only) ──\nimport 'dart:html';\n\u002F\u002F document, window, querySelector, DivElement, HttpRequest, WebSocket\n\n\u002F\u002F ── dart:js_interop (web, modern) ──\nimport 'dart:js_interop';\n\u002F\u002F @JS(), external functions, JSObject, JSArray, extension types\n",[19,1500,1501,1506,1511,1515,1520,1529,1534,1538,1543,1551,1556,1560,1565,1574,1579,1583,1588,1597,1602,1606,1611,1620,1625,1629,1634,1643,1648,1652,1657,1665,1670,1674,1679,1688],{"__ignoreMap":32},[36,1502,1503],{"class":38,"line":39},[36,1504,1505],{"class":42},"\u002F\u002F ── dart:core (auto-imported) ──\n",[36,1507,1508],{"class":38,"line":46},[36,1509,1510],{"class":42},"\u002F\u002F int, String, List, Map, Set, bool, num, Object, print, DateTime, Duration, etc.\n",[36,1512,1513],{"class":38,"line":52},[36,1514,68],{"emptyLinePlaceholder":67},[36,1516,1517],{"class":38,"line":58},[36,1518,1519],{"class":42},"\u002F\u002F ── dart:async ──\n",[36,1521,1522,1524,1527],{"class":38,"line":64},[36,1523,409],{"class":80},[36,1525,1526],{"class":412}," 'dart:async'",[36,1528,306],{"class":88},[36,1530,1531],{"class":38,"line":71},[36,1532,1533],{"class":42},"\u002F\u002F Future, Stream, Completer, StreamController, runZonedGuarded, Timer\n",[36,1535,1536],{"class":38,"line":77},[36,1537,68],{"emptyLinePlaceholder":67},[36,1539,1540],{"class":38,"line":92},[36,1541,1542],{"class":42},"\u002F\u002F ── dart:io (native only — not web) ──\n",[36,1544,1545,1547,1549],{"class":38,"line":125},[36,1546,409],{"class":80},[36,1548,858],{"class":412},[36,1550,306],{"class":88},[36,1552,1553],{"class":38,"line":140},[36,1554,1555],{"class":42},"\u002F\u002F File, Directory, HttpServer, HttpClient, Platform, Process, stdin, stdout\n",[36,1557,1558],{"class":38,"line":145},[36,1559,68],{"emptyLinePlaceholder":67},[36,1561,1562],{"class":38,"line":168},[36,1563,1564],{"class":42},"\u002F\u002F ── dart:convert ──\n",[36,1566,1567,1569,1572],{"class":38,"line":185},[36,1568,409],{"class":80},[36,1570,1571],{"class":412}," 'dart:convert'",[36,1573,306],{"class":88},[36,1575,1576],{"class":38,"line":191},[36,1577,1578],{"class":42},"\u002F\u002F jsonEncode, jsonDecode, utf8, base64, Base64Encoder\u002FDecoder\n",[36,1580,1581],{"class":38,"line":197},[36,1582,68],{"emptyLinePlaceholder":67},[36,1584,1585],{"class":38,"line":202},[36,1586,1587],{"class":42},"\u002F\u002F ── dart:math ──\n",[36,1589,1590,1592,1595],{"class":38,"line":215},[36,1591,409],{"class":80},[36,1593,1594],{"class":412}," 'dart:math'",[36,1596,306],{"class":88},[36,1598,1599],{"class":38,"line":226},[36,1600,1601],{"class":42},"\u002F\u002F Random, pi, e, max, min, sqrt, pow, exp, log\n",[36,1603,1604],{"class":38,"line":240},[36,1605,68],{"emptyLinePlaceholder":67},[36,1607,1608],{"class":38,"line":245},[36,1609,1610],{"class":42},"\u002F\u002F ── dart:collection ──\n",[36,1612,1613,1615,1618],{"class":38,"line":250},[36,1614,409],{"class":80},[36,1616,1617],{"class":412}," 'dart:collection'",[36,1619,306],{"class":88},[36,1621,1622],{"class":38,"line":256},[36,1623,1624],{"class":42},"\u002F\u002F HashMap, LinkedHashMap, LinkedList, Queue, DoubleLinkedQueue\n",[36,1626,1627],{"class":38,"line":266},[36,1628,68],{"emptyLinePlaceholder":67},[36,1630,1631],{"class":38,"line":286},[36,1632,1633],{"class":42},"\u002F\u002F ── dart:typed_data ──\n",[36,1635,1636,1638,1641],{"class":38,"line":309},[36,1637,409],{"class":80},[36,1639,1640],{"class":412}," 'dart:typed_data'",[36,1642,306],{"class":88},[36,1644,1645],{"class":38,"line":314},[36,1646,1647],{"class":42},"\u002F\u002F Uint8List, Int32List, Float64List, ByteBuffer, ByteData, TransferableTypedData\n",[36,1649,1650],{"class":38,"line":319},[36,1651,68],{"emptyLinePlaceholder":67},[36,1653,1654],{"class":38,"line":329},[36,1655,1656],{"class":42},"\u002F\u002F ── dart:html (web only) ──\n",[36,1658,1659,1661,1663],{"class":38,"line":339},[36,1660,409],{"class":80},[36,1662,936],{"class":412},[36,1664,306],{"class":88},[36,1666,1667],{"class":38,"line":352},[36,1668,1669],{"class":42},"\u002F\u002F document, window, querySelector, DivElement, HttpRequest, WebSocket\n",[36,1671,1672],{"class":38,"line":363},[36,1673,68],{"emptyLinePlaceholder":67},[36,1675,1676],{"class":38,"line":372},[36,1677,1678],{"class":42},"\u002F\u002F ── dart:js_interop (web, modern) ──\n",[36,1680,1681,1683,1686],{"class":38,"line":377},[36,1682,409],{"class":80},[36,1684,1685],{"class":412}," 'dart:js_interop'",[36,1687,306],{"class":88},[36,1689,1691],{"class":38,"line":1690},34,[36,1692,1693],{"class":42},"\u002F\u002F @JS(), external functions, JSObject, JSArray, extension types\n",[14,1695,1697],{"id":1696},"tips-tricks","💡 Tips & Tricks",[1699,1700,1701,1727,1747,1777,1792],"ul",{},[1702,1703,1704,1708,1709,1711,1712,1715,1716,107,1719,1722,1723,1726],"li",{},[1705,1706,1707],"strong",{},"Idiom",": use barrel files (",[19,1710,661],{},") to aggregate a library's public API — ",[19,1713,1714],{},"lib\u002Fmodels.dart"," exports ",[19,1717,1718],{},"user.dart",[19,1720,1721],{},"post.dart",", etc. Users import one file (",[19,1724,1725],{},"package:my_app\u002Fmodels.dart",") instead of many. Clean API surface.",[1702,1728,1729,1731,1732,1735,1736,1739,1740,1742,1743,1746],{},[1705,1730,1707],{},": put internal code in ",[19,1733,1734],{},"lib\u002Fsrc\u002F"," and export only public code from ",[19,1737,1738],{},"lib\u002F"," — ",[19,1741,1734],{}," is convention-private (users shouldn't import it). Export public APIs from ",[19,1744,1745],{},"lib\u002Fmy_package.dart",". This is the standard package structure.",[1702,1748,1749,1751,1752,1754,1755,1757,1758,1761,1762,107,1765,1768,1769,1772,1773,1776],{},[1705,1750,1707],{},": use ",[19,1753,389],{},"\u002F",[19,1756,392],{}," to control imports — ",[19,1759,1760],{},"import 'lib.dart' show foo, bar;"," imports only ",[19,1763,1764],{},"foo",[19,1766,1767],{},"bar","; ",[19,1770,1771],{},"hide baz"," excludes ",[19,1774,1775],{},"baz",". Avoids namespace pollution and name clashes.",[1702,1778,1779,1751,1781,1783,1784,1787,1788,1791],{},[1705,1780,1707],{},[19,1782,386],{}," to prefix imports with name clashes — ",[19,1785,1786],{},"import 'package:dartx\u002Fdartx.dart' as dartx;"," then ",[19,1789,1790],{},"dartx.method()",". Use when two libraries export the same name.",[1702,1793,1794,1796,1797,1800],{},[1705,1795,1707],{},": commit ",[19,1798,1799],{},"pubspec.lock"," for apps (reproducible builds), omit for libraries (let the consumer resolve). Apps need exact versions; libraries should be flexible.",[14,1802,1804],{"id":1803},"️-edge-cases-gotchas","⚠️ Edge Cases & Gotchas",[1699,1806,1807,1818,1840,1854,1876,1892,1905,1924,1946,1955],{},[1702,1808,1809,1338,1814,1817],{},[1705,1810,1811,1813],{},[19,1812,21],{}," is library-private, not class-private",[19,1815,1816],{},"int _x"," in a class is accessible from other classes in the same file\u002Flibrary. Dart has no class-private visibility. If you need class-private, use a closure or a nested class.",[1702,1819,1820,1338,1826,107,1829,107,1832,1835,1836,1839],{},[1705,1821,1822,1825],{},[19,1823,1824],{},"dart:io"," doesn't work on web",[19,1827,1828],{},"File",[19,1830,1831],{},"HttpClient",[19,1833,1834],{},"Platform.exit"," are native-only. Use conditional imports (",[19,1837,1838],{},"if (dart.library.html)",") for cross-platform code.",[1702,1841,1842,1848,1849,1851,1852,999],{},[1705,1843,1844,1847],{},[19,1845,1846],{},"part"," shares the namespace",": files in a ",[19,1850,1846],{}," share the library's namespace (no imports needed between them). But this couples the files — prefer separate libraries with ",[19,1853,409],{},[1702,1855,1856,1866,1867,1870,1871,1754,1873,1875],{},[1705,1857,1858,1754,1860,1862,1863,1865],{},[19,1859,389],{},[19,1861,392],{}," don't affect ",[19,1864,21],{}," private names",": private names (",[19,1868,1869],{},"_x",") aren't exported anyway. ",[19,1872,389],{},[19,1874,392],{}," apply to public names only.",[1702,1877,1878,1338,1884,1887,1888,1891],{},[1705,1879,1880,1883],{},[19,1881,1882],{},"any"," version constraint is discouraged",[19,1885,1886],{},"http: any"," allows any version, leading to unpredictable builds. Use ",[19,1889,1890],{},"^x.y.z"," or a range.",[1702,1893,1894,1901,1902,1904],{},[1705,1895,1896,1897,1900],{},"Exact version (",[19,1898,1899],{},"1.2.3",") is discouraged for libraries",": it forces the app to use exactly that version, causing conflicts. Use ",[19,1903,1890],{}," for libraries.",[1702,1906,1907,1915,1916,1919,1920,1923],{},[1705,1908,1909,1912,1913],{},[19,1910,1911],{},"pub get"," updates ",[19,1914,1799],{},": run ",[19,1917,1918],{},"dart pub get"," after changing ",[19,1921,1922],{},"pubspec.yaml",". Without it, the new dependency isn't downloaded.",[1702,1925,1926,1931,1932,1936,1937,1940,1941,1943,1944,999],{},[1705,1927,1928,1930],{},[19,1929,1734],{}," is convention-private",": users ",[1933,1934,1935],"em",{},"can"," import ",[19,1938,1939],{},"package:my_app\u002Fsrc\u002F..."," (no enforcement), but shouldn't. Keep public API in ",[19,1942,1738],{},", internal in ",[19,1945,1734],{},[1702,1947,1948,1338,1951,1954],{},[1705,1949,1950],{},"Deferred loading is mostly web\u002FFlutter-mobile",[19,1952,1953],{},"deferred"," works on web (code-splitting) and Flutter mobile (deferred components). Not all platforms support it.",[1702,1956,1957,1338,1963,107,1965,107,1967,107,1969,1972,1973,1975],{},[1705,1958,1959,1962],{},[19,1960,1961],{},"dart:core"," is auto-imported",[19,1964,893],{},[19,1966,104],{},[19,1968,888],{},[19,1970,1971],{},"print",", etc. Don't import ",[19,1974,1961],{}," explicitly — it's always available.",[14,1977,1979],{"id":1978},"spot-the-bug","🧠 Spot the Bug",[1981,1982,1983,1984,1986],"p",{},"A developer uses a private class from another file, expecting ",[19,1985,21],{}," to make it inaccessible:",[24,1988,1989],{"language":26},[28,1990,1992],{"className":30,"code":1991,"language":26,"meta":32,"style":32},"\u002F\u002F lib\u002Fsrc\u002Finternal.dart\nclass _Internal {\n  String secret = 'hidden';\n}\n\n\u002F\u002F lib\u002Fapi.dart\nimport 'src\u002Finternal.dart';\n\nclass Api {\n  final internal = _Internal();  \u002F\u002F ✗ compile error\n}\n",[19,1993,1994,1999,2008,2022,2026,2030,2035,2044,2048,2057,2073],{"__ignoreMap":32},[36,1995,1996],{"class":38,"line":39},[36,1997,1998],{"class":42},"\u002F\u002F lib\u002Fsrc\u002Finternal.dart\n",[36,2000,2001,2003,2006],{"class":38,"line":46},[36,2002,81],{"class":80},[36,2004,2005],{"class":84}," _Internal",[36,2007,89],{"class":88},[36,2009,2010,2012,2015,2017,2020],{"class":38,"line":52},[36,2011,128],{"class":84},[36,2013,2014],{"class":88}," secret ",[36,2016,116],{"class":80},[36,2018,2019],{"class":412}," 'hidden'",[36,2021,306],{"class":88},[36,2023,2024],{"class":38,"line":58},[36,2025,194],{"class":88},[36,2027,2028],{"class":38,"line":64},[36,2029,68],{"emptyLinePlaceholder":67},[36,2031,2032],{"class":38,"line":71},[36,2033,2034],{"class":42},"\u002F\u002F lib\u002Fapi.dart\n",[36,2036,2037,2039,2042],{"class":38,"line":77},[36,2038,409],{"class":80},[36,2040,2041],{"class":412}," 'src\u002Finternal.dart'",[36,2043,306],{"class":88},[36,2045,2046],{"class":38,"line":92},[36,2047,68],{"emptyLinePlaceholder":67},[36,2049,2050,2052,2055],{"class":38,"line":125},[36,2051,81],{"class":80},[36,2053,2054],{"class":84}," Api",[36,2056,89],{"class":88},[36,2058,2059,2061,2064,2066,2068,2070],{"class":38,"line":140},[36,2060,95],{"class":80},[36,2062,2063],{"class":88}," internal ",[36,2065,116],{"class":80},[36,2067,2005],{"class":84},[36,2069,619],{"class":88},[36,2071,2072],{"class":42},"\u002F\u002F ✗ compile error\n",[36,2074,2075],{"class":38,"line":145},[36,2076,194],{"class":88},[1981,2078,2079],{},"Why doesn't this compile?",[2081,2082,2083,2087,2111,2117,2273],"details",{},[2084,2085,2086],"summary",{},"Answer",[1981,2088,2089,2092,2093,2096,2097,2100,2101,2104,2105,2107,2108,2110],{},[19,2090,2091],{},"_Internal"," is ",[1705,2094,2095],{},"library-private"," — it's only visible within ",[19,2098,2099],{},"lib\u002Fsrc\u002Finternal.dart"," (the same library\u002Ffile). Importing it into ",[19,2102,2103],{},"lib\u002Fapi.dart"," doesn't make it accessible — ",[19,2106,409],{}," brings in public names, not private (",[19,2109,21],{},"-prefixed) ones.",[1981,2112,2113,2114,2116],{},"The fix — either make the class public (remove ",[19,2115,21],{},"), or export a public wrapper:",[28,2118,2120],{"className":30,"code":2119,"language":26,"meta":32,"style":32},"\u002F\u002F Option 1: make it public (if it should be used by api.dart)\n\u002F\u002F lib\u002Fsrc\u002Finternal.dart\nclass Internal {  \u002F\u002F no underscore — public\n  String secret = 'hidden';\n}\n\n\u002F\u002F Option 2: keep it private, expose via a public API\n\u002F\u002F lib\u002Fsrc\u002Finternal.dart\nclass _Internal {\n  String secret = 'hidden';\n}\n\n\u002F\u002F Public factory\u002Fwrapper that hides the implementation:\nInternal createInternal() => Internal._(_Internal());\nclass Internal {\n  final _Internal _impl;\n  Internal._(this._impl);\n  String get secret => _impl.secret;\n}\n",[19,2121,2122,2127,2131,2143,2155,2159,2163,2168,2172,2180,2192,2196,2200,2205,2227,2235,2244,2256,2269],{"__ignoreMap":32},[36,2123,2124],{"class":38,"line":39},[36,2125,2126],{"class":42},"\u002F\u002F Option 1: make it public (if it should be used by api.dart)\n",[36,2128,2129],{"class":38,"line":46},[36,2130,1998],{"class":42},[36,2132,2133,2135,2138,2140],{"class":38,"line":52},[36,2134,81],{"class":80},[36,2136,2137],{"class":84}," Internal",[36,2139,209],{"class":88},[36,2141,2142],{"class":42},"\u002F\u002F no underscore — public\n",[36,2144,2145,2147,2149,2151,2153],{"class":38,"line":58},[36,2146,128],{"class":84},[36,2148,2014],{"class":88},[36,2150,116],{"class":80},[36,2152,2019],{"class":412},[36,2154,306],{"class":88},[36,2156,2157],{"class":38,"line":64},[36,2158,194],{"class":88},[36,2160,2161],{"class":38,"line":71},[36,2162,68],{"emptyLinePlaceholder":67},[36,2164,2165],{"class":38,"line":77},[36,2166,2167],{"class":42},"\u002F\u002F Option 2: keep it private, expose via a public API\n",[36,2169,2170],{"class":38,"line":92},[36,2171,1998],{"class":42},[36,2173,2174,2176,2178],{"class":38,"line":125},[36,2175,81],{"class":80},[36,2177,2005],{"class":84},[36,2179,89],{"class":88},[36,2181,2182,2184,2186,2188,2190],{"class":38,"line":140},[36,2183,128],{"class":84},[36,2185,2014],{"class":88},[36,2187,116],{"class":80},[36,2189,2019],{"class":412},[36,2191,306],{"class":88},[36,2193,2194],{"class":38,"line":145},[36,2195,194],{"class":88},[36,2197,2198],{"class":38,"line":168},[36,2199,68],{"emptyLinePlaceholder":67},[36,2201,2202],{"class":38,"line":185},[36,2203,2204],{"class":42},"\u002F\u002F Public factory\u002Fwrapper that hides the implementation:\n",[36,2206,2207,2210,2213,2215,2217,2219,2222,2224],{"class":38,"line":191},[36,2208,2209],{"class":84},"Internal",[36,2211,2212],{"class":151}," createInternal",[36,2214,294],{"class":88},[36,2216,297],{"class":80},[36,2218,2137],{"class":84},[36,2220,2221],{"class":88},"._(",[36,2223,2091],{"class":84},[36,2225,2226],{"class":88},"());\n",[36,2228,2229,2231,2233],{"class":38,"line":197},[36,2230,81],{"class":80},[36,2232,2137],{"class":84},[36,2234,89],{"class":88},[36,2236,2237,2239,2241],{"class":38,"line":202},[36,2238,95],{"class":80},[36,2240,2005],{"class":84},[36,2242,2243],{"class":88}," _impl;\n",[36,2245,2246,2249,2251,2253],{"class":38,"line":215},[36,2247,2248],{"class":84},"  Internal",[36,2250,2221],{"class":88},[36,2252,234],{"class":84},[36,2254,2255],{"class":88},"._impl);\n",[36,2257,2258,2260,2262,2264,2266],{"class":38,"line":226},[36,2259,128],{"class":84},[36,2261,867],{"class":80},[36,2263,2014],{"class":88},[36,2265,297],{"class":80},[36,2267,2268],{"class":88}," _impl.secret;\n",[36,2270,2271],{"class":38,"line":240},[36,2272,194],{"class":88},[1981,2274,2275,2277,2278,2281,2282,2284,2285,2287,2288,2290],{},[19,2276,21],{}," privacy is ",[1705,2279,2280],{},"library-level"," (file-level unless using ",[19,2283,1846],{},"), not import-level. A ",[19,2286,21],{},"-prefixed name is invisible to all other libraries, even those that ",[19,2289,409],{}," the file. If you need it in another file, make it public or expose a public wrapper.",[2292,2293,2294],"style",{},"html pre.shiki code .sdCPZ, html code.shiki .sdCPZ{--shiki-default:#6A737D;--shiki-github-dark:#6A737D}html pre.shiki code .svdQ7, html code.shiki .svdQ7{--shiki-default:#D73A49;--shiki-github-dark:#F97583}html pre.shiki code .snvgF, html code.shiki .snvgF{--shiki-default:#005CC5;--shiki-github-dark:#79B8FF}html pre.shiki code .ssxIu, html code.shiki .ssxIu{--shiki-default:#24292E;--shiki-github-dark:#E1E4E8}html pre.shiki code .sIsaT, html code.shiki .sIsaT{--shiki-default:#6F42C1;--shiki-github-dark:#B392F0}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 .github-dark .shiki span {color: var(--shiki-github-dark);background: var(--shiki-github-dark-bg);font-style: var(--shiki-github-dark-font-style);font-weight: var(--shiki-github-dark-font-weight);text-decoration: var(--shiki-github-dark-text-decoration);}html.github-dark .shiki span {color: var(--shiki-github-dark);background: var(--shiki-github-dark-bg);font-style: var(--shiki-github-dark-font-style);font-weight: var(--shiki-github-dark-font-weight);text-decoration: var(--shiki-github-dark-text-decoration);}html pre.shiki code .sJ6F3, html code.shiki .sJ6F3{--shiki-default:#032F62;--shiki-github-dark:#9ECBFF}html pre.shiki code .sk71V, html code.shiki .sk71V{--shiki-default:#22863A;--shiki-github-dark:#85E89D}",{"title":32,"searchDepth":46,"depth":46,"links":2296},[2297,2299,2301,2302,2303,2304,2305,2306,2307,2308],{"id":16,"depth":46,"text":2298},"Library Visibility — The _ Prefix Is Library-Level",{"id":382,"depth":46,"text":2300},"Import Variants — as, show, hide",{"id":629,"depth":46,"text":630},{"id":784,"depth":46,"text":785},{"id":1132,"depth":46,"text":1133},{"id":1294,"depth":46,"text":1295},{"id":1492,"depth":46,"text":1493},{"id":1696,"depth":46,"text":1697},{"id":1803,"depth":46,"text":1804},{"id":1978,"depth":46,"text":1979},"Deep-dive into Dart's library system, conditional imports, barrel files, deferred loading, convention-private visibility, and monorepo dependency patterns. Code-first engineering reference.","md",{},"\u002Fdart\u002F13-packages-and-libraries",{"title":5,"description":2309},"dart\u002F13-packages-and-libraries","AYztV7DHNAy1wAuAmbzdaXc_7izr-5y_LIiiF6UcHpg",1789924647943]