[{"data":1,"prerenderedAt":4099},["ShallowReactive",2],{"page-\u002Fdart\u002F07-classes-and-objects":3},{"id":4,"title":5,"body":6,"description":4092,"extension":4093,"meta":4094,"navigation":57,"path":4095,"seo":4096,"stem":4097,"__hash__":4098},"content\u002Fdart\u002F07-classes-and-objects.md","Dart — Classes, Sealed Hierarchies & Mixin Composition",{"type":7,"value":8,"toc":4079},"minimark",[9,13,18,554,559,948,952,1454,1458,1916,1920,2437,2441,2964,2968,3497,3501,3588,3592,3737,3741,3752,3920,3927,4075],[10,11,5],"h1",{"id":12},"dart-classes-sealed-hierarchies-mixin-composition",[14,15,17],"h2",{"id":16},"const-constructors-canonicalization-immutability","Const Constructors — Canonicalization & Immutability",[19,20,22],"code-wrapper",{"language":21},"dart",[23,24,28],"pre",{"className":25,"code":26,"language":21,"meta":27,"style":27},"language-dart shiki shiki-themes github-light github-dark","\u002F\u002F A const constructor creates compile-time constant instances.\n\u002F\u002F Requirements: all fields final, no body, all constructor params const-eligible.\n\u002F\u002F Benefit: canonicalization — identical const instances are the SAME object.\n\nclass Color {\n  final int r, g, b;\n  const Color(this.r, this.g, this.b);\n\n  \u002F\u002F Static const instances — shared everywhere, zero allocation.\n  static const red = Color(255, 0, 0);\n  static const green = Color(0, 255, 0);\n  static const blue = Color(0, 0, 255);\n\n  @override\n  bool operator ==(Object other) =>\n      other is Color && r == other.r && g == other.g && b == other.b;\n\n  @override\n  int get hashCode => Object.hash(r, g, b);\n}\n\nvoid main() {\n  const a = Color(255, 0, 0);\n  const b = Color(255, 0, 0);\n  print(identical(a, b));  \u002F\u002F true — same object (canonicalized at compile time)\n  print(a == b);           \u002F\u002F true — value equality (overridden)\n\n  final c = Color(255, 0, 0);  \u002F\u002F non-const — runtime allocation\n  final d = Color(255, 0, 0);  \u002F\u002F non-const — another allocation\n  print(identical(c, d));  \u002F\u002F false — distinct heap objects\n  print(c == d);           \u002F\u002F true — value equality (overridden)\n\n  \u002F\u002F const in a non-const context: `const Color(...)` is always canonicalized,\n  \u002F\u002F `Color(...)` (no const) always allocates. Use const for fixed values.\n}\n","",[29,30,31,40,46,52,59,74,86,113,118,124,159,187,215,220,226,249,293,298,303,331,337,342,354,380,405,422,438,443,473,502,517,532,537,543,549],"code",{"__ignoreMap":27},[32,33,36],"span",{"class":34,"line":35},"line",1,[32,37,39],{"class":38},"sdCPZ","\u002F\u002F A const constructor creates compile-time constant instances.\n",[32,41,43],{"class":34,"line":42},2,[32,44,45],{"class":38},"\u002F\u002F Requirements: all fields final, no body, all constructor params const-eligible.\n",[32,47,49],{"class":34,"line":48},3,[32,50,51],{"class":38},"\u002F\u002F Benefit: canonicalization — identical const instances are the SAME object.\n",[32,53,55],{"class":34,"line":54},4,[32,56,58],{"emptyLinePlaceholder":57},true,"\n",[32,60,62,66,70],{"class":34,"line":61},5,[32,63,65],{"class":64},"svdQ7","class",[32,67,69],{"class":68},"snvgF"," Color",[32,71,73],{"class":72},"ssxIu"," {\n",[32,75,77,80,83],{"class":34,"line":76},6,[32,78,79],{"class":64},"  final",[32,81,82],{"class":68}," int",[32,84,85],{"class":72}," r, g, b;\n",[32,87,89,92,94,97,100,103,105,108,110],{"class":34,"line":88},7,[32,90,91],{"class":64},"  const",[32,93,69],{"class":68},[32,95,96],{"class":72},"(",[32,98,99],{"class":68},"this",[32,101,102],{"class":72},".r, ",[32,104,99],{"class":68},[32,106,107],{"class":72},".g, ",[32,109,99],{"class":68},[32,111,112],{"class":72},".b);\n",[32,114,116],{"class":34,"line":115},8,[32,117,58],{"emptyLinePlaceholder":57},[32,119,121],{"class":34,"line":120},9,[32,122,123],{"class":38},"  \u002F\u002F Static const instances — shared everywhere, zero allocation.\n",[32,125,127,130,133,136,139,141,143,146,149,152,154,156],{"class":34,"line":126},10,[32,128,129],{"class":64},"  static",[32,131,132],{"class":64}," const",[32,134,135],{"class":72}," red ",[32,137,138],{"class":64},"=",[32,140,69],{"class":68},[32,142,96],{"class":72},[32,144,145],{"class":68},"255",[32,147,148],{"class":72},", ",[32,150,151],{"class":68},"0",[32,153,148],{"class":72},[32,155,151],{"class":68},[32,157,158],{"class":72},");\n",[32,160,162,164,166,169,171,173,175,177,179,181,183,185],{"class":34,"line":161},11,[32,163,129],{"class":64},[32,165,132],{"class":64},[32,167,168],{"class":72}," green ",[32,170,138],{"class":64},[32,172,69],{"class":68},[32,174,96],{"class":72},[32,176,151],{"class":68},[32,178,148],{"class":72},[32,180,145],{"class":68},[32,182,148],{"class":72},[32,184,151],{"class":68},[32,186,158],{"class":72},[32,188,190,192,194,197,199,201,203,205,207,209,211,213],{"class":34,"line":189},12,[32,191,129],{"class":64},[32,193,132],{"class":64},[32,195,196],{"class":72}," blue ",[32,198,138],{"class":64},[32,200,69],{"class":68},[32,202,96],{"class":72},[32,204,151],{"class":68},[32,206,148],{"class":72},[32,208,151],{"class":68},[32,210,148],{"class":72},[32,212,145],{"class":68},[32,214,158],{"class":72},[32,216,218],{"class":34,"line":217},13,[32,219,58],{"emptyLinePlaceholder":57},[32,221,223],{"class":34,"line":222},14,[32,224,225],{"class":64},"  @override\n",[32,227,229,232,235,238,240,243,246],{"class":34,"line":228},15,[32,230,231],{"class":68},"  bool",[32,233,234],{"class":64}," operator",[32,236,237],{"class":64}," ==",[32,239,96],{"class":72},[32,241,242],{"class":68},"Object",[32,244,245],{"class":72}," other) ",[32,247,248],{"class":64},"=>\n",[32,250,252,255,258,260,263,266,269,272,275,278,280,283,285,288,290],{"class":34,"line":251},16,[32,253,254],{"class":72},"      other ",[32,256,257],{"class":64},"is",[32,259,69],{"class":68},[32,261,262],{"class":64}," &&",[32,264,265],{"class":72}," r ",[32,267,268],{"class":64},"==",[32,270,271],{"class":72}," other.r ",[32,273,274],{"class":64},"&&",[32,276,277],{"class":72}," g ",[32,279,268],{"class":64},[32,281,282],{"class":72}," other.g ",[32,284,274],{"class":64},[32,286,287],{"class":72}," b ",[32,289,268],{"class":64},[32,291,292],{"class":72}," other.b;\n",[32,294,296],{"class":34,"line":295},17,[32,297,58],{"emptyLinePlaceholder":57},[32,299,301],{"class":34,"line":300},18,[32,302,225],{"class":64},[32,304,306,309,312,315,318,321,324,328],{"class":34,"line":305},19,[32,307,308],{"class":68},"  int",[32,310,311],{"class":64}," get",[32,313,314],{"class":72}," hashCode ",[32,316,317],{"class":64},"=>",[32,319,320],{"class":68}," Object",[32,322,323],{"class":72},".",[32,325,327],{"class":326},"sIsaT","hash",[32,329,330],{"class":72},"(r, g, b);\n",[32,332,334],{"class":34,"line":333},20,[32,335,336],{"class":72},"}\n",[32,338,340],{"class":34,"line":339},21,[32,341,58],{"emptyLinePlaceholder":57},[32,343,345,348,351],{"class":34,"line":344},22,[32,346,347],{"class":64},"void",[32,349,350],{"class":326}," main",[32,352,353],{"class":72},"() {\n",[32,355,357,359,362,364,366,368,370,372,374,376,378],{"class":34,"line":356},23,[32,358,91],{"class":64},[32,360,361],{"class":72}," a ",[32,363,138],{"class":64},[32,365,69],{"class":68},[32,367,96],{"class":72},[32,369,145],{"class":68},[32,371,148],{"class":72},[32,373,151],{"class":68},[32,375,148],{"class":72},[32,377,151],{"class":68},[32,379,158],{"class":72},[32,381,383,385,387,389,391,393,395,397,399,401,403],{"class":34,"line":382},24,[32,384,91],{"class":64},[32,386,287],{"class":72},[32,388,138],{"class":64},[32,390,69],{"class":68},[32,392,96],{"class":72},[32,394,145],{"class":68},[32,396,148],{"class":72},[32,398,151],{"class":68},[32,400,148],{"class":72},[32,402,151],{"class":68},[32,404,158],{"class":72},[32,406,408,411,413,416,419],{"class":34,"line":407},25,[32,409,410],{"class":326},"  print",[32,412,96],{"class":72},[32,414,415],{"class":326},"identical",[32,417,418],{"class":72},"(a, b));  ",[32,420,421],{"class":38},"\u002F\u002F true — same object (canonicalized at compile time)\n",[32,423,425,427,430,432,435],{"class":34,"line":424},26,[32,426,410],{"class":326},[32,428,429],{"class":72},"(a ",[32,431,268],{"class":64},[32,433,434],{"class":72}," b);           ",[32,436,437],{"class":38},"\u002F\u002F true — value equality (overridden)\n",[32,439,441],{"class":34,"line":440},27,[32,442,58],{"emptyLinePlaceholder":57},[32,444,446,448,451,453,455,457,459,461,463,465,467,470],{"class":34,"line":445},28,[32,447,79],{"class":64},[32,449,450],{"class":72}," c ",[32,452,138],{"class":64},[32,454,69],{"class":68},[32,456,96],{"class":72},[32,458,145],{"class":68},[32,460,148],{"class":72},[32,462,151],{"class":68},[32,464,148],{"class":72},[32,466,151],{"class":68},[32,468,469],{"class":72},");  ",[32,471,472],{"class":38},"\u002F\u002F non-const — runtime allocation\n",[32,474,476,478,481,483,485,487,489,491,493,495,497,499],{"class":34,"line":475},29,[32,477,79],{"class":64},[32,479,480],{"class":72}," d ",[32,482,138],{"class":64},[32,484,69],{"class":68},[32,486,96],{"class":72},[32,488,145],{"class":68},[32,490,148],{"class":72},[32,492,151],{"class":68},[32,494,148],{"class":72},[32,496,151],{"class":68},[32,498,469],{"class":72},[32,500,501],{"class":38},"\u002F\u002F non-const — another allocation\n",[32,503,505,507,509,511,514],{"class":34,"line":504},30,[32,506,410],{"class":326},[32,508,96],{"class":72},[32,510,415],{"class":326},[32,512,513],{"class":72},"(c, d));  ",[32,515,516],{"class":38},"\u002F\u002F false — distinct heap objects\n",[32,518,520,522,525,527,530],{"class":34,"line":519},31,[32,521,410],{"class":326},[32,523,524],{"class":72},"(c ",[32,526,268],{"class":64},[32,528,529],{"class":72}," d);           ",[32,531,437],{"class":38},[32,533,535],{"class":34,"line":534},32,[32,536,58],{"emptyLinePlaceholder":57},[32,538,540],{"class":34,"line":539},33,[32,541,542],{"class":38},"  \u002F\u002F const in a non-const context: `const Color(...)` is always canonicalized,\n",[32,544,546],{"class":34,"line":545},34,[32,547,548],{"class":38},"  \u002F\u002F `Color(...)` (no const) always allocates. Use const for fixed values.\n",[32,550,552],{"class":34,"line":551},35,[32,553,336],{"class":72},[555,556,558],"h3",{"id":557},"the-value-equality-trap","The Value Equality Trap",[19,560,561],{"language":21},[23,562,564],{"className":25,"code":563,"language":21,"meta":27,"style":27},"\u002F\u002F ❌ Anti-pattern: a \"value class\" without == \u002F hashCode override.\nclass PointBad {\n  final double x, y;\n  const PointBad(this.x, this.y);\n}\n\nvar a = PointBad(1, 2);\nvar b = PointBad(1, 2);\nprint(a == b);  \u002F\u002F false — default == is identity (different objects)\nprint({a, b}.length);  \u002F\u002F 2 — both in the Set (different hashes by default)\n\n\u002F\u002F ✓ Correct: override == and hashCode together (consistency required).\nclass Point {\n  final double x, y;\n  const Point(this.x, this.y);\n\n  @override\n  bool operator ==(Object other) =>\n      other is Point && x == other.x && y == other.y;\n\n  @override\n  int get hashCode => Object.hash(x, y);  \u002F\u002F must be consistent with ==\n}\n\nvar a2 = Point(1, 2);\nvar b2 = Point(1, 2);\nprint(a2 == b2);  \u002F\u002F true — value equality\nprint({a2, b2}.length);  \u002F\u002F 1 — same hash, same == → deduplicated in Set\n\n\u002F\u002F Or use records (Dart 3) for automatic value equality:\nvar ra = (1.0, 2.0);\nvar rb = (1.0, 2.0);\nprint(ra == rb);  \u002F\u002F true — structural equality built in, no override needed\n",[29,565,566,571,580,590,608,612,616,639,659,674,684,688,693,702,710,726,730,734,750,778,782,786,808,812,816,837,858,873,883,887,892,914,933],{"__ignoreMap":27},[32,567,568],{"class":34,"line":35},[32,569,570],{"class":38},"\u002F\u002F ❌ Anti-pattern: a \"value class\" without == \u002F hashCode override.\n",[32,572,573,575,578],{"class":34,"line":42},[32,574,65],{"class":64},[32,576,577],{"class":68}," PointBad",[32,579,73],{"class":72},[32,581,582,584,587],{"class":34,"line":48},[32,583,79],{"class":64},[32,585,586],{"class":68}," double",[32,588,589],{"class":72}," x, y;\n",[32,591,592,594,596,598,600,603,605],{"class":34,"line":54},[32,593,91],{"class":64},[32,595,577],{"class":68},[32,597,96],{"class":72},[32,599,99],{"class":68},[32,601,602],{"class":72},".x, ",[32,604,99],{"class":68},[32,606,607],{"class":72},".y);\n",[32,609,610],{"class":34,"line":61},[32,611,336],{"class":72},[32,613,614],{"class":34,"line":76},[32,615,58],{"emptyLinePlaceholder":57},[32,617,618,621,623,625,627,629,632,634,637],{"class":34,"line":88},[32,619,620],{"class":64},"var",[32,622,361],{"class":72},[32,624,138],{"class":64},[32,626,577],{"class":68},[32,628,96],{"class":72},[32,630,631],{"class":68},"1",[32,633,148],{"class":72},[32,635,636],{"class":68},"2",[32,638,158],{"class":72},[32,640,641,643,645,647,649,651,653,655,657],{"class":34,"line":115},[32,642,620],{"class":64},[32,644,287],{"class":72},[32,646,138],{"class":64},[32,648,577],{"class":68},[32,650,96],{"class":72},[32,652,631],{"class":68},[32,654,148],{"class":72},[32,656,636],{"class":68},[32,658,158],{"class":72},[32,660,661,664,666,668,671],{"class":34,"line":120},[32,662,663],{"class":326},"print",[32,665,429],{"class":72},[32,667,268],{"class":64},[32,669,670],{"class":72}," b);  ",[32,672,673],{"class":38},"\u002F\u002F false — default == is identity (different objects)\n",[32,675,676,678,681],{"class":34,"line":126},[32,677,663],{"class":326},[32,679,680],{"class":72},"({a, b}.length);  ",[32,682,683],{"class":38},"\u002F\u002F 2 — both in the Set (different hashes by default)\n",[32,685,686],{"class":34,"line":161},[32,687,58],{"emptyLinePlaceholder":57},[32,689,690],{"class":34,"line":189},[32,691,692],{"class":38},"\u002F\u002F ✓ Correct: override == and hashCode together (consistency required).\n",[32,694,695,697,700],{"class":34,"line":217},[32,696,65],{"class":64},[32,698,699],{"class":68}," Point",[32,701,73],{"class":72},[32,703,704,706,708],{"class":34,"line":222},[32,705,79],{"class":64},[32,707,586],{"class":68},[32,709,589],{"class":72},[32,711,712,714,716,718,720,722,724],{"class":34,"line":228},[32,713,91],{"class":64},[32,715,699],{"class":68},[32,717,96],{"class":72},[32,719,99],{"class":68},[32,721,602],{"class":72},[32,723,99],{"class":68},[32,725,607],{"class":72},[32,727,728],{"class":34,"line":251},[32,729,58],{"emptyLinePlaceholder":57},[32,731,732],{"class":34,"line":295},[32,733,225],{"class":64},[32,735,736,738,740,742,744,746,748],{"class":34,"line":300},[32,737,231],{"class":68},[32,739,234],{"class":64},[32,741,237],{"class":64},[32,743,96],{"class":72},[32,745,242],{"class":68},[32,747,245],{"class":72},[32,749,248],{"class":64},[32,751,752,754,756,758,760,763,765,768,770,773,775],{"class":34,"line":305},[32,753,254],{"class":72},[32,755,257],{"class":64},[32,757,699],{"class":68},[32,759,262],{"class":64},[32,761,762],{"class":72}," x ",[32,764,268],{"class":64},[32,766,767],{"class":72}," other.x ",[32,769,274],{"class":64},[32,771,772],{"class":72}," y ",[32,774,268],{"class":64},[32,776,777],{"class":72}," other.y;\n",[32,779,780],{"class":34,"line":333},[32,781,58],{"emptyLinePlaceholder":57},[32,783,784],{"class":34,"line":339},[32,785,225],{"class":64},[32,787,788,790,792,794,796,798,800,802,805],{"class":34,"line":344},[32,789,308],{"class":68},[32,791,311],{"class":64},[32,793,314],{"class":72},[32,795,317],{"class":64},[32,797,320],{"class":68},[32,799,323],{"class":72},[32,801,327],{"class":326},[32,803,804],{"class":72},"(x, y);  ",[32,806,807],{"class":38},"\u002F\u002F must be consistent with ==\n",[32,809,810],{"class":34,"line":356},[32,811,336],{"class":72},[32,813,814],{"class":34,"line":382},[32,815,58],{"emptyLinePlaceholder":57},[32,817,818,820,823,825,827,829,831,833,835],{"class":34,"line":407},[32,819,620],{"class":64},[32,821,822],{"class":72}," a2 ",[32,824,138],{"class":64},[32,826,699],{"class":68},[32,828,96],{"class":72},[32,830,631],{"class":68},[32,832,148],{"class":72},[32,834,636],{"class":68},[32,836,158],{"class":72},[32,838,839,841,844,846,848,850,852,854,856],{"class":34,"line":424},[32,840,620],{"class":64},[32,842,843],{"class":72}," b2 ",[32,845,138],{"class":64},[32,847,699],{"class":68},[32,849,96],{"class":72},[32,851,631],{"class":68},[32,853,148],{"class":72},[32,855,636],{"class":68},[32,857,158],{"class":72},[32,859,860,862,865,867,870],{"class":34,"line":440},[32,861,663],{"class":326},[32,863,864],{"class":72},"(a2 ",[32,866,268],{"class":64},[32,868,869],{"class":72}," b2);  ",[32,871,872],{"class":38},"\u002F\u002F true — value equality\n",[32,874,875,877,880],{"class":34,"line":445},[32,876,663],{"class":326},[32,878,879],{"class":72},"({a2, b2}.length);  ",[32,881,882],{"class":38},"\u002F\u002F 1 — same hash, same == → deduplicated in Set\n",[32,884,885],{"class":34,"line":475},[32,886,58],{"emptyLinePlaceholder":57},[32,888,889],{"class":34,"line":504},[32,890,891],{"class":38},"\u002F\u002F Or use records (Dart 3) for automatic value equality:\n",[32,893,894,896,899,901,904,907,909,912],{"class":34,"line":519},[32,895,620],{"class":64},[32,897,898],{"class":72}," ra ",[32,900,138],{"class":64},[32,902,903],{"class":72}," (",[32,905,906],{"class":68},"1.0",[32,908,148],{"class":72},[32,910,911],{"class":68},"2.0",[32,913,158],{"class":72},[32,915,916,918,921,923,925,927,929,931],{"class":34,"line":534},[32,917,620],{"class":64},[32,919,920],{"class":72}," rb ",[32,922,138],{"class":64},[32,924,903],{"class":72},[32,926,906],{"class":68},[32,928,148],{"class":72},[32,930,911],{"class":68},[32,932,158],{"class":72},[32,934,935,937,940,942,945],{"class":34,"line":539},[32,936,663],{"class":326},[32,938,939],{"class":72},"(ra ",[32,941,268],{"class":64},[32,943,944],{"class":72}," rb);  ",[32,946,947],{"class":38},"\u002F\u002F true — structural equality built in, no override needed\n",[14,949,951],{"id":950},"sealed-classes-closed-hierarchies-exhaustiveness","Sealed Classes — Closed Hierarchies & Exhaustiveness",[19,953,954],{"language":21},[23,955,957],{"className":25,"code":956,"language":21,"meta":27,"style":27},"\u002F\u002F sealed: all direct subtypes must be in the same library. The compiler\n\u002F\u002F knows the complete set → exhaustive switches without `default`.\n\u002F\u002F Adding a subtype → compile error at every non-exhaustive switch.\n\nsealed class Result\u003CT> {\n  const Result();\n}\n\nclass Success\u003CT> extends Result\u003CT> {\n  final T value;\n  const Success(this.value);\n}\n\nclass Failure\u003CT> extends Result\u003CT> {\n  final String error;\n  const Failure(this.error);\n}\n\n\u002F\u002F Pattern matching with destructuring — no casts, no defaults:\nT unwrap\u003CT>(Result\u003CT> r) => switch (r) {\n  Success(:final value) => value,  \u002F\u002F destructures .value directly\n  Failure(:final error) => throw Exception(error),\n};\n\n\u002F\u002F Exhaustiveness: if you add `class Loading\u003CT> extends Result\u003CT> {}`,\n\u002F\u002F this switch becomes a compile error: \"Loading not handled.\"\n\n\u002F\u002F Real-world: state machines, AST nodes, Either\u002FOption types.\nsealed class AppState {}\nclass Idle extends AppState {}\nclass Loading extends AppState {}\nclass Loaded\u003CT> extends AppState { final T data; Loaded(this.data); }\nclass Error extends AppState { final String message; Error(this.message); }\n\nWidget renderState(AppState state) => switch (state) {\n  Idle() => Text('Idle'),\n  Loading() => CircularProgressIndicator(),\n  Loaded(:final data) => DataWidget(data),\n  Error(:final message) => ErrorWidget(message),\n};\n",[29,958,959,964,969,974,978,998,1007,1011,1015,1040,1050,1063,1067,1071,1094,1104,1117,1121,1125,1130,1162,1183,1206,1211,1215,1220,1225,1229,1234,1246,1260,1273,1311,1341,1345,1368,1391,1407,1428,1449],{"__ignoreMap":27},[32,960,961],{"class":34,"line":35},[32,962,963],{"class":38},"\u002F\u002F sealed: all direct subtypes must be in the same library. The compiler\n",[32,965,966],{"class":34,"line":42},[32,967,968],{"class":38},"\u002F\u002F knows the complete set → exhaustive switches without `default`.\n",[32,970,971],{"class":34,"line":48},[32,972,973],{"class":38},"\u002F\u002F Adding a subtype → compile error at every non-exhaustive switch.\n",[32,975,976],{"class":34,"line":54},[32,977,58],{"emptyLinePlaceholder":57},[32,979,980,983,986,989,992,995],{"class":34,"line":61},[32,981,982],{"class":64},"sealed",[32,984,985],{"class":64}," class",[32,987,988],{"class":68}," Result",[32,990,991],{"class":72},"\u003C",[32,993,994],{"class":68},"T",[32,996,997],{"class":72},"> {\n",[32,999,1000,1002,1004],{"class":34,"line":76},[32,1001,91],{"class":64},[32,1003,988],{"class":68},[32,1005,1006],{"class":72},"();\n",[32,1008,1009],{"class":34,"line":88},[32,1010,336],{"class":72},[32,1012,1013],{"class":34,"line":115},[32,1014,58],{"emptyLinePlaceholder":57},[32,1016,1017,1019,1022,1024,1026,1029,1032,1034,1036,1038],{"class":34,"line":120},[32,1018,65],{"class":64},[32,1020,1021],{"class":68}," Success",[32,1023,991],{"class":72},[32,1025,994],{"class":68},[32,1027,1028],{"class":72},"> ",[32,1030,1031],{"class":64},"extends",[32,1033,988],{"class":68},[32,1035,991],{"class":72},[32,1037,994],{"class":68},[32,1039,997],{"class":72},[32,1041,1042,1044,1047],{"class":34,"line":126},[32,1043,79],{"class":64},[32,1045,1046],{"class":68}," T",[32,1048,1049],{"class":72}," value;\n",[32,1051,1052,1054,1056,1058,1060],{"class":34,"line":161},[32,1053,91],{"class":64},[32,1055,1021],{"class":68},[32,1057,96],{"class":72},[32,1059,99],{"class":68},[32,1061,1062],{"class":72},".value);\n",[32,1064,1065],{"class":34,"line":189},[32,1066,336],{"class":72},[32,1068,1069],{"class":34,"line":217},[32,1070,58],{"emptyLinePlaceholder":57},[32,1072,1073,1075,1078,1080,1082,1084,1086,1088,1090,1092],{"class":34,"line":222},[32,1074,65],{"class":64},[32,1076,1077],{"class":68}," Failure",[32,1079,991],{"class":72},[32,1081,994],{"class":68},[32,1083,1028],{"class":72},[32,1085,1031],{"class":64},[32,1087,988],{"class":68},[32,1089,991],{"class":72},[32,1091,994],{"class":68},[32,1093,997],{"class":72},[32,1095,1096,1098,1101],{"class":34,"line":228},[32,1097,79],{"class":64},[32,1099,1100],{"class":68}," String",[32,1102,1103],{"class":72}," error;\n",[32,1105,1106,1108,1110,1112,1114],{"class":34,"line":251},[32,1107,91],{"class":64},[32,1109,1077],{"class":68},[32,1111,96],{"class":72},[32,1113,99],{"class":68},[32,1115,1116],{"class":72},".error);\n",[32,1118,1119],{"class":34,"line":295},[32,1120,336],{"class":72},[32,1122,1123],{"class":34,"line":300},[32,1124,58],{"emptyLinePlaceholder":57},[32,1126,1127],{"class":34,"line":305},[32,1128,1129],{"class":38},"\u002F\u002F Pattern matching with destructuring — no casts, no defaults:\n",[32,1131,1132,1134,1137,1139,1141,1144,1147,1149,1151,1154,1156,1159],{"class":34,"line":333},[32,1133,994],{"class":68},[32,1135,1136],{"class":326}," unwrap",[32,1138,991],{"class":72},[32,1140,994],{"class":68},[32,1142,1143],{"class":72},">(",[32,1145,1146],{"class":68},"Result",[32,1148,991],{"class":72},[32,1150,994],{"class":68},[32,1152,1153],{"class":72},"> r) ",[32,1155,317],{"class":64},[32,1157,1158],{"class":64}," switch",[32,1160,1161],{"class":72}," (r) {\n",[32,1163,1164,1167,1169,1172,1175,1177,1180],{"class":34,"line":339},[32,1165,1166],{"class":68},"  Success",[32,1168,96],{"class":72},[32,1170,1171],{"class":64},":final",[32,1173,1174],{"class":72}," value) ",[32,1176,317],{"class":64},[32,1178,1179],{"class":72}," value,  ",[32,1181,1182],{"class":38},"\u002F\u002F destructures .value directly\n",[32,1184,1185,1188,1190,1192,1195,1197,1200,1203],{"class":34,"line":344},[32,1186,1187],{"class":68},"  Failure",[32,1189,96],{"class":72},[32,1191,1171],{"class":64},[32,1193,1194],{"class":72}," error) ",[32,1196,317],{"class":64},[32,1198,1199],{"class":64}," throw",[32,1201,1202],{"class":68}," Exception",[32,1204,1205],{"class":72},"(error),\n",[32,1207,1208],{"class":34,"line":356},[32,1209,1210],{"class":72},"};\n",[32,1212,1213],{"class":34,"line":382},[32,1214,58],{"emptyLinePlaceholder":57},[32,1216,1217],{"class":34,"line":407},[32,1218,1219],{"class":38},"\u002F\u002F Exhaustiveness: if you add `class Loading\u003CT> extends Result\u003CT> {}`,\n",[32,1221,1222],{"class":34,"line":424},[32,1223,1224],{"class":38},"\u002F\u002F this switch becomes a compile error: \"Loading not handled.\"\n",[32,1226,1227],{"class":34,"line":440},[32,1228,58],{"emptyLinePlaceholder":57},[32,1230,1231],{"class":34,"line":445},[32,1232,1233],{"class":38},"\u002F\u002F Real-world: state machines, AST nodes, Either\u002FOption types.\n",[32,1235,1236,1238,1240,1243],{"class":34,"line":475},[32,1237,982],{"class":64},[32,1239,985],{"class":64},[32,1241,1242],{"class":68}," AppState",[32,1244,1245],{"class":72}," {}\n",[32,1247,1248,1250,1253,1256,1258],{"class":34,"line":504},[32,1249,65],{"class":64},[32,1251,1252],{"class":68}," Idle",[32,1254,1255],{"class":64}," extends",[32,1257,1242],{"class":68},[32,1259,1245],{"class":72},[32,1261,1262,1264,1267,1269,1271],{"class":34,"line":519},[32,1263,65],{"class":64},[32,1265,1266],{"class":68}," Loading",[32,1268,1255],{"class":64},[32,1270,1242],{"class":68},[32,1272,1245],{"class":72},[32,1274,1275,1277,1280,1282,1284,1286,1288,1290,1293,1296,1298,1301,1304,1306,1308],{"class":34,"line":534},[32,1276,65],{"class":64},[32,1278,1279],{"class":68}," Loaded",[32,1281,991],{"class":72},[32,1283,994],{"class":68},[32,1285,1028],{"class":72},[32,1287,1031],{"class":64},[32,1289,1242],{"class":68},[32,1291,1292],{"class":72}," { ",[32,1294,1295],{"class":64},"final",[32,1297,1046],{"class":68},[32,1299,1300],{"class":72}," data; ",[32,1302,1303],{"class":68},"Loaded",[32,1305,96],{"class":72},[32,1307,99],{"class":68},[32,1309,1310],{"class":72},".data); }\n",[32,1312,1313,1315,1318,1320,1322,1324,1326,1328,1331,1334,1336,1338],{"class":34,"line":539},[32,1314,65],{"class":64},[32,1316,1317],{"class":68}," Error",[32,1319,1255],{"class":64},[32,1321,1242],{"class":68},[32,1323,1292],{"class":72},[32,1325,1295],{"class":64},[32,1327,1100],{"class":68},[32,1329,1330],{"class":72}," message; ",[32,1332,1333],{"class":68},"Error",[32,1335,96],{"class":72},[32,1337,99],{"class":68},[32,1339,1340],{"class":72},".message); }\n",[32,1342,1343],{"class":34,"line":545},[32,1344,58],{"emptyLinePlaceholder":57},[32,1346,1347,1350,1353,1355,1358,1361,1363,1365],{"class":34,"line":551},[32,1348,1349],{"class":68},"Widget",[32,1351,1352],{"class":326}," renderState",[32,1354,96],{"class":72},[32,1356,1357],{"class":68},"AppState",[32,1359,1360],{"class":72}," state) ",[32,1362,317],{"class":64},[32,1364,1158],{"class":64},[32,1366,1367],{"class":72}," (state) {\n",[32,1369,1371,1374,1377,1379,1382,1384,1388],{"class":34,"line":1370},36,[32,1372,1373],{"class":68},"  Idle",[32,1375,1376],{"class":72},"() ",[32,1378,317],{"class":64},[32,1380,1381],{"class":68}," Text",[32,1383,96],{"class":72},[32,1385,1387],{"class":1386},"sJ6F3","'Idle'",[32,1389,1390],{"class":72},"),\n",[32,1392,1394,1397,1399,1401,1404],{"class":34,"line":1393},37,[32,1395,1396],{"class":68},"  Loading",[32,1398,1376],{"class":72},[32,1400,317],{"class":64},[32,1402,1403],{"class":68}," CircularProgressIndicator",[32,1405,1406],{"class":72},"(),\n",[32,1408,1410,1413,1415,1417,1420,1422,1425],{"class":34,"line":1409},38,[32,1411,1412],{"class":68},"  Loaded",[32,1414,96],{"class":72},[32,1416,1171],{"class":64},[32,1418,1419],{"class":72}," data) ",[32,1421,317],{"class":64},[32,1423,1424],{"class":68}," DataWidget",[32,1426,1427],{"class":72},"(data),\n",[32,1429,1431,1434,1436,1438,1441,1443,1446],{"class":34,"line":1430},39,[32,1432,1433],{"class":68},"  Error",[32,1435,96],{"class":72},[32,1437,1171],{"class":64},[32,1439,1440],{"class":72}," message) ",[32,1442,317],{"class":64},[32,1444,1445],{"class":68}," ErrorWidget",[32,1447,1448],{"class":72},"(message),\n",[32,1450,1452],{"class":34,"line":1451},40,[32,1453,1210],{"class":72},[14,1455,1457],{"id":1456},"mixins-linearization-constraints","Mixins — Linearization & Constraints",[19,1459,1460],{"language":21},[23,1461,1463],{"className":25,"code":1462,"language":21,"meta":27,"style":27},"\u002F\u002F Mixins provide reusable implementation across unrelated class hierarchies.\n\u002F\u002F Dart has single inheritance — mixins fill the multiple-inheritance gap.\n\u002F\u002F Mixins can't have constructors (applied via `with`, not instantiated).\n\nmixin Drawable {\n  void draw() => print('Drawing $this');\n\n  \u002F\u002F Mixin can define fields — they become part of the applying class.\n  bool _dirty = true;\n  void markDirty() => _dirty = true;\n  void markClean() => _dirty = false;\n}\n\nmixin Loggable {\n  void log(String msg) => print('[$runtimeType] $msg');\n}\n\n\u002F\u002F `on` constraint: the mixin can only be applied to subclasses of the constraint.\n\u002F\u002F This gives the mixin access to the constraint's methods.\nmixin disposableView on StatefulWidget {\n  void registerDispose(void Function() fn) {\n    \u002F\u002F Can access State methods because of the `on` constraint.\n    \u002F\u002F addCallback(() => fn());\n  }\n}\n\n\u002F\u002F Multiple mixins — applied left-to-right (linearization):\nclass Canvas with Drawable, Loggable {\n  final String name;\n  Canvas(this.name);\n\n  @override\n  String toString() => 'Canvas($name)';\n}\n\nvar canvas = Canvas('main');\ncanvas.draw();  \u002F\u002F 'Drawing Canvas(main)' — from Drawable\ncanvas.log('Created');  \u002F\u002F '[Canvas] Created' — from Loggable\n\n\u002F\u002F ❌ Anti-pattern: mixins with state that conflict.\nmixin A { int value = 1; }\nmixin B { int value = 2; }\n\u002F\u002F class C with A, B { }  \u002F\u002F compile error: value is defined in both A and B\n",[29,1464,1465,1470,1475,1480,1484,1494,1524,1528,1533,1548,1567,1587,1591,1595,1604,1645,1649,1653,1658,1663,1678,1695,1700,1705,1710,1714,1718,1723,1742,1751,1763,1767,1771,1796,1800,1804,1822,1836,1853,1857,1862,1886,1907],{"__ignoreMap":27},[32,1466,1467],{"class":34,"line":35},[32,1468,1469],{"class":38},"\u002F\u002F Mixins provide reusable implementation across unrelated class hierarchies.\n",[32,1471,1472],{"class":34,"line":42},[32,1473,1474],{"class":38},"\u002F\u002F Dart has single inheritance — mixins fill the multiple-inheritance gap.\n",[32,1476,1477],{"class":34,"line":48},[32,1478,1479],{"class":38},"\u002F\u002F Mixins can't have constructors (applied via `with`, not instantiated).\n",[32,1481,1482],{"class":34,"line":54},[32,1483,58],{"emptyLinePlaceholder":57},[32,1485,1486,1489,1492],{"class":34,"line":61},[32,1487,1488],{"class":64},"mixin",[32,1490,1491],{"class":68}," Drawable",[32,1493,73],{"class":72},[32,1495,1496,1499,1502,1504,1506,1509,1511,1514,1517,1519,1522],{"class":34,"line":76},[32,1497,1498],{"class":64},"  void",[32,1500,1501],{"class":326}," draw",[32,1503,1376],{"class":72},[32,1505,317],{"class":64},[32,1507,1508],{"class":326}," print",[32,1510,96],{"class":72},[32,1512,1513],{"class":1386},"'Drawing ",[32,1515,1516],{"class":1386},"$",[32,1518,99],{"class":68},[32,1520,1521],{"class":1386},"'",[32,1523,158],{"class":72},[32,1525,1526],{"class":34,"line":88},[32,1527,58],{"emptyLinePlaceholder":57},[32,1529,1530],{"class":34,"line":115},[32,1531,1532],{"class":38},"  \u002F\u002F Mixin can define fields — they become part of the applying class.\n",[32,1534,1535,1537,1540,1542,1545],{"class":34,"line":120},[32,1536,231],{"class":68},[32,1538,1539],{"class":72}," _dirty ",[32,1541,138],{"class":64},[32,1543,1544],{"class":68}," true",[32,1546,1547],{"class":72},";\n",[32,1549,1550,1552,1555,1557,1559,1561,1563,1565],{"class":34,"line":126},[32,1551,1498],{"class":64},[32,1553,1554],{"class":326}," markDirty",[32,1556,1376],{"class":72},[32,1558,317],{"class":64},[32,1560,1539],{"class":72},[32,1562,138],{"class":64},[32,1564,1544],{"class":68},[32,1566,1547],{"class":72},[32,1568,1569,1571,1574,1576,1578,1580,1582,1585],{"class":34,"line":161},[32,1570,1498],{"class":64},[32,1572,1573],{"class":326}," markClean",[32,1575,1376],{"class":72},[32,1577,317],{"class":64},[32,1579,1539],{"class":72},[32,1581,138],{"class":64},[32,1583,1584],{"class":68}," false",[32,1586,1547],{"class":72},[32,1588,1589],{"class":34,"line":189},[32,1590,336],{"class":72},[32,1592,1593],{"class":34,"line":217},[32,1594,58],{"emptyLinePlaceholder":57},[32,1596,1597,1599,1602],{"class":34,"line":222},[32,1598,1488],{"class":64},[32,1600,1601],{"class":68}," Loggable",[32,1603,73],{"class":72},[32,1605,1606,1608,1611,1613,1616,1619,1621,1623,1625,1628,1630,1633,1636,1638,1641,1643],{"class":34,"line":228},[32,1607,1498],{"class":64},[32,1609,1610],{"class":326}," log",[32,1612,96],{"class":72},[32,1614,1615],{"class":68},"String",[32,1617,1618],{"class":72}," msg) ",[32,1620,317],{"class":64},[32,1622,1508],{"class":326},[32,1624,96],{"class":72},[32,1626,1627],{"class":1386},"'[",[32,1629,1516],{"class":1386},[32,1631,1632],{"class":68},"runtimeType",[32,1634,1635],{"class":1386},"] ",[32,1637,1516],{"class":1386},[32,1639,1640],{"class":68},"msg",[32,1642,1521],{"class":1386},[32,1644,158],{"class":72},[32,1646,1647],{"class":34,"line":251},[32,1648,336],{"class":72},[32,1650,1651],{"class":34,"line":295},[32,1652,58],{"emptyLinePlaceholder":57},[32,1654,1655],{"class":34,"line":300},[32,1656,1657],{"class":38},"\u002F\u002F `on` constraint: the mixin can only be applied to subclasses of the constraint.\n",[32,1659,1660],{"class":34,"line":305},[32,1661,1662],{"class":38},"\u002F\u002F This gives the mixin access to the constraint's methods.\n",[32,1664,1665,1667,1670,1673,1676],{"class":34,"line":333},[32,1666,1488],{"class":64},[32,1668,1669],{"class":72}," disposableView ",[32,1671,1672],{"class":64},"on",[32,1674,1675],{"class":68}," StatefulWidget",[32,1677,73],{"class":72},[32,1679,1680,1682,1685,1687,1689,1692],{"class":34,"line":339},[32,1681,1498],{"class":64},[32,1683,1684],{"class":326}," registerDispose",[32,1686,96],{"class":72},[32,1688,347],{"class":64},[32,1690,1691],{"class":68}," Function",[32,1693,1694],{"class":72},"() fn) {\n",[32,1696,1697],{"class":34,"line":344},[32,1698,1699],{"class":38},"    \u002F\u002F Can access State methods because of the `on` constraint.\n",[32,1701,1702],{"class":34,"line":356},[32,1703,1704],{"class":38},"    \u002F\u002F addCallback(() => fn());\n",[32,1706,1707],{"class":34,"line":382},[32,1708,1709],{"class":72},"  }\n",[32,1711,1712],{"class":34,"line":407},[32,1713,336],{"class":72},[32,1715,1716],{"class":34,"line":424},[32,1717,58],{"emptyLinePlaceholder":57},[32,1719,1720],{"class":34,"line":440},[32,1721,1722],{"class":38},"\u002F\u002F Multiple mixins — applied left-to-right (linearization):\n",[32,1724,1725,1727,1730,1733,1735,1737,1740],{"class":34,"line":445},[32,1726,65],{"class":64},[32,1728,1729],{"class":68}," Canvas",[32,1731,1732],{"class":64}," with",[32,1734,1491],{"class":68},[32,1736,148],{"class":72},[32,1738,1739],{"class":68},"Loggable",[32,1741,73],{"class":72},[32,1743,1744,1746,1748],{"class":34,"line":475},[32,1745,79],{"class":64},[32,1747,1100],{"class":68},[32,1749,1750],{"class":72}," name;\n",[32,1752,1753,1756,1758,1760],{"class":34,"line":504},[32,1754,1755],{"class":68},"  Canvas",[32,1757,96],{"class":72},[32,1759,99],{"class":68},[32,1761,1762],{"class":72},".name);\n",[32,1764,1765],{"class":34,"line":519},[32,1766,58],{"emptyLinePlaceholder":57},[32,1768,1769],{"class":34,"line":534},[32,1770,225],{"class":64},[32,1772,1773,1776,1779,1781,1783,1786,1788,1791,1794],{"class":34,"line":539},[32,1774,1775],{"class":68},"  String",[32,1777,1778],{"class":326}," toString",[32,1780,1376],{"class":72},[32,1782,317],{"class":64},[32,1784,1785],{"class":1386}," 'Canvas(",[32,1787,1516],{"class":1386},[32,1789,1790],{"class":68},"name",[32,1792,1793],{"class":1386},")'",[32,1795,1547],{"class":72},[32,1797,1798],{"class":34,"line":545},[32,1799,336],{"class":72},[32,1801,1802],{"class":34,"line":551},[32,1803,58],{"emptyLinePlaceholder":57},[32,1805,1806,1808,1811,1813,1815,1817,1820],{"class":34,"line":1370},[32,1807,620],{"class":64},[32,1809,1810],{"class":72}," canvas ",[32,1812,138],{"class":64},[32,1814,1729],{"class":68},[32,1816,96],{"class":72},[32,1818,1819],{"class":1386},"'main'",[32,1821,158],{"class":72},[32,1823,1824,1827,1830,1833],{"class":34,"line":1393},[32,1825,1826],{"class":72},"canvas.",[32,1828,1829],{"class":326},"draw",[32,1831,1832],{"class":72},"();  ",[32,1834,1835],{"class":38},"\u002F\u002F 'Drawing Canvas(main)' — from Drawable\n",[32,1837,1838,1840,1843,1845,1848,1850],{"class":34,"line":1409},[32,1839,1826],{"class":72},[32,1841,1842],{"class":326},"log",[32,1844,96],{"class":72},[32,1846,1847],{"class":1386},"'Created'",[32,1849,469],{"class":72},[32,1851,1852],{"class":38},"\u002F\u002F '[Canvas] Created' — from Loggable\n",[32,1854,1855],{"class":34,"line":1430},[32,1856,58],{"emptyLinePlaceholder":57},[32,1858,1859],{"class":34,"line":1451},[32,1860,1861],{"class":38},"\u002F\u002F ❌ Anti-pattern: mixins with state that conflict.\n",[32,1863,1865,1867,1870,1872,1875,1878,1880,1883],{"class":34,"line":1864},41,[32,1866,1488],{"class":64},[32,1868,1869],{"class":68}," A",[32,1871,1292],{"class":72},[32,1873,1874],{"class":68},"int",[32,1876,1877],{"class":72}," value ",[32,1879,138],{"class":64},[32,1881,1882],{"class":68}," 1",[32,1884,1885],{"class":72},"; }\n",[32,1887,1889,1891,1894,1896,1898,1900,1902,1905],{"class":34,"line":1888},42,[32,1890,1488],{"class":64},[32,1892,1893],{"class":68}," B",[32,1895,1292],{"class":72},[32,1897,1874],{"class":68},[32,1899,1877],{"class":72},[32,1901,138],{"class":64},[32,1903,1904],{"class":68}," 2",[32,1906,1885],{"class":72},[32,1908,1910,1913],{"class":34,"line":1909},43,[32,1911,1912],{"class":38},"\u002F\u002F class C with A, B { }",[32,1914,1915],{"class":38},"  \u002F\u002F compile error: value is defined in both A and B\n",[14,1917,1919],{"id":1918},"factory-constructors-caching-subtypes","Factory Constructors — Caching & Subtypes",[19,1921,1922],{"language":21},[23,1923,1925],{"className":25,"code":1924,"language":21,"meta":27,"style":27},"\u002F\u002F factory constructors don't always create a new instance — they can return\n\u002F\u002F a cached instance, a subtype, or compute which to return. Like a static method\n\u002F\u002F that returns an instance of the class (or a subtype).\n\nclass Logger {\n  static final _cache = \u003CString, Logger>{};\n  final String name;\n\n  \u002F\u002F Private generative constructor — only accessible within the library.\n  Logger._internal(this.name);\n\n  \u002F\u002F Factory — returns cached instance if available.\n  factory Logger(String name) {\n    return _cache.putIfAbsent(name, () => Logger._internal(name));\n  }\n}\n\nvar a = Logger('app');\nvar b = Logger('app');\nprint(identical(a, b));  \u002F\u002F true — cached, same instance\n\n\u002F\u002F Factory returning a subtype based on input:\nabstract class Animal {\n  final String name;\n  Animal(this.name);\n  factory Animal.fromType(String type, String name) {\n    return switch (type) {\n      'dog' => Dog(name),\n      'cat' => Cat(name),\n      _ => throw ArgumentError('Unknown animal type: $type'),\n    };\n  }\n  String speak();\n}\n\nclass Dog extends Animal {\n  Dog(super.name);\n  @override\n  String speak() => '$name barks';\n}\n\nclass Cat extends Animal {\n  Cat(super.name);\n  @override\n  String speak() => '$name meows';\n}\n\nvar pet = Animal.fromType('dog', 'Rex');  \u002F\u002F returns Dog (a subtype of Animal)\nprint(pet.speak());  \u002F\u002F 'Rex barks'\n",[29,1926,1927,1932,1937,1942,1946,1955,1983,1991,1995,2000,2016,2020,2025,2039,2064,2068,2072,2076,2093,2109,2122,2126,2131,2143,2151,2162,2184,2193,2207,2219,2245,2250,2254,2263,2267,2271,2283,2295,2299,2321,2325,2329,2341,2352,2357,2379,2384,2389,2420],{"__ignoreMap":27},[32,1928,1929],{"class":34,"line":35},[32,1930,1931],{"class":38},"\u002F\u002F factory constructors don't always create a new instance — they can return\n",[32,1933,1934],{"class":34,"line":42},[32,1935,1936],{"class":38},"\u002F\u002F a cached instance, a subtype, or compute which to return. Like a static method\n",[32,1938,1939],{"class":34,"line":48},[32,1940,1941],{"class":38},"\u002F\u002F that returns an instance of the class (or a subtype).\n",[32,1943,1944],{"class":34,"line":54},[32,1945,58],{"emptyLinePlaceholder":57},[32,1947,1948,1950,1953],{"class":34,"line":61},[32,1949,65],{"class":64},[32,1951,1952],{"class":68}," Logger",[32,1954,73],{"class":72},[32,1956,1957,1959,1962,1965,1967,1970,1972,1974,1977,1980],{"class":34,"line":76},[32,1958,129],{"class":64},[32,1960,1961],{"class":64}," final",[32,1963,1964],{"class":72}," _cache ",[32,1966,138],{"class":64},[32,1968,1969],{"class":64}," \u003C",[32,1971,1615],{"class":68},[32,1973,148],{"class":72},[32,1975,1976],{"class":68},"Logger",[32,1978,1979],{"class":64},">",[32,1981,1982],{"class":72},"{};\n",[32,1984,1985,1987,1989],{"class":34,"line":88},[32,1986,79],{"class":64},[32,1988,1100],{"class":68},[32,1990,1750],{"class":72},[32,1992,1993],{"class":34,"line":115},[32,1994,58],{"emptyLinePlaceholder":57},[32,1996,1997],{"class":34,"line":120},[32,1998,1999],{"class":38},"  \u002F\u002F Private generative constructor — only accessible within the library.\n",[32,2001,2002,2005,2007,2010,2012,2014],{"class":34,"line":126},[32,2003,2004],{"class":68},"  Logger",[32,2006,323],{"class":72},[32,2008,2009],{"class":326},"_internal",[32,2011,96],{"class":72},[32,2013,99],{"class":68},[32,2015,1762],{"class":72},[32,2017,2018],{"class":34,"line":161},[32,2019,58],{"emptyLinePlaceholder":57},[32,2021,2022],{"class":34,"line":189},[32,2023,2024],{"class":38},"  \u002F\u002F Factory — returns cached instance if available.\n",[32,2026,2027,2030,2032,2034,2036],{"class":34,"line":217},[32,2028,2029],{"class":64},"  factory",[32,2031,1952],{"class":68},[32,2033,96],{"class":72},[32,2035,1615],{"class":68},[32,2037,2038],{"class":72}," name) {\n",[32,2040,2041,2044,2047,2050,2053,2055,2057,2059,2061],{"class":34,"line":222},[32,2042,2043],{"class":64},"    return",[32,2045,2046],{"class":72}," _cache.",[32,2048,2049],{"class":326},"putIfAbsent",[32,2051,2052],{"class":72},"(name, () ",[32,2054,317],{"class":64},[32,2056,1952],{"class":68},[32,2058,323],{"class":72},[32,2060,2009],{"class":326},[32,2062,2063],{"class":72},"(name));\n",[32,2065,2066],{"class":34,"line":228},[32,2067,1709],{"class":72},[32,2069,2070],{"class":34,"line":251},[32,2071,336],{"class":72},[32,2073,2074],{"class":34,"line":295},[32,2075,58],{"emptyLinePlaceholder":57},[32,2077,2078,2080,2082,2084,2086,2088,2091],{"class":34,"line":300},[32,2079,620],{"class":64},[32,2081,361],{"class":72},[32,2083,138],{"class":64},[32,2085,1952],{"class":68},[32,2087,96],{"class":72},[32,2089,2090],{"class":1386},"'app'",[32,2092,158],{"class":72},[32,2094,2095,2097,2099,2101,2103,2105,2107],{"class":34,"line":305},[32,2096,620],{"class":64},[32,2098,287],{"class":72},[32,2100,138],{"class":64},[32,2102,1952],{"class":68},[32,2104,96],{"class":72},[32,2106,2090],{"class":1386},[32,2108,158],{"class":72},[32,2110,2111,2113,2115,2117,2119],{"class":34,"line":333},[32,2112,663],{"class":326},[32,2114,96],{"class":72},[32,2116,415],{"class":326},[32,2118,418],{"class":72},[32,2120,2121],{"class":38},"\u002F\u002F true — cached, same instance\n",[32,2123,2124],{"class":34,"line":339},[32,2125,58],{"emptyLinePlaceholder":57},[32,2127,2128],{"class":34,"line":344},[32,2129,2130],{"class":38},"\u002F\u002F Factory returning a subtype based on input:\n",[32,2132,2133,2136,2138,2141],{"class":34,"line":356},[32,2134,2135],{"class":64},"abstract",[32,2137,985],{"class":64},[32,2139,2140],{"class":68}," Animal",[32,2142,73],{"class":72},[32,2144,2145,2147,2149],{"class":34,"line":382},[32,2146,79],{"class":64},[32,2148,1100],{"class":68},[32,2150,1750],{"class":72},[32,2152,2153,2156,2158,2160],{"class":34,"line":407},[32,2154,2155],{"class":68},"  Animal",[32,2157,96],{"class":72},[32,2159,99],{"class":68},[32,2161,1762],{"class":72},[32,2163,2164,2166,2168,2170,2173,2175,2177,2180,2182],{"class":34,"line":424},[32,2165,2029],{"class":64},[32,2167,2140],{"class":68},[32,2169,323],{"class":72},[32,2171,2172],{"class":326},"fromType",[32,2174,96],{"class":72},[32,2176,1615],{"class":68},[32,2178,2179],{"class":72}," type, ",[32,2181,1615],{"class":68},[32,2183,2038],{"class":72},[32,2185,2186,2188,2190],{"class":34,"line":440},[32,2187,2043],{"class":64},[32,2189,1158],{"class":64},[32,2191,2192],{"class":72}," (type) {\n",[32,2194,2195,2198,2201,2204],{"class":34,"line":445},[32,2196,2197],{"class":1386},"      'dog'",[32,2199,2200],{"class":64}," =>",[32,2202,2203],{"class":68}," Dog",[32,2205,2206],{"class":72},"(name),\n",[32,2208,2209,2212,2214,2217],{"class":34,"line":475},[32,2210,2211],{"class":1386},"      'cat'",[32,2213,2200],{"class":64},[32,2215,2216],{"class":68}," Cat",[32,2218,2206],{"class":72},[32,2220,2221,2224,2226,2228,2231,2233,2236,2238,2241,2243],{"class":34,"line":504},[32,2222,2223],{"class":72},"      _ ",[32,2225,317],{"class":64},[32,2227,1199],{"class":64},[32,2229,2230],{"class":68}," ArgumentError",[32,2232,96],{"class":72},[32,2234,2235],{"class":1386},"'Unknown animal type: ",[32,2237,1516],{"class":1386},[32,2239,2240],{"class":68},"type",[32,2242,1521],{"class":1386},[32,2244,1390],{"class":72},[32,2246,2247],{"class":34,"line":519},[32,2248,2249],{"class":72},"    };\n",[32,2251,2252],{"class":34,"line":534},[32,2253,1709],{"class":72},[32,2255,2256,2258,2261],{"class":34,"line":539},[32,2257,1775],{"class":68},[32,2259,2260],{"class":326}," speak",[32,2262,1006],{"class":72},[32,2264,2265],{"class":34,"line":545},[32,2266,336],{"class":72},[32,2268,2269],{"class":34,"line":551},[32,2270,58],{"emptyLinePlaceholder":57},[32,2272,2273,2275,2277,2279,2281],{"class":34,"line":1370},[32,2274,65],{"class":64},[32,2276,2203],{"class":68},[32,2278,1255],{"class":64},[32,2280,2140],{"class":68},[32,2282,73],{"class":72},[32,2284,2285,2288,2290,2293],{"class":34,"line":1393},[32,2286,2287],{"class":68},"  Dog",[32,2289,96],{"class":72},[32,2291,2292],{"class":68},"super",[32,2294,1762],{"class":72},[32,2296,2297],{"class":34,"line":1409},[32,2298,225],{"class":64},[32,2300,2301,2303,2305,2307,2309,2312,2314,2316,2319],{"class":34,"line":1430},[32,2302,1775],{"class":68},[32,2304,2260],{"class":326},[32,2306,1376],{"class":72},[32,2308,317],{"class":64},[32,2310,2311],{"class":1386}," '",[32,2313,1516],{"class":1386},[32,2315,1790],{"class":68},[32,2317,2318],{"class":1386}," barks'",[32,2320,1547],{"class":72},[32,2322,2323],{"class":34,"line":1451},[32,2324,336],{"class":72},[32,2326,2327],{"class":34,"line":1864},[32,2328,58],{"emptyLinePlaceholder":57},[32,2330,2331,2333,2335,2337,2339],{"class":34,"line":1888},[32,2332,65],{"class":64},[32,2334,2216],{"class":68},[32,2336,1255],{"class":64},[32,2338,2140],{"class":68},[32,2340,73],{"class":72},[32,2342,2343,2346,2348,2350],{"class":34,"line":1909},[32,2344,2345],{"class":68},"  Cat",[32,2347,96],{"class":72},[32,2349,2292],{"class":68},[32,2351,1762],{"class":72},[32,2353,2355],{"class":34,"line":2354},44,[32,2356,225],{"class":64},[32,2358,2360,2362,2364,2366,2368,2370,2372,2374,2377],{"class":34,"line":2359},45,[32,2361,1775],{"class":68},[32,2363,2260],{"class":326},[32,2365,1376],{"class":72},[32,2367,317],{"class":64},[32,2369,2311],{"class":1386},[32,2371,1516],{"class":1386},[32,2373,1790],{"class":68},[32,2375,2376],{"class":1386}," meows'",[32,2378,1547],{"class":72},[32,2380,2382],{"class":34,"line":2381},46,[32,2383,336],{"class":72},[32,2385,2387],{"class":34,"line":2386},47,[32,2388,58],{"emptyLinePlaceholder":57},[32,2390,2392,2394,2397,2399,2401,2403,2405,2407,2410,2412,2415,2417],{"class":34,"line":2391},48,[32,2393,620],{"class":64},[32,2395,2396],{"class":72}," pet ",[32,2398,138],{"class":64},[32,2400,2140],{"class":68},[32,2402,323],{"class":72},[32,2404,2172],{"class":326},[32,2406,96],{"class":72},[32,2408,2409],{"class":1386},"'dog'",[32,2411,148],{"class":72},[32,2413,2414],{"class":1386},"'Rex'",[32,2416,469],{"class":72},[32,2418,2419],{"class":38},"\u002F\u002F returns Dog (a subtype of Animal)\n",[32,2421,2423,2425,2428,2431,2434],{"class":34,"line":2422},49,[32,2424,663],{"class":326},[32,2426,2427],{"class":72},"(pet.",[32,2429,2430],{"class":326},"speak",[32,2432,2433],{"class":72},"());  ",[32,2435,2436],{"class":38},"\u002F\u002F 'Rex barks'\n",[14,2438,2440],{"id":2439},"enhanced-enums-stateful-enumerations","Enhanced Enums — Stateful Enumerations",[19,2442,2443],{"language":21},[23,2444,2446],{"className":25,"code":2445,"language":21,"meta":27,"style":27},"\u002F\u002F Dart 2.17+ enhanced enums: fields, methods, constructors (like a class).\n\u002F\u002F All instances are const. Can implement interfaces, use mixins (no `with`).\n\nenum HttpStatus {\n  ok(200, 'OK'),\n  created(201, 'Created'),\n  badRequest(400, 'Bad Request'),\n  unauthorized(401, 'Unauthorized'),\n  notFound(404, 'Not Found'),\n  serverError(500, 'Internal Server Error');\n\n  final int code;\n  final String label;\n  const HttpStatus(this.code, this.label);\n\n  \u002F\u002F Methods on enum values:\n  bool get isSuccess => code >= 200 && code \u003C 300;\n  bool get isClientError => code >= 400 && code \u003C 500;\n  bool get isServerError => code >= 500;\n\n  static HttpStatus fromCode(int code) =>\n      values.firstWhere((s) => s.code == code,\n          orElse: () => throw ArgumentError('No status for code $code'));\n}\n\n\u002F\u002F Usage:\nprint(HttpStatus.ok.isSuccess);  \u002F\u002F true\nprint(HttpStatus.notFound.isClientError);  \u002F\u002F true\nprint(HttpStatus.fromCode(404).label);  \u002F\u002F 'Not Found'\n\n\u002F\u002F Exhaustive switch over enhanced enum (no default needed):\nString describe(HttpStatus s) => switch (s) {\n  HttpStatus.ok => 'Success',\n  HttpStatus.created => 'Created',\n  HttpStatus.badRequest => 'Client error: bad request',\n  HttpStatus.unauthorized => 'Client error: auth',\n  HttpStatus.notFound => 'Client error: not found',\n  HttpStatus.serverError => 'Server error',\n};\n\u002F\u002F Adding a new HttpStatus value → compile error here (non-exhaustive).\n",[29,2447,2448,2453,2458,2462,2472,2489,2505,2522,2539,2556,2573,2577,2586,2595,2613,2617,2622,2653,2682,2701,2705,2723,2744,2775,2779,2783,2788,2803,2816,2839,2843,2848,2869,2885,2899,2913,2927,2941,2955,2959],{"__ignoreMap":27},[32,2449,2450],{"class":34,"line":35},[32,2451,2452],{"class":38},"\u002F\u002F Dart 2.17+ enhanced enums: fields, methods, constructors (like a class).\n",[32,2454,2455],{"class":34,"line":42},[32,2456,2457],{"class":38},"\u002F\u002F All instances are const. Can implement interfaces, use mixins (no `with`).\n",[32,2459,2460],{"class":34,"line":48},[32,2461,58],{"emptyLinePlaceholder":57},[32,2463,2464,2467,2470],{"class":34,"line":54},[32,2465,2466],{"class":64},"enum",[32,2468,2469],{"class":68}," HttpStatus",[32,2471,73],{"class":72},[32,2473,2474,2477,2479,2482,2484,2487],{"class":34,"line":61},[32,2475,2476],{"class":326},"  ok",[32,2478,96],{"class":72},[32,2480,2481],{"class":68},"200",[32,2483,148],{"class":72},[32,2485,2486],{"class":1386},"'OK'",[32,2488,1390],{"class":72},[32,2490,2491,2494,2496,2499,2501,2503],{"class":34,"line":76},[32,2492,2493],{"class":326},"  created",[32,2495,96],{"class":72},[32,2497,2498],{"class":68},"201",[32,2500,148],{"class":72},[32,2502,1847],{"class":1386},[32,2504,1390],{"class":72},[32,2506,2507,2510,2512,2515,2517,2520],{"class":34,"line":88},[32,2508,2509],{"class":326},"  badRequest",[32,2511,96],{"class":72},[32,2513,2514],{"class":68},"400",[32,2516,148],{"class":72},[32,2518,2519],{"class":1386},"'Bad Request'",[32,2521,1390],{"class":72},[32,2523,2524,2527,2529,2532,2534,2537],{"class":34,"line":115},[32,2525,2526],{"class":326},"  unauthorized",[32,2528,96],{"class":72},[32,2530,2531],{"class":68},"401",[32,2533,148],{"class":72},[32,2535,2536],{"class":1386},"'Unauthorized'",[32,2538,1390],{"class":72},[32,2540,2541,2544,2546,2549,2551,2554],{"class":34,"line":120},[32,2542,2543],{"class":326},"  notFound",[32,2545,96],{"class":72},[32,2547,2548],{"class":68},"404",[32,2550,148],{"class":72},[32,2552,2553],{"class":1386},"'Not Found'",[32,2555,1390],{"class":72},[32,2557,2558,2561,2563,2566,2568,2571],{"class":34,"line":126},[32,2559,2560],{"class":326},"  serverError",[32,2562,96],{"class":72},[32,2564,2565],{"class":68},"500",[32,2567,148],{"class":72},[32,2569,2570],{"class":1386},"'Internal Server Error'",[32,2572,158],{"class":72},[32,2574,2575],{"class":34,"line":161},[32,2576,58],{"emptyLinePlaceholder":57},[32,2578,2579,2581,2583],{"class":34,"line":189},[32,2580,79],{"class":64},[32,2582,82],{"class":68},[32,2584,2585],{"class":72}," code;\n",[32,2587,2588,2590,2592],{"class":34,"line":217},[32,2589,79],{"class":64},[32,2591,1100],{"class":68},[32,2593,2594],{"class":72}," label;\n",[32,2596,2597,2599,2601,2603,2605,2608,2610],{"class":34,"line":222},[32,2598,91],{"class":64},[32,2600,2469],{"class":68},[32,2602,96],{"class":72},[32,2604,99],{"class":68},[32,2606,2607],{"class":72},".code, ",[32,2609,99],{"class":68},[32,2611,2612],{"class":72},".label);\n",[32,2614,2615],{"class":34,"line":228},[32,2616,58],{"emptyLinePlaceholder":57},[32,2618,2619],{"class":34,"line":251},[32,2620,2621],{"class":38},"  \u002F\u002F Methods on enum values:\n",[32,2623,2624,2626,2628,2631,2633,2636,2639,2642,2644,2646,2648,2651],{"class":34,"line":295},[32,2625,231],{"class":68},[32,2627,311],{"class":64},[32,2629,2630],{"class":72}," isSuccess ",[32,2632,317],{"class":64},[32,2634,2635],{"class":72}," code ",[32,2637,2638],{"class":64},">=",[32,2640,2641],{"class":68}," 200",[32,2643,262],{"class":64},[32,2645,2635],{"class":72},[32,2647,991],{"class":64},[32,2649,2650],{"class":68}," 300",[32,2652,1547],{"class":72},[32,2654,2655,2657,2659,2662,2664,2666,2668,2671,2673,2675,2677,2680],{"class":34,"line":300},[32,2656,231],{"class":68},[32,2658,311],{"class":64},[32,2660,2661],{"class":72}," isClientError ",[32,2663,317],{"class":64},[32,2665,2635],{"class":72},[32,2667,2638],{"class":64},[32,2669,2670],{"class":68}," 400",[32,2672,262],{"class":64},[32,2674,2635],{"class":72},[32,2676,991],{"class":64},[32,2678,2679],{"class":68}," 500",[32,2681,1547],{"class":72},[32,2683,2684,2686,2688,2691,2693,2695,2697,2699],{"class":34,"line":305},[32,2685,231],{"class":68},[32,2687,311],{"class":64},[32,2689,2690],{"class":72}," isServerError ",[32,2692,317],{"class":64},[32,2694,2635],{"class":72},[32,2696,2638],{"class":64},[32,2698,2679],{"class":68},[32,2700,1547],{"class":72},[32,2702,2703],{"class":34,"line":333},[32,2704,58],{"emptyLinePlaceholder":57},[32,2706,2707,2709,2711,2714,2716,2718,2721],{"class":34,"line":339},[32,2708,129],{"class":64},[32,2710,2469],{"class":68},[32,2712,2713],{"class":326}," fromCode",[32,2715,96],{"class":72},[32,2717,1874],{"class":68},[32,2719,2720],{"class":72}," code) ",[32,2722,248],{"class":64},[32,2724,2725,2728,2731,2734,2736,2739,2741],{"class":34,"line":344},[32,2726,2727],{"class":72},"      values.",[32,2729,2730],{"class":326},"firstWhere",[32,2732,2733],{"class":72},"((s) ",[32,2735,317],{"class":64},[32,2737,2738],{"class":72}," s.code ",[32,2740,268],{"class":64},[32,2742,2743],{"class":72}," code,\n",[32,2745,2746,2749,2752,2755,2757,2759,2761,2763,2766,2768,2770,2772],{"class":34,"line":356},[32,2747,2748],{"class":72},"          orElse",[32,2750,2751],{"class":64},":",[32,2753,2754],{"class":72}," () ",[32,2756,317],{"class":64},[32,2758,1199],{"class":64},[32,2760,2230],{"class":68},[32,2762,96],{"class":72},[32,2764,2765],{"class":1386},"'No status for code ",[32,2767,1516],{"class":1386},[32,2769,29],{"class":68},[32,2771,1521],{"class":1386},[32,2773,2774],{"class":72},"));\n",[32,2776,2777],{"class":34,"line":382},[32,2778,336],{"class":72},[32,2780,2781],{"class":34,"line":407},[32,2782,58],{"emptyLinePlaceholder":57},[32,2784,2785],{"class":34,"line":424},[32,2786,2787],{"class":38},"\u002F\u002F Usage:\n",[32,2789,2790,2792,2794,2797,2800],{"class":34,"line":440},[32,2791,663],{"class":326},[32,2793,96],{"class":72},[32,2795,2796],{"class":68},"HttpStatus",[32,2798,2799],{"class":72},".ok.isSuccess);  ",[32,2801,2802],{"class":38},"\u002F\u002F true\n",[32,2804,2805,2807,2809,2811,2814],{"class":34,"line":445},[32,2806,663],{"class":326},[32,2808,96],{"class":72},[32,2810,2796],{"class":68},[32,2812,2813],{"class":72},".notFound.isClientError);  ",[32,2815,2802],{"class":38},[32,2817,2818,2820,2822,2824,2826,2829,2831,2833,2836],{"class":34,"line":475},[32,2819,663],{"class":326},[32,2821,96],{"class":72},[32,2823,2796],{"class":68},[32,2825,323],{"class":72},[32,2827,2828],{"class":326},"fromCode",[32,2830,96],{"class":72},[32,2832,2548],{"class":68},[32,2834,2835],{"class":72},").label);  ",[32,2837,2838],{"class":38},"\u002F\u002F 'Not Found'\n",[32,2840,2841],{"class":34,"line":504},[32,2842,58],{"emptyLinePlaceholder":57},[32,2844,2845],{"class":34,"line":519},[32,2846,2847],{"class":38},"\u002F\u002F Exhaustive switch over enhanced enum (no default needed):\n",[32,2849,2850,2852,2855,2857,2859,2862,2864,2866],{"class":34,"line":534},[32,2851,1615],{"class":68},[32,2853,2854],{"class":326}," describe",[32,2856,96],{"class":72},[32,2858,2796],{"class":68},[32,2860,2861],{"class":72}," s) ",[32,2863,317],{"class":64},[32,2865,1158],{"class":64},[32,2867,2868],{"class":72}," (s) {\n",[32,2870,2871,2874,2877,2879,2882],{"class":34,"line":539},[32,2872,2873],{"class":68},"  HttpStatus",[32,2875,2876],{"class":72},".ok ",[32,2878,317],{"class":64},[32,2880,2881],{"class":1386}," 'Success'",[32,2883,2884],{"class":72},",\n",[32,2886,2887,2889,2892,2894,2897],{"class":34,"line":545},[32,2888,2873],{"class":68},[32,2890,2891],{"class":72},".created ",[32,2893,317],{"class":64},[32,2895,2896],{"class":1386}," 'Created'",[32,2898,2884],{"class":72},[32,2900,2901,2903,2906,2908,2911],{"class":34,"line":551},[32,2902,2873],{"class":68},[32,2904,2905],{"class":72},".badRequest ",[32,2907,317],{"class":64},[32,2909,2910],{"class":1386}," 'Client error: bad request'",[32,2912,2884],{"class":72},[32,2914,2915,2917,2920,2922,2925],{"class":34,"line":1370},[32,2916,2873],{"class":68},[32,2918,2919],{"class":72},".unauthorized ",[32,2921,317],{"class":64},[32,2923,2924],{"class":1386}," 'Client error: auth'",[32,2926,2884],{"class":72},[32,2928,2929,2931,2934,2936,2939],{"class":34,"line":1393},[32,2930,2873],{"class":68},[32,2932,2933],{"class":72},".notFound ",[32,2935,317],{"class":64},[32,2937,2938],{"class":1386}," 'Client error: not found'",[32,2940,2884],{"class":72},[32,2942,2943,2945,2948,2950,2953],{"class":34,"line":1409},[32,2944,2873],{"class":68},[32,2946,2947],{"class":72},".serverError ",[32,2949,317],{"class":64},[32,2951,2952],{"class":1386}," 'Server error'",[32,2954,2884],{"class":72},[32,2956,2957],{"class":34,"line":1430},[32,2958,1210],{"class":72},[32,2960,2961],{"class":34,"line":1451},[32,2962,2963],{"class":38},"\u002F\u002F Adding a new HttpStatus value → compile error here (non-exhaustive).\n",[14,2965,2967],{"id":2966},"extension-methods-adding-to-existing-types","Extension Methods — Adding to Existing Types",[19,2969,2970],{"language":21},[23,2971,2973],{"className":25,"code":2972,"language":21,"meta":27,"style":27},"\u002F\u002F Extensions add methods to existing types (even library types like String, int).\n\u002F\u002F They don't modify the original type — they're syntactic sugar for static methods.\n\nextension StringX on String {\n  bool get isPalindrome => this == reversed;\n  String get reversed => split('').reversed.join();\n  String capitalize() => isEmpty ? this : this[0].toUpperCase() + substring(1);\n  String truncate(int maxLen) =>\n      length \u003C= maxLen ? this : '${substring(0, maxLen - 3)}...';\n}\n\nprint('racecar'.isPalindrome);  \u002F\u002F true\nprint('hello'.reversed);        \u002F\u002F 'olleh'\nprint('hello world'.capitalize());  \u002F\u002F 'Hello world'\nprint('A very long string here'.truncate(10));  \u002F\u002F 'A very...'\n\n\u002F\u002F Extension on a generic type:\nextension ListX\u003CT> on List\u003CT> {\n  T? get firstOrNull => isEmpty ? null : first;\n  List\u003CT> separatedBy(T separator) {\n    if (isEmpty) return [];\n    final result = \u003CT>[];\n    for (var i = 0; i \u003C length; i++) {\n      result.add(this[i]);\n      if (i \u003C length - 1) result.add(separator);\n    }\n    return result;\n  }\n}\n\nprint([1, 2, 3].separatedBy(0));  \u002F\u002F [1, 0, 2, 0, 3]\n\n\u002F\u002F Extensions are resolved at compile time — they don't participate in polymorphism.\n\u002F\u002F An extension method on `Object` is available everywhere but can be surprising.\n",[29,2974,2975,2980,2985,2989,3004,3023,3050,3099,3115,3163,3167,3171,3185,3200,3219,3244,3248,3253,3277,3303,3324,3338,3357,3388,3403,3429,3434,3441,3445,3449,3453,3483,3487,3492],{"__ignoreMap":27},[32,2976,2977],{"class":34,"line":35},[32,2978,2979],{"class":38},"\u002F\u002F Extensions add methods to existing types (even library types like String, int).\n",[32,2981,2982],{"class":34,"line":42},[32,2983,2984],{"class":38},"\u002F\u002F They don't modify the original type — they're syntactic sugar for static methods.\n",[32,2986,2987],{"class":34,"line":48},[32,2988,58],{"emptyLinePlaceholder":57},[32,2990,2991,2994,2997,3000,3002],{"class":34,"line":54},[32,2992,2993],{"class":64},"extension",[32,2995,2996],{"class":68}," StringX",[32,2998,2999],{"class":64}," on",[32,3001,1100],{"class":68},[32,3003,73],{"class":72},[32,3005,3006,3008,3010,3013,3015,3018,3020],{"class":34,"line":61},[32,3007,231],{"class":68},[32,3009,311],{"class":64},[32,3011,3012],{"class":72}," isPalindrome ",[32,3014,317],{"class":64},[32,3016,3017],{"class":68}," this",[32,3019,237],{"class":64},[32,3021,3022],{"class":72}," reversed;\n",[32,3024,3025,3027,3029,3032,3034,3037,3039,3042,3045,3048],{"class":34,"line":76},[32,3026,1775],{"class":68},[32,3028,311],{"class":64},[32,3030,3031],{"class":72}," reversed ",[32,3033,317],{"class":64},[32,3035,3036],{"class":326}," split",[32,3038,96],{"class":72},[32,3040,3041],{"class":1386},"''",[32,3043,3044],{"class":72},").reversed.",[32,3046,3047],{"class":326},"join",[32,3049,1006],{"class":72},[32,3051,3052,3054,3057,3059,3061,3064,3067,3069,3072,3074,3077,3079,3082,3085,3087,3090,3093,3095,3097],{"class":34,"line":88},[32,3053,1775],{"class":68},[32,3055,3056],{"class":326}," capitalize",[32,3058,1376],{"class":72},[32,3060,317],{"class":64},[32,3062,3063],{"class":72}," isEmpty ",[32,3065,3066],{"class":64},"?",[32,3068,3017],{"class":68},[32,3070,3071],{"class":64}," :",[32,3073,3017],{"class":68},[32,3075,3076],{"class":72},"[",[32,3078,151],{"class":68},[32,3080,3081],{"class":72},"].",[32,3083,3084],{"class":326},"toUpperCase",[32,3086,1376],{"class":72},[32,3088,3089],{"class":64},"+",[32,3091,3092],{"class":326}," substring",[32,3094,96],{"class":72},[32,3096,631],{"class":68},[32,3098,158],{"class":72},[32,3100,3101,3103,3106,3108,3110,3113],{"class":34,"line":115},[32,3102,1775],{"class":68},[32,3104,3105],{"class":326}," truncate",[32,3107,96],{"class":72},[32,3109,1874],{"class":68},[32,3111,3112],{"class":72}," maxLen) ",[32,3114,248],{"class":64},[32,3116,3117,3120,3123,3126,3128,3130,3132,3134,3137,3140,3142,3144,3146,3149,3152,3155,3158,3161],{"class":34,"line":120},[32,3118,3119],{"class":72},"      length ",[32,3121,3122],{"class":64},"\u003C=",[32,3124,3125],{"class":72}," maxLen ",[32,3127,3066],{"class":64},[32,3129,3017],{"class":68},[32,3131,3071],{"class":64},[32,3133,2311],{"class":1386},[32,3135,3136],{"class":1386},"${",[32,3138,3139],{"class":326},"substring",[32,3141,96],{"class":1386},[32,3143,151],{"class":68},[32,3145,148],{"class":1386},[32,3147,3148],{"class":68},"maxLen",[32,3150,3151],{"class":1386}," - ",[32,3153,3154],{"class":68},"3",[32,3156,3157],{"class":1386},")}",[32,3159,3160],{"class":1386},"...'",[32,3162,1547],{"class":72},[32,3164,3165],{"class":34,"line":126},[32,3166,336],{"class":72},[32,3168,3169],{"class":34,"line":161},[32,3170,58],{"emptyLinePlaceholder":57},[32,3172,3173,3175,3177,3180,3183],{"class":34,"line":189},[32,3174,663],{"class":326},[32,3176,96],{"class":72},[32,3178,3179],{"class":1386},"'racecar'",[32,3181,3182],{"class":72},".isPalindrome);  ",[32,3184,2802],{"class":38},[32,3186,3187,3189,3191,3194,3197],{"class":34,"line":217},[32,3188,663],{"class":326},[32,3190,96],{"class":72},[32,3192,3193],{"class":1386},"'hello'",[32,3195,3196],{"class":72},".reversed);        ",[32,3198,3199],{"class":38},"\u002F\u002F 'olleh'\n",[32,3201,3202,3204,3206,3209,3211,3214,3216],{"class":34,"line":222},[32,3203,663],{"class":326},[32,3205,96],{"class":72},[32,3207,3208],{"class":1386},"'hello world'",[32,3210,323],{"class":72},[32,3212,3213],{"class":326},"capitalize",[32,3215,2433],{"class":72},[32,3217,3218],{"class":38},"\u002F\u002F 'Hello world'\n",[32,3220,3221,3223,3225,3228,3230,3233,3235,3238,3241],{"class":34,"line":228},[32,3222,663],{"class":326},[32,3224,96],{"class":72},[32,3226,3227],{"class":1386},"'A very long string here'",[32,3229,323],{"class":72},[32,3231,3232],{"class":326},"truncate",[32,3234,96],{"class":72},[32,3236,3237],{"class":68},"10",[32,3239,3240],{"class":72},"));  ",[32,3242,3243],{"class":38},"\u002F\u002F 'A very...'\n",[32,3245,3246],{"class":34,"line":251},[32,3247,58],{"emptyLinePlaceholder":57},[32,3249,3250],{"class":34,"line":295},[32,3251,3252],{"class":38},"\u002F\u002F Extension on a generic type:\n",[32,3254,3255,3257,3260,3262,3264,3266,3268,3271,3273,3275],{"class":34,"line":300},[32,3256,2993],{"class":64},[32,3258,3259],{"class":68}," ListX",[32,3261,991],{"class":72},[32,3263,994],{"class":68},[32,3265,1028],{"class":72},[32,3267,1672],{"class":64},[32,3269,3270],{"class":68}," List",[32,3272,991],{"class":72},[32,3274,994],{"class":68},[32,3276,997],{"class":72},[32,3278,3279,3282,3284,3286,3289,3291,3293,3295,3298,3300],{"class":34,"line":305},[32,3280,3281],{"class":68},"  T",[32,3283,3066],{"class":64},[32,3285,311],{"class":64},[32,3287,3288],{"class":72}," firstOrNull ",[32,3290,317],{"class":64},[32,3292,3063],{"class":72},[32,3294,3066],{"class":64},[32,3296,3297],{"class":68}," null",[32,3299,3071],{"class":64},[32,3301,3302],{"class":72}," first;\n",[32,3304,3305,3308,3310,3312,3314,3317,3319,3321],{"class":34,"line":333},[32,3306,3307],{"class":68},"  List",[32,3309,991],{"class":72},[32,3311,994],{"class":68},[32,3313,1028],{"class":72},[32,3315,3316],{"class":326},"separatedBy",[32,3318,96],{"class":72},[32,3320,994],{"class":68},[32,3322,3323],{"class":72}," separator) {\n",[32,3325,3326,3329,3332,3335],{"class":34,"line":339},[32,3327,3328],{"class":64},"    if",[32,3330,3331],{"class":72}," (isEmpty) ",[32,3333,3334],{"class":64},"return",[32,3336,3337],{"class":72}," [];\n",[32,3339,3340,3343,3346,3348,3350,3352,3354],{"class":34,"line":344},[32,3341,3342],{"class":64},"    final",[32,3344,3345],{"class":72}," result ",[32,3347,138],{"class":64},[32,3349,1969],{"class":64},[32,3351,994],{"class":68},[32,3353,1979],{"class":64},[32,3355,3356],{"class":72},"[];\n",[32,3358,3359,3362,3364,3366,3369,3371,3374,3377,3379,3382,3385],{"class":34,"line":356},[32,3360,3361],{"class":64},"    for",[32,3363,903],{"class":72},[32,3365,620],{"class":64},[32,3367,3368],{"class":72}," i ",[32,3370,138],{"class":64},[32,3372,3373],{"class":68}," 0",[32,3375,3376],{"class":72},"; i ",[32,3378,991],{"class":64},[32,3380,3381],{"class":72}," length; i",[32,3383,3384],{"class":64},"++",[32,3386,3387],{"class":72},") {\n",[32,3389,3390,3393,3396,3398,3400],{"class":34,"line":382},[32,3391,3392],{"class":72},"      result.",[32,3394,3395],{"class":326},"add",[32,3397,96],{"class":72},[32,3399,99],{"class":68},[32,3401,3402],{"class":72},"[i]);\n",[32,3404,3405,3408,3411,3413,3416,3419,3421,3424,3426],{"class":34,"line":407},[32,3406,3407],{"class":64},"      if",[32,3409,3410],{"class":72}," (i ",[32,3412,991],{"class":64},[32,3414,3415],{"class":72}," length ",[32,3417,3418],{"class":64},"-",[32,3420,1882],{"class":68},[32,3422,3423],{"class":72},") result.",[32,3425,3395],{"class":326},[32,3427,3428],{"class":72},"(separator);\n",[32,3430,3431],{"class":34,"line":424},[32,3432,3433],{"class":72},"    }\n",[32,3435,3436,3438],{"class":34,"line":440},[32,3437,2043],{"class":64},[32,3439,3440],{"class":72}," result;\n",[32,3442,3443],{"class":34,"line":445},[32,3444,1709],{"class":72},[32,3446,3447],{"class":34,"line":475},[32,3448,336],{"class":72},[32,3450,3451],{"class":34,"line":504},[32,3452,58],{"emptyLinePlaceholder":57},[32,3454,3455,3457,3460,3462,3464,3466,3468,3470,3472,3474,3476,3478,3480],{"class":34,"line":519},[32,3456,663],{"class":326},[32,3458,3459],{"class":72},"([",[32,3461,631],{"class":68},[32,3463,148],{"class":72},[32,3465,636],{"class":68},[32,3467,148],{"class":72},[32,3469,3154],{"class":68},[32,3471,3081],{"class":72},[32,3473,3316],{"class":326},[32,3475,96],{"class":72},[32,3477,151],{"class":68},[32,3479,3240],{"class":72},[32,3481,3482],{"class":38},"\u002F\u002F [1, 0, 2, 0, 3]\n",[32,3484,3485],{"class":34,"line":534},[32,3486,58],{"emptyLinePlaceholder":57},[32,3488,3489],{"class":34,"line":539},[32,3490,3491],{"class":38},"\u002F\u002F Extensions are resolved at compile time — they don't participate in polymorphism.\n",[32,3493,3494],{"class":34,"line":545},[32,3495,3496],{"class":38},"\u002F\u002F An extension method on `Object` is available everywhere but can be surprising.\n",[14,3498,3500],{"id":3499},"tips-tricks","💡 Tips & Tricks",[3502,3503,3504,3519,3538,3554,3569],"ul",{},[3505,3506,3507,3511,3512,3514,3515,3518],"li",{},[3508,3509,3510],"strong",{},"Idiom",": use ",[29,3513,982],{}," for closed hierarchies (Result, Option, states, ASTs) — the compiler enforces exhaustiveness, so adding a subtype flags every switch that needs updating. Use ",[29,3516,3517],{},"abstract class"," for open hierarchies.",[3505,3520,3521,3523,3524,3526,3527,3530,3531,3533,3534,3537],{},[3508,3522,3510],{},": always override ",[29,3525,268],{}," and ",[29,3528,3529],{},"hashCode"," together on value classes — the default ",[29,3532,268],{}," is identity (different instances are \"not equal\"). Use ",[29,3535,3536],{},"Object.hash(field1, field2)"," for the hash. Or use records (Dart 3) for automatic structural equality.",[3505,3539,3540,3511,3542,3545,3546,3549,3550,3553],{},[3508,3541,3510],{},[29,3543,3544],{},"factory"," constructors for caching\u002Fsingleton\u002Fsubtype dispatch — ",[29,3547,3548],{},"factory Logger(name)"," returns a cached instance. ",[29,3551,3552],{},"factory Animal.fromType(type)"," returns a subtype. The factory is a static method disguised as a constructor.",[3505,3555,3556,3511,3558,3561,3562,3565,3566,3568],{},[3508,3557,3510],{},[29,3559,3560],{},"const"," constructors for immutable value types — ",[29,3563,3564],{},"const Point(x, y)"," is canonicalized (same instance everywhere). All fields must be ",[29,3567,1295],{},". Zero allocation at runtime. Use for colors, points, config constants.",[3505,3570,3571,3573,3574,3576,3577,3580,3581,3584,3585,3587],{},[3508,3572,3510],{},": use mixins (",[29,3575,1488],{}," + ",[29,3578,3579],{},"with",") for cross-hierarchy reuse — ",[29,3582,3583],{},"class Canvas with Drawable, Loggable",". Mixins can't have constructors. Use ",[29,3586,1672],{}," constraints to restrict to a base type and access its methods.",[14,3589,3591],{"id":3590},"️-edge-cases-gotchas","⚠️ Edge Cases & Gotchas",[3502,3593,3594,3607,3619,3641,3659,3671,3680,3694,3708,3717],{},[3505,3595,3596,3602,3603,3606],{},[3508,3597,3598,3601],{},[29,3599,3600],{},"_"," prefix is library-private, not class-private",": ",[29,3604,3605],{},"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.",[3505,3608,3609,3615,3616,3618],{},[3508,3610,3611,3614],{},[29,3612,3613],{},"@override"," is a hint, not enforced at runtime",": forgetting ",[29,3617,3613],{}," still overrides (if the signature matches). But the annotation catches typos (a method that doesn't actually override is flagged). Always use it.",[3505,3620,3621,3602,3629,3632,3633,3635,3636,3638,3639,323],{},[3508,3622,3623,3625,3626,3628],{},[29,3624,3560],{}," constructor requires all fields ",[29,3627,1295],{}," and no body",[29,3630,3631],{},"const Point(this.x, this.y);"," — ",[29,3634,1295],{}," fields, no body. A non-",[29,3637,1295],{}," field or a body disqualifies ",[29,3640,3560],{},[3505,3642,3643,3602,3649,3652,3653,3655,3656,3658],{},[3508,3644,3645,3648],{},[29,3646,3647],{},"implements"," requires all methods",[29,3650,3651],{},"class X implements Y"," — X must implement ALL of Y's methods (even if Y has implementations). Use ",[29,3654,1031],{}," to inherit, ",[29,3657,3647],{}," for interface contract.",[3505,3660,3661,3602,3664,3667,3668,3670],{},[3508,3662,3663],{},"Mixins can't have constructors",[29,3665,3666],{},"mixin X { X(); }"," is invalid. Mixins are applied via ",[29,3669,3579],{},", not instantiated. Initialize via the class's constructor.",[3505,3672,3673,3676,3677,3679],{},[3508,3674,3675],{},"Sealed subtypes must be in the same library",": you can't add a subtype from another file. This is what enables exhaustive checking. Use ",[29,3678,3517],{}," if the hierarchy is open.",[3505,3681,3682,3602,3687,3690,3691,3693],{},[3508,3683,3684,3685],{},"Factory constructors can't use ",[29,3686,99],{},[29,3688,3689],{},"factory Point()"," is like a static method — no ",[29,3692,99],{}," (no instance yet). It returns an instance (cached, subtype, or new).",[3505,3695,3696,3701,3702,3704,3705,3707],{},[3508,3697,3698,3699],{},"Enhanced enums are ",[29,3700,3560],{},": all enum instances are ",[29,3703,3560],{},". You can use them in ",[29,3706,3560],{}," contexts and switch expressions. They can have fields, methods, and implement interfaces.",[3505,3709,3710,3713,3714,3716],{},[3508,3711,3712],{},"Extension methods don't participate in polymorphism",": they're resolved at compile time. An extension on ",[29,3715,242],{}," is available everywhere but can be surprising. Use extensions for utility methods, not for overriding behavior.",[3505,3718,3719,3602,3725,3728,3729,3732,3733,3736],{},[3508,3720,3721,3724],{},[29,3722,3723],{},"late"," fields throw on early read",[29,3726,3727],{},"late int x; print(x)"," throws ",[29,3730,3731],{},"LateInitializationError",". Use ",[29,3734,3735],{},"late final x = initializer"," for safe lazy initialization.",[14,3738,3740],{"id":3739},"spot-the-bug","🧠 Spot the Bug",[3742,3743,3744,3745,3747,3748,3751],"p",{},"A developer uses a sealed ",[29,3746,1146],{}," type but adds a ",[29,3749,3750],{},"default"," case \"just in case\":",[19,3753,3754],{"language":21},[23,3755,3757],{"className":25,"code":3756,"language":21,"meta":27,"style":27},"sealed class Result\u003CT> {}\nclass Success\u003CT> extends Result\u003CT> { final T value; Success(this.value); }\nclass Failure\u003CT> extends Result\u003CT> { final String error; Failure(this.error); }\n\nT unwrap\u003CT>(Result\u003CT> r) => switch (r) {\n  Success(:final value) => value,\n  _ => throw Exception('Unexpected'),\n};\n",[29,3758,3759,3774,3814,3853,3857,3883,3898,3916],{"__ignoreMap":27},[32,3760,3761,3763,3765,3767,3769,3771],{"class":34,"line":35},[32,3762,982],{"class":64},[32,3764,985],{"class":64},[32,3766,988],{"class":68},[32,3768,991],{"class":72},[32,3770,994],{"class":68},[32,3772,3773],{"class":72},"> {}\n",[32,3775,3776,3778,3780,3782,3784,3786,3788,3790,3792,3794,3797,3799,3801,3804,3807,3809,3811],{"class":34,"line":42},[32,3777,65],{"class":64},[32,3779,1021],{"class":68},[32,3781,991],{"class":72},[32,3783,994],{"class":68},[32,3785,1028],{"class":72},[32,3787,1031],{"class":64},[32,3789,988],{"class":68},[32,3791,991],{"class":72},[32,3793,994],{"class":68},[32,3795,3796],{"class":72},"> { ",[32,3798,1295],{"class":64},[32,3800,1046],{"class":68},[32,3802,3803],{"class":72}," value; ",[32,3805,3806],{"class":68},"Success",[32,3808,96],{"class":72},[32,3810,99],{"class":68},[32,3812,3813],{"class":72},".value); }\n",[32,3815,3816,3818,3820,3822,3824,3826,3828,3830,3832,3834,3836,3838,3840,3843,3846,3848,3850],{"class":34,"line":48},[32,3817,65],{"class":64},[32,3819,1077],{"class":68},[32,3821,991],{"class":72},[32,3823,994],{"class":68},[32,3825,1028],{"class":72},[32,3827,1031],{"class":64},[32,3829,988],{"class":68},[32,3831,991],{"class":72},[32,3833,994],{"class":68},[32,3835,3796],{"class":72},[32,3837,1295],{"class":64},[32,3839,1100],{"class":68},[32,3841,3842],{"class":72}," error; ",[32,3844,3845],{"class":68},"Failure",[32,3847,96],{"class":72},[32,3849,99],{"class":68},[32,3851,3852],{"class":72},".error); }\n",[32,3854,3855],{"class":34,"line":54},[32,3856,58],{"emptyLinePlaceholder":57},[32,3858,3859,3861,3863,3865,3867,3869,3871,3873,3875,3877,3879,3881],{"class":34,"line":61},[32,3860,994],{"class":68},[32,3862,1136],{"class":326},[32,3864,991],{"class":72},[32,3866,994],{"class":68},[32,3868,1143],{"class":72},[32,3870,1146],{"class":68},[32,3872,991],{"class":72},[32,3874,994],{"class":68},[32,3876,1153],{"class":72},[32,3878,317],{"class":64},[32,3880,1158],{"class":64},[32,3882,1161],{"class":72},[32,3884,3885,3887,3889,3891,3893,3895],{"class":34,"line":76},[32,3886,1166],{"class":68},[32,3888,96],{"class":72},[32,3890,1171],{"class":64},[32,3892,1174],{"class":72},[32,3894,317],{"class":64},[32,3896,3897],{"class":72}," value,\n",[32,3899,3900,3903,3905,3907,3909,3911,3914],{"class":34,"line":88},[32,3901,3902],{"class":72},"  _ ",[32,3904,317],{"class":64},[32,3906,1199],{"class":64},[32,3908,1202],{"class":68},[32,3910,96],{"class":72},[32,3912,3913],{"class":1386},"'Unexpected'",[32,3915,1390],{"class":72},[32,3917,3918],{"class":34,"line":115},[32,3919,1210],{"class":72},[3742,3921,3922,3923,3926],{},"Later, ",[29,3924,3925],{},"Loading\u003CT>"," is added to the sealed class. What happens?",[3928,3929,3930,3934,3948,3968,3974,4060],"details",{},[3931,3932,3933],"summary",{},"Answer",[3742,3935,3936,3937,3939,3940,3943,3944,3947],{},"The ",[29,3938,3600],{}," (wildcard) catches ",[29,3941,3942],{},"Loading"," and throws ",[29,3945,3946],{},"Exception('Unexpected')"," — a runtime error that should have been a compile-time error. The wildcard defeats the exhaustiveness checking that sealed classes provide.",[3742,3949,3950,3951,3953,3954,3956,3957,3960,3961],{},"Without ",[29,3952,3600],{},", adding ",[29,3955,3942],{}," would cause a ",[3508,3958,3959],{},"compile error",": \"The switch expression does not exhaustively cover all possible cases of Result",[3962,3963,3964,3965,3967],"t",{},".\" The compiler would force you to handle ",[29,3966,3942],{}," before the code even compiles.",[3742,3969,3970,3971,3973],{},"The fix — remove ",[29,3972,3600],{},", handle every case explicitly:",[23,3975,3977],{"className":25,"code":3976,"language":21,"meta":27,"style":27},"T unwrap\u003CT>(Result\u003CT> r) => switch (r) {\n  Success(:final value) => value,\n  Failure(:final error) => throw Exception(error),\n  Loading() => throw Exception('Still loading — unwrap called too early'),\n};\n",[29,3978,3979,4005,4019,4037,4056],{"__ignoreMap":27},[32,3980,3981,3983,3985,3987,3989,3991,3993,3995,3997,3999,4001,4003],{"class":34,"line":35},[32,3982,994],{"class":68},[32,3984,1136],{"class":326},[32,3986,991],{"class":72},[32,3988,994],{"class":68},[32,3990,1143],{"class":72},[32,3992,1146],{"class":68},[32,3994,991],{"class":72},[32,3996,994],{"class":68},[32,3998,1153],{"class":72},[32,4000,317],{"class":64},[32,4002,1158],{"class":64},[32,4004,1161],{"class":72},[32,4006,4007,4009,4011,4013,4015,4017],{"class":34,"line":42},[32,4008,1166],{"class":68},[32,4010,96],{"class":72},[32,4012,1171],{"class":64},[32,4014,1174],{"class":72},[32,4016,317],{"class":64},[32,4018,3897],{"class":72},[32,4020,4021,4023,4025,4027,4029,4031,4033,4035],{"class":34,"line":48},[32,4022,1187],{"class":68},[32,4024,96],{"class":72},[32,4026,1171],{"class":64},[32,4028,1194],{"class":72},[32,4030,317],{"class":64},[32,4032,1199],{"class":64},[32,4034,1202],{"class":68},[32,4036,1205],{"class":72},[32,4038,4039,4041,4043,4045,4047,4049,4051,4054],{"class":34,"line":54},[32,4040,1396],{"class":68},[32,4042,1376],{"class":72},[32,4044,317],{"class":64},[32,4046,1199],{"class":64},[32,4048,1202],{"class":68},[32,4050,96],{"class":72},[32,4052,4053],{"class":1386},"'Still loading — unwrap called too early'",[32,4055,1390],{"class":72},[32,4057,4058],{"class":34,"line":61},[32,4059,1210],{"class":72},[3742,4061,4062,4063,4065,4066],{},"Now adding a new subtype to ",[29,4064,1146],{}," causes a compile error here, forcing you to decide how to handle it. This is the entire point of sealed classes — ",[3508,4067,4068,4069,4071,4072,4074],{},"never add ",[29,4070,3600],{}," or ",[29,4073,3750],{}," to a switch over a sealed type.",[4076,4077,4078],"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}",{"title":27,"searchDepth":42,"depth":42,"links":4080},[4081,4084,4085,4086,4087,4088,4089,4090,4091],{"id":16,"depth":42,"text":17,"children":4082},[4083],{"id":557,"depth":48,"text":558},{"id":950,"depth":42,"text":951},{"id":1456,"depth":42,"text":1457},{"id":1918,"depth":42,"text":1919},{"id":2439,"depth":42,"text":2440},{"id":2966,"depth":42,"text":2967},{"id":3499,"depth":42,"text":3500},{"id":3590,"depth":42,"text":3591},{"id":3739,"depth":42,"text":3740},"Deep-dive into Dart class mechanics, const constructors and canonicalization, sealed class exhaustiveness, mixin linearization, factory patterns, and value equality. Code-first engineering reference.","md",{},"\u002Fdart\u002F07-classes-and-objects",{"title":5,"description":4092},"dart\u002F07-classes-and-objects","vMwfZucfcC_g9VOvnUhKxmPCRltLmJh9IGJYi3P5zqY",1789924647708]