[{"data":1,"prerenderedAt":3089},["ShallowReactive",2],{"wiki-page-/en-us/wiki/2026-02-16-flutter-jiao-cheng/ch4-dart-yu-yan-jiao-cheng":3,"wiki-doc-items-/en-us/wiki/2026-02-16-flutter-jiao-cheng/ch4-dart-yu-yan-jiao-cheng":3050,"language-switcher-data-/en-us/wiki/2026-02-16-flutter-jiao-cheng/ch4-dart-yu-yan-jiao-cheng":3073,"wiki-i18n-paths-/en-us/wiki/2026-02-16-flutter-jiao-cheng/ch4-dart-yu-yan-jiao-cheng":3088},{"id":4,"title":5,"body":6,"canonicalPath":3031,"chapter":3032,"chapterSort":3033,"date":3034,"description":120,"docI18nKey":3035,"docKey":3036,"docRoot":3037,"docTitle":3038,"extension":3039,"i18nKey":3040,"isBlogPost":3041,"isWikiDoc":184,"isWikiIndex":3041,"layout":3042,"legacyPath":3042,"locale":3043,"localeSlug":3044,"meta":3045,"navigation":184,"path":3031,"seo":3046,"sourcePath":3047,"sourceStem":3040,"stem":3048,"wikiDepth":127,"__hash__":3049},"content/_i18n/en-us/wiki/2026-02-16-Flutter教程/ch4-Dart语言教程.md","Dart language tutorial",{"type":7,"value":8,"toc":3026},"minimark",[9,14,23,46,50,55,60,69,72,86,89,114,320,324,337,340,353,538,544,572,586,591,703,713,920,924,931,947,1040,1044,1049,1079,1085,1087,1102,1105,1142,1145,1148,1176,1220,1805,1809,1821,1903,1906,1927,1930,1955,1959,1965,1967,1981,1984,2013,2280,2284,2289,2307,2379,2385,2389,2395,2398,2415,2570,2578,2586,2590,2593,2598,2615,2764,2767,2771,2784,2853,2871,2954,2958,2966,2971,2974,2977,3022],[10,11,13],"h3",{"id":12},"code-standards","Code Standards",[15,16,17,18,22],"p",{},"Almost identical to ",[19,20,21],"code",{},"C/C++",".",[24,25,26,33,40],"ul",{},[27,28,29,30,22],"li",{},"Extension: Dart language files end with ",[19,31,32],{},".dart",[27,34,35,36,39],{},"Entry point: The entry method of a Dart file is the ",[19,37,38],{},"main"," method.",[27,41,42,43,22],{},"Semicolon: Most statements in Dart files need to end with a semicolon, but typically no semicolon is added after ",[19,44,45],{},"{ }",[10,47,49],{"id":48},"darts-variables","Dart's variables",[15,51,52,53,22],{},"This section is highly similar to ",[19,54,21],{},[56,57,59],"h4",{"id":58},"string-type-string","String Type - String",[15,61,62,63,66,67,22],{},"Basically similar to ",[19,64,65],{},"std::string"," in ",[19,68,21],{},[15,70,71],{},"Basic Usage:",[24,73,74,77,83],{},[27,75,76],{},"Keyword: String",[27,78,79,80],{},"Grammar: ",[19,81,82],{},"String 属性名 = ‘文本内容’;",[27,84,85],{},"Features: Supports double or single quotation marks, as well as concatenation and template strings.",[15,87,88],{},"Advanced Usage:",[24,90,91,100],{},[27,92,79,93,96,97],{},[19,94,95],{},"String 属性名 = ‘文本内容$变量名’;"," or ",[19,98,99],{},"String 变量名 = ‘文本内容${变量名}’;",[27,101,102,103,106,107,109,110,113],{},"Note: When the content in the template is an expression, use ",[19,104,105],{},"${}",". Whether it's an expression or a variable, ",[19,108,105],{}," is recommended. Try to avoid using ",[19,111,112],{},"$变量名"," whenever possible.",[115,116,121],"pre",{"className":117,"code":118,"language":119,"meta":120,"style":120},"language-dart shiki shiki-themes github-light github-dark","void main()\n{\n  String name = 'Alice';\n  print(name); // Output: Alice\n\n  name = 'Bob';\n  print(name); // Output: Bob\n\n  String greeting = 'Hello, ${name}?$name!';\n  print(greeting); // Output: Hello, Bob?Bob!\n\n  String when = 'it is ${DateTime.now()},now';\n  print(when); // Output: it is 2026-02-16 14:46:17.818262,now\n}\n","dart","",[19,122,123,140,146,166,179,186,199,209,214,249,260,265,297,314],{"__ignoreMap":120},[124,125,128,132,136],"span",{"class":126,"line":127},"line",1,[124,129,131],{"class":130},"szBVR","void",[124,133,135],{"class":134},"sScJk"," main",[124,137,139],{"class":138},"sVt8B","()\n",[124,141,143],{"class":126,"line":142},2,[124,144,145],{"class":138},"{\n",[124,147,149,153,156,159,163],{"class":126,"line":148},3,[124,150,152],{"class":151},"sj4cs","  String",[124,154,155],{"class":138}," name ",[124,157,158],{"class":130},"=",[124,160,162],{"class":161},"sZZnC"," 'Alice'",[124,164,165],{"class":138},";\n",[124,167,169,172,175],{"class":126,"line":168},4,[124,170,171],{"class":134},"  print",[124,173,174],{"class":138},"(name); ",[124,176,178],{"class":177},"sJ8bj","// Output: Alice\n",[124,180,182],{"class":126,"line":181},5,[124,183,185],{"emptyLinePlaceholder":184},true,"\n",[124,187,189,192,194,197],{"class":126,"line":188},6,[124,190,191],{"class":138},"  name ",[124,193,158],{"class":130},[124,195,196],{"class":161}," 'Bob'",[124,198,165],{"class":138},[124,200,202,204,206],{"class":126,"line":201},7,[124,203,171],{"class":134},[124,205,174],{"class":138},[124,207,208],{"class":177},"// Output: Bob\n",[124,210,212],{"class":126,"line":211},8,[124,213,185],{"emptyLinePlaceholder":184},[124,215,217,219,222,224,227,230,233,236,239,242,244,247],{"class":126,"line":216},9,[124,218,152],{"class":151},[124,220,221],{"class":138}," greeting ",[124,223,158],{"class":130},[124,225,226],{"class":161}," 'Hello, ",[124,228,229],{"class":161},"${",[124,231,232],{"class":151},"name",[124,234,235],{"class":161},"}",[124,237,238],{"class":161},"?",[124,240,241],{"class":161},"$",[124,243,232],{"class":151},[124,245,246],{"class":161},"!'",[124,248,165],{"class":138},[124,250,252,254,257],{"class":126,"line":251},10,[124,253,171],{"class":134},[124,255,256],{"class":138},"(greeting); ",[124,258,259],{"class":177},"// Output: Hello, Bob?Bob!\n",[124,261,263],{"class":126,"line":262},11,[124,264,185],{"emptyLinePlaceholder":184},[124,266,268,270,273,276,279,281,284,286,289,292,295],{"class":126,"line":267},12,[124,269,152],{"class":151},[124,271,272],{"class":130}," when",[124,274,275],{"class":130}," =",[124,277,278],{"class":161}," 'it is ",[124,280,229],{"class":161},[124,282,283],{"class":151},"DateTime",[124,285,22],{"class":161},[124,287,288],{"class":134},"now",[124,290,291],{"class":161},"()}",[124,293,294],{"class":161},",now'",[124,296,165],{"class":138},[124,298,300,302,305,308,311],{"class":126,"line":299},13,[124,301,171],{"class":134},[124,303,304],{"class":138},"(",[124,306,307],{"class":130},"when",[124,309,310],{"class":138},"); ",[124,312,313],{"class":177},"// Output: it is 2026-02-16 14:46:17.818262,now\n",[124,315,317],{"class":126,"line":316},14,[124,318,319],{"class":138},"}\n",[56,321,323],{"id":322},"numeric-types-intdoublenum","Numeric Types - int/double/num",[15,325,326,327,329,330,333,334,22],{},"It is basically similar to ",[19,328,21],{},", ",[19,331,332],{},"int",", and ",[19,335,336],{},"double",[15,338,339],{},"Basic Syntax",[24,341,342,345,348],{},[27,343,344],{},"Scenario: When we need to describe a numeric type, we use int/num/double.",[27,346,347],{},"Difference: int - integer number, double - decimal number, num - can be either integer or decimal.",[27,349,79,350],{},[19,351,352],{},"int/num/double 属性名 = 数值;",[115,354,356],{"className":117,"code":355,"language":119,"meta":120,"style":120},"void main()\n{\n  int age = 23;\n  print(age); // Output: 23\n\n  age = 24;\n  print(age); // Output: 24\n\n  double height = 1.78;\n  print(height); // Output: 1.78\n\n  height = 1.80;\n  print(height); // Output: 1.8\n\n  num weight = 90.5;\n  print(weight); // Output: 90.5\n\n  weight = 76;\n  print(weight); // Output: 76\n}\n",[19,357,358,366,370,385,395,399,411,420,424,439,449,453,465,474,478,494,505,510,523,533],{"__ignoreMap":120},[124,359,360,362,364],{"class":126,"line":127},[124,361,131],{"class":130},[124,363,135],{"class":134},[124,365,139],{"class":138},[124,367,368],{"class":126,"line":142},[124,369,145],{"class":138},[124,371,372,375,378,380,383],{"class":126,"line":148},[124,373,374],{"class":151},"  int",[124,376,377],{"class":138}," age ",[124,379,158],{"class":130},[124,381,382],{"class":151}," 23",[124,384,165],{"class":138},[124,386,387,389,392],{"class":126,"line":168},[124,388,171],{"class":134},[124,390,391],{"class":138},"(age); ",[124,393,394],{"class":177},"// Output: 23\n",[124,396,397],{"class":126,"line":181},[124,398,185],{"emptyLinePlaceholder":184},[124,400,401,404,406,409],{"class":126,"line":188},[124,402,403],{"class":138},"  age ",[124,405,158],{"class":130},[124,407,408],{"class":151}," 24",[124,410,165],{"class":138},[124,412,413,415,417],{"class":126,"line":201},[124,414,171],{"class":134},[124,416,391],{"class":138},[124,418,419],{"class":177},"// Output: 24\n",[124,421,422],{"class":126,"line":211},[124,423,185],{"emptyLinePlaceholder":184},[124,425,426,429,432,434,437],{"class":126,"line":216},[124,427,428],{"class":151},"  double",[124,430,431],{"class":138}," height ",[124,433,158],{"class":130},[124,435,436],{"class":151}," 1.78",[124,438,165],{"class":138},[124,440,441,443,446],{"class":126,"line":251},[124,442,171],{"class":134},[124,444,445],{"class":138},"(height); ",[124,447,448],{"class":177},"// Output: 1.78\n",[124,450,451],{"class":126,"line":262},[124,452,185],{"emptyLinePlaceholder":184},[124,454,455,458,460,463],{"class":126,"line":267},[124,456,457],{"class":138},"  height ",[124,459,158],{"class":130},[124,461,462],{"class":151}," 1.80",[124,464,165],{"class":138},[124,466,467,469,471],{"class":126,"line":299},[124,468,171],{"class":134},[124,470,445],{"class":138},[124,472,473],{"class":177},"// Output: 1.8\n",[124,475,476],{"class":126,"line":316},[124,477,185],{"emptyLinePlaceholder":184},[124,479,481,484,487,489,492],{"class":126,"line":480},15,[124,482,483],{"class":151},"  num",[124,485,486],{"class":138}," weight ",[124,488,158],{"class":130},[124,490,491],{"class":151}," 90.5",[124,493,165],{"class":138},[124,495,497,499,502],{"class":126,"line":496},16,[124,498,171],{"class":134},[124,500,501],{"class":138},"(weight); ",[124,503,504],{"class":177},"// Output: 90.5\n",[124,506,508],{"class":126,"line":507},17,[124,509,185],{"emptyLinePlaceholder":184},[124,511,513,516,518,521],{"class":126,"line":512},18,[124,514,515],{"class":138},"  weight ",[124,517,158],{"class":130},[124,519,520],{"class":151}," 76",[124,522,165],{"class":138},[124,524,526,528,530],{"class":126,"line":525},19,[124,527,171],{"class":134},[124,529,501],{"class":138},[124,531,532],{"class":177},"// Output: 76\n",[124,534,536],{"class":126,"line":535},20,[124,537,319],{"class":138},[15,539,540],{},[541,542,543],"strong",{},"The essential differences between the three:",[115,545,549],{"className":546,"code":547,"language":548,"meta":120,"style":120},"language-bash shiki shiki-themes github-light github-dark","num\n ├── int\n └── double\n","bash",[19,550,551,556,564],{"__ignoreMap":120},[124,552,553],{"class":126,"line":127},[124,554,555],{"class":134},"num\n",[124,557,558,561],{"class":126,"line":142},[124,559,560],{"class":134}," ├──",[124,562,563],{"class":161}," int\n",[124,565,566,569],{"class":126,"line":148},[124,567,568],{"class":134}," └──",[124,570,571],{"class":161}," double\n",[24,573,574,577],{},[27,575,576],{},"👉 num is the parent class",[27,578,579,580,582,583,585],{},"👉 ",[19,581,332],{}," and ",[19,584,336],{}," are subclasses",[15,587,588],{},[541,589,590],{},"Direct Assignment Rule Summary Table:",[592,593,594,610],"table",{},[595,596,597],"thead",{},[598,599,600,604,607],"tr",{},[601,602,603],"th",{},"Assignment direction",[601,605,606],{},"Can it be assigned directly?",[601,608,609],{},"Explanation",[611,612,613,625,634,645,655,665,675,685,694],"tbody",{},[598,614,615,619,622],{},[616,617,618],"td",{},"int → num",[616,620,621],{},"✅ Yes",[616,623,624],{},"The subclass gives to the parent class.",[598,626,627,630,632],{},[616,628,629],{},"double → num",[616,631,621],{},[616,633,624],{},[598,635,636,639,642],{},[616,637,638],{},"num → int",[616,640,641],{},"❌ No",[616,643,644],{},"It might be double.",[598,646,647,650,652],{},[616,648,649],{},"num → double",[616,651,641],{},[616,653,654],{},"It might be int",[598,656,657,660,662],{},[616,658,659],{},"int → double",[616,661,641],{},[616,663,664],{},"Dart does not automatically convert",[598,666,667,670,672],{},[616,668,669],{},"double → int",[616,671,641],{},[616,673,674],{},"will lose decimals",[598,676,677,680,683],{},[616,678,679],{},"int → int",[616,681,682],{},"✅",[616,684],{},[598,686,687,690,692],{},[616,688,689],{},"double → double",[616,691,682],{},[616,693],{},[598,695,696,699,701],{},[616,697,698],{},"num → num",[616,700,682],{},[616,702],{},[15,704,705,706,582,709,712],{},"Although direct assignment is not possible, you can convert the value first and then assign it. This can be achieved using methods such as ",[19,707,708],{},"toInt()",[19,710,711],{},"toDouble()",", for example:",[115,714,716],{"className":117,"code":715,"language":119,"meta":120,"style":120},"void main()\n{\n  int a = 10;\n  print(a); // Output: 10\n\n  double b = 3.14;\n  print(b); // Output: 3.14\n  \n  // double赋值给double\n  double c = b;\n  print(c); // Output: 3.14\n\n  // int赋值给double\n  b = a.toDouble();\n  print(b); // Output: 10.0\n\n  num d = 5.6;\n  print(d); // Output: 5.6\n\n  // num赋值给int\n  a = d.toInt();\n  print(a); // Output: 5\n\n}\n",[19,717,718,726,730,744,754,758,772,782,787,792,804,813,817,822,838,847,851,865,875,879,884,900,910,915],{"__ignoreMap":120},[124,719,720,722,724],{"class":126,"line":127},[124,721,131],{"class":130},[124,723,135],{"class":134},[124,725,139],{"class":138},[124,727,728],{"class":126,"line":142},[124,729,145],{"class":138},[124,731,732,734,737,739,742],{"class":126,"line":148},[124,733,374],{"class":151},[124,735,736],{"class":138}," a ",[124,738,158],{"class":130},[124,740,741],{"class":151}," 10",[124,743,165],{"class":138},[124,745,746,748,751],{"class":126,"line":168},[124,747,171],{"class":134},[124,749,750],{"class":138},"(a); ",[124,752,753],{"class":177},"// Output: 10\n",[124,755,756],{"class":126,"line":181},[124,757,185],{"emptyLinePlaceholder":184},[124,759,760,762,765,767,770],{"class":126,"line":188},[124,761,428],{"class":151},[124,763,764],{"class":138}," b ",[124,766,158],{"class":130},[124,768,769],{"class":151}," 3.14",[124,771,165],{"class":138},[124,773,774,776,779],{"class":126,"line":201},[124,775,171],{"class":134},[124,777,778],{"class":138},"(b); ",[124,780,781],{"class":177},"// Output: 3.14\n",[124,783,784],{"class":126,"line":211},[124,785,786],{"class":138},"  \n",[124,788,789],{"class":126,"line":216},[124,790,791],{"class":177},"  // double赋值给double\n",[124,793,794,796,799,801],{"class":126,"line":251},[124,795,428],{"class":151},[124,797,798],{"class":138}," c ",[124,800,158],{"class":130},[124,802,803],{"class":138}," b;\n",[124,805,806,808,811],{"class":126,"line":262},[124,807,171],{"class":134},[124,809,810],{"class":138},"(c); ",[124,812,781],{"class":177},[124,814,815],{"class":126,"line":267},[124,816,185],{"emptyLinePlaceholder":184},[124,818,819],{"class":126,"line":299},[124,820,821],{"class":177},"  // int赋值给double\n",[124,823,824,827,829,832,835],{"class":126,"line":316},[124,825,826],{"class":138},"  b ",[124,828,158],{"class":130},[124,830,831],{"class":138}," a.",[124,833,834],{"class":134},"toDouble",[124,836,837],{"class":138},"();\n",[124,839,840,842,844],{"class":126,"line":480},[124,841,171],{"class":134},[124,843,778],{"class":138},[124,845,846],{"class":177},"// Output: 10.0\n",[124,848,849],{"class":126,"line":496},[124,850,185],{"emptyLinePlaceholder":184},[124,852,853,855,858,860,863],{"class":126,"line":507},[124,854,483],{"class":151},[124,856,857],{"class":138}," d ",[124,859,158],{"class":130},[124,861,862],{"class":151}," 5.6",[124,864,165],{"class":138},[124,866,867,869,872],{"class":126,"line":512},[124,868,171],{"class":134},[124,870,871],{"class":138},"(d); ",[124,873,874],{"class":177},"// Output: 5.6\n",[124,876,877],{"class":126,"line":525},[124,878,185],{"emptyLinePlaceholder":184},[124,880,881],{"class":126,"line":535},[124,882,883],{"class":177},"  // num赋值给int\n",[124,885,887,890,892,895,898],{"class":126,"line":886},21,[124,888,889],{"class":138},"  a ",[124,891,158],{"class":130},[124,893,894],{"class":138}," d.",[124,896,897],{"class":134},"toInt",[124,899,837],{"class":138},[124,901,903,905,907],{"class":126,"line":902},22,[124,904,171],{"class":134},[124,906,750],{"class":138},[124,908,909],{"class":177},"// Output: 5\n",[124,911,913],{"class":126,"line":912},23,[124,914,185],{"emptyLinePlaceholder":184},[124,916,918],{"class":126,"line":917},24,[124,919,319],{"class":138},[56,921,923],{"id":922},"boolean-type-bool","Boolean type - bool",[15,925,62,926,66,929,22],{},[19,927,928],{},"bool",[19,930,21],{},[24,932,933,939,942],{},[27,934,935,936,938],{},"Scenario: When we need a property to represent whether something is currently true or false, we must use the ",[19,937,928],{}," keyword to declare it.",[27,940,941],{},"Requirement: Declare whether you have completed the assignment.",[27,943,79,944],{},[19,945,946],{},"bool 属性名 = true/false;",[115,948,950],{"className":117,"code":949,"language":119,"meta":120,"style":120},"void main()\n{\n  bool isFinishWork = false;\n  print('我的工作完成状态为：$isFinishWork'); //Output: 我的工作完成状态为：false\n  \n  isFinishWork = true;\n  print('我的工作完成状态为：$isFinishWork'); //Output: 我的工作完成状态为：true\n}\n",[19,951,952,960,964,979,1001,1005,1017,1036],{"__ignoreMap":120},[124,953,954,956,958],{"class":126,"line":127},[124,955,131],{"class":130},[124,957,135],{"class":134},[124,959,139],{"class":138},[124,961,962],{"class":126,"line":142},[124,963,145],{"class":138},[124,965,966,969,972,974,977],{"class":126,"line":148},[124,967,968],{"class":151},"  bool",[124,970,971],{"class":138}," isFinishWork ",[124,973,158],{"class":130},[124,975,976],{"class":151}," false",[124,978,165],{"class":138},[124,980,981,983,985,988,990,993,996,998],{"class":126,"line":168},[124,982,171],{"class":134},[124,984,304],{"class":138},[124,986,987],{"class":161},"'我的工作完成状态为：",[124,989,241],{"class":161},[124,991,992],{"class":151},"isFinishWork",[124,994,995],{"class":161},"'",[124,997,310],{"class":138},[124,999,1000],{"class":177},"//Output: 我的工作完成状态为：false\n",[124,1002,1003],{"class":126,"line":181},[124,1004,786],{"class":138},[124,1006,1007,1010,1012,1015],{"class":126,"line":188},[124,1008,1009],{"class":138},"  isFinishWork ",[124,1011,158],{"class":130},[124,1013,1014],{"class":151}," true",[124,1016,165],{"class":138},[124,1018,1019,1021,1023,1025,1027,1029,1031,1033],{"class":126,"line":201},[124,1020,171],{"class":134},[124,1022,304],{"class":138},[124,1024,987],{"class":161},[124,1026,241],{"class":161},[124,1028,992],{"class":151},[124,1030,995],{"class":161},[124,1032,310],{"class":138},[124,1034,1035],{"class":177},"//Output: 我的工作完成状态为：true\n",[124,1037,1038],{"class":126,"line":211},[124,1039,319],{"class":138},[56,1041,1043],{"id":1042},"list-type-list","List type - List",[1045,1046,1048],"h5",{"id":1047},"list","List",[15,1050,1051,1052,1055,1056,66,1059,1061,1062,1065,1066,1068,1069,1072,1073,1075,1076,22],{},"Basically similar to the ",[19,1053,1054],{},"STL"," vector ",[19,1057,1058],{},"std::vector",[19,1060,21],{},". (Note: it is not like ",[19,1063,1064],{},"std::list",".)\nAnd ",[19,1067,1058],{}," we often use it as ",[19,1070,1071],{},"不定长数组",", so when you don't understand ",[19,1074,1058],{},", you can think of it as an advanced ",[19,1077,1078],{},"数组",[15,1080,1081,1082,1084],{},"This section definitely won't cover all the uses of ",[19,1083,1048],{},", but it will cover most of the commonly used ones. If you forget, you can always look up the documentation—there's no need to memorize every single usage. The ones you use frequently will naturally stick. For now, just go through it once and know that such a thing exists.",[15,1086,71],{},[24,1088,1089,1092,1095],{},[27,1090,1091],{},"Scenario: When a variable needs to store multiple values, you can use the List type.",[27,1093,1094],{},"Requirement: A class of students is stored using a List, supporting student search, addition, deletion, and iteration.",[27,1096,1097,1098,1101],{},"Syntax: List attribute_name = ",[124,1099,1100],{},"'Student1', 'Student2'",";",[15,1103,1104],{},"Common Usage 1:",[24,1106,1107,1114,1117,1122,1129,1135],{},[27,1108,1109,1110,1113],{},"Add -",[19,1111,1112],{},"add(内容)"," at the end.",[27,1115,1116],{},"Add a list at the end:",[27,1118,1119],{},[19,1120,1121],{},"addAll(列表)",[27,1123,1124,1125,1128],{},"Delete the first ",[19,1126,1127],{},"-"," that satisfies the content.",[27,1130,1131,1132],{},"Delete the last -",[19,1133,1134],{},"removeLast()",[27,1136,1137,1138,1141],{},"Delete data within the index range - ",[19,1139,1140],{},"removeRange(start,end)"," Note: end is not included in the deletion range.",[15,1143,1144],{},"Common Usage 2:",[15,1146,1147],{},"Below are a few methods and properties. If you've studied object-oriented programming, you'll know what they are. If not, I'll give a quick explanation:",[115,1149,1151],{"className":546,"code":1150,"language":548,"meta":120,"style":120},"类-class的声明与定义\n对象-class类型的实例,(不好理解也可以理解为class类型的变量)\n方法-class里的函数\n属性-class里的变量\n",[19,1152,1153,1158,1166,1171],{"__ignoreMap":120},[124,1154,1155],{"class":126,"line":127},[124,1156,1157],{"class":134},"类-class的声明与定义\n",[124,1159,1160,1163],{"class":126,"line":142},[124,1161,1162],{"class":134},"对象-class类型的实例,(不好理解也可以理解为class类型的变量",[124,1164,1165],{"class":138},")\n",[124,1167,1168],{"class":126,"line":148},[124,1169,1170],{"class":134},"方法-class里的函数\n",[124,1172,1173],{"class":126,"line":168},[124,1174,1175],{"class":134},"属性-class里的变量\n",[24,1177,1178,1184,1190,1196,1202,1208,1214],{},[27,1179,1180,1181],{},"Loop (Method) - ",[19,1182,1183],{},"forEach((item) {});",[27,1185,1186,1187],{},"Do all conditions meet (method) - ",[19,1188,1189],{},"every((item) { return 布尔值 })；",[27,1191,1192,1193],{},"Filter out data that meets the criteria (method) - ",[19,1194,1195],{},"where((item) { return 布尔值 })；",[27,1197,1198,1199],{},"Length of a List (Property) - ",[19,1200,1201],{},"length",[27,1203,1204,1205],{},"The last element (attribute) - ",[19,1206,1207],{},"last",[27,1209,1210,1211],{},"First element (attribute) - ",[19,1212,1213],{},"first",[27,1215,1216,1217],{},"Is empty (attribute) - ",[19,1218,1219],{},"isEmpty",[115,1221,1223],{"className":117,"code":1222,"language":119,"meta":120,"style":120},"void main(List\u003CString> args) \n{\n  List students = [\"张三\", \"李四\", \"王五\"];\n  print(students); // Output: [张三, 李四, 王五]\n\n  students.add(\"新同学\"); // 在尾部进行添加\n  print(students); // Output: [张三, 李四, 王五, 新同学]s\n\n  students.addAll([\"新来的同学1\", \"新来的同学2\"]); // 在尾部添加一个列表\n  print(students); // Output: [张三, 李四, 王五, 新同学, 新来的同学1, 新来的同学2]\n\n  students.add(\"新同学\"); // 在尾部进行添加\n  print(students); // Output: [张三, 李四, 王五, 新同学, 新来的同学1, 新来的同学2, 新同学]\n\n  students.remove(\"新同学\"); // 删除满足内容的第一个\n  print(students); // Output: [张三, 李四, 王五, 新来的同学1, 新来的同学2, 新同学]\n\n  // 删除最后一个同学\n  students.removeLast(); // 删除最后一个\n  print(students); // Output: [张三, 李四, 王五, 新来的同学1, 新来的同学2]\n\n  // 删除前两个同学\n  // start开始的索引 end结束的索引-不包含在删除范围内\n  students.removeRange(0, 2);\n  print(students); // Output: [王五, 新来的同学1, 新来的同学2]\n\n  // forEach针对每个列表每个数据进行操作\n  students.forEach((item) \n  {\n    // 书写逻辑\n    print(item); // Output: 王五\n                 //         新来的同学1\n                 //         新来的同学2\n  });\n\n  // 是不是所有的同学都以新为开头\n  bool isAllStartWithNew = students.every((item) \n  {\n    return item.toString().startsWith(\"新\"); // 返回一个条件\n  });\n  print(isAllStartWithNew); // Output: false (因为王五不以新开头,需要满足所有的同学都以新开头才会返回true)\n\n  // 筛选出所有的以新开头的同学呢\n  List newStudents = students.where((item) \n  {\n    return item.toString().startsWith(\"新\");\n  }).toList();\n  print(newStudents); // Output: [新来的同学1, 新来的同学2]\n\n\n  // List常用的一些属性 方法() .属性\n  // 列表的长度\n  print(students.length); // Output: 3\n\n  // 列表的第一个\n  print(students.first); // Output: 王五\n\n  // 列表的最后一个\n  print(students.last); // Output: 新来的同学2\n\n  // 列表是否是空的\n  print(students.isEmpty); // Output: false (因为列表中有数据)\n}\n",[19,1224,1225,1244,1248,1277,1287,1291,1309,1318,1322,1346,1355,1359,1373,1382,1386,1402,1411,1415,1420,1433,1442,1446,1451,1456,1476,1486,1491,1497,1508,1514,1520,1532,1538,1544,1550,1555,1561,1579,1584,1612,1617,1628,1633,1639,1656,1661,1680,1691,1702,1707,1712,1718,1724,1735,1740,1746,1756,1761,1767,1778,1783,1789,1800],{"__ignoreMap":120},[124,1226,1227,1229,1231,1233,1235,1238,1241],{"class":126,"line":127},[124,1228,131],{"class":130},[124,1230,135],{"class":134},[124,1232,304],{"class":138},[124,1234,1048],{"class":151},[124,1236,1237],{"class":138},"\u003C",[124,1239,1240],{"class":151},"String",[124,1242,1243],{"class":138},"> args) \n",[124,1245,1246],{"class":126,"line":142},[124,1247,145],{"class":138},[124,1249,1250,1253,1256,1258,1261,1264,1266,1269,1271,1274],{"class":126,"line":148},[124,1251,1252],{"class":151},"  List",[124,1254,1255],{"class":138}," students ",[124,1257,158],{"class":130},[124,1259,1260],{"class":138}," [",[124,1262,1263],{"class":161},"\"张三\"",[124,1265,329],{"class":138},[124,1267,1268],{"class":161},"\"李四\"",[124,1270,329],{"class":138},[124,1272,1273],{"class":161},"\"王五\"",[124,1275,1276],{"class":138},"];\n",[124,1278,1279,1281,1284],{"class":126,"line":168},[124,1280,171],{"class":134},[124,1282,1283],{"class":138},"(students); ",[124,1285,1286],{"class":177},"// Output: [张三, 李四, 王五]\n",[124,1288,1289],{"class":126,"line":181},[124,1290,185],{"emptyLinePlaceholder":184},[124,1292,1293,1296,1299,1301,1304,1306],{"class":126,"line":188},[124,1294,1295],{"class":138},"  students.",[124,1297,1298],{"class":134},"add",[124,1300,304],{"class":138},[124,1302,1303],{"class":161},"\"新同学\"",[124,1305,310],{"class":138},[124,1307,1308],{"class":177},"// 在尾部进行添加\n",[124,1310,1311,1313,1315],{"class":126,"line":201},[124,1312,171],{"class":134},[124,1314,1283],{"class":138},[124,1316,1317],{"class":177},"// Output: [张三, 李四, 王五, 新同学]s\n",[124,1319,1320],{"class":126,"line":211},[124,1321,185],{"emptyLinePlaceholder":184},[124,1323,1324,1326,1329,1332,1335,1337,1340,1343],{"class":126,"line":216},[124,1325,1295],{"class":138},[124,1327,1328],{"class":134},"addAll",[124,1330,1331],{"class":138},"([",[124,1333,1334],{"class":161},"\"新来的同学1\"",[124,1336,329],{"class":138},[124,1338,1339],{"class":161},"\"新来的同学2\"",[124,1341,1342],{"class":138},"]); ",[124,1344,1345],{"class":177},"// 在尾部添加一个列表\n",[124,1347,1348,1350,1352],{"class":126,"line":251},[124,1349,171],{"class":134},[124,1351,1283],{"class":138},[124,1353,1354],{"class":177},"// Output: [张三, 李四, 王五, 新同学, 新来的同学1, 新来的同学2]\n",[124,1356,1357],{"class":126,"line":262},[124,1358,185],{"emptyLinePlaceholder":184},[124,1360,1361,1363,1365,1367,1369,1371],{"class":126,"line":267},[124,1362,1295],{"class":138},[124,1364,1298],{"class":134},[124,1366,304],{"class":138},[124,1368,1303],{"class":161},[124,1370,310],{"class":138},[124,1372,1308],{"class":177},[124,1374,1375,1377,1379],{"class":126,"line":299},[124,1376,171],{"class":134},[124,1378,1283],{"class":138},[124,1380,1381],{"class":177},"// Output: [张三, 李四, 王五, 新同学, 新来的同学1, 新来的同学2, 新同学]\n",[124,1383,1384],{"class":126,"line":316},[124,1385,185],{"emptyLinePlaceholder":184},[124,1387,1388,1390,1393,1395,1397,1399],{"class":126,"line":480},[124,1389,1295],{"class":138},[124,1391,1392],{"class":134},"remove",[124,1394,304],{"class":138},[124,1396,1303],{"class":161},[124,1398,310],{"class":138},[124,1400,1401],{"class":177},"// 删除满足内容的第一个\n",[124,1403,1404,1406,1408],{"class":126,"line":496},[124,1405,171],{"class":134},[124,1407,1283],{"class":138},[124,1409,1410],{"class":177},"// Output: [张三, 李四, 王五, 新来的同学1, 新来的同学2, 新同学]\n",[124,1412,1413],{"class":126,"line":507},[124,1414,185],{"emptyLinePlaceholder":184},[124,1416,1417],{"class":126,"line":512},[124,1418,1419],{"class":177},"  // 删除最后一个同学\n",[124,1421,1422,1424,1427,1430],{"class":126,"line":525},[124,1423,1295],{"class":138},[124,1425,1426],{"class":134},"removeLast",[124,1428,1429],{"class":138},"(); ",[124,1431,1432],{"class":177},"// 删除最后一个\n",[124,1434,1435,1437,1439],{"class":126,"line":535},[124,1436,171],{"class":134},[124,1438,1283],{"class":138},[124,1440,1441],{"class":177},"// Output: [张三, 李四, 王五, 新来的同学1, 新来的同学2]\n",[124,1443,1444],{"class":126,"line":886},[124,1445,185],{"emptyLinePlaceholder":184},[124,1447,1448],{"class":126,"line":902},[124,1449,1450],{"class":177},"  // 删除前两个同学\n",[124,1452,1453],{"class":126,"line":912},[124,1454,1455],{"class":177},"  // start开始的索引 end结束的索引-不包含在删除范围内\n",[124,1457,1458,1460,1463,1465,1468,1470,1473],{"class":126,"line":917},[124,1459,1295],{"class":138},[124,1461,1462],{"class":134},"removeRange",[124,1464,304],{"class":138},[124,1466,1467],{"class":151},"0",[124,1469,329],{"class":138},[124,1471,1472],{"class":151},"2",[124,1474,1475],{"class":138},");\n",[124,1477,1479,1481,1483],{"class":126,"line":1478},25,[124,1480,171],{"class":134},[124,1482,1283],{"class":138},[124,1484,1485],{"class":177},"// Output: [王五, 新来的同学1, 新来的同学2]\n",[124,1487,1489],{"class":126,"line":1488},26,[124,1490,185],{"emptyLinePlaceholder":184},[124,1492,1494],{"class":126,"line":1493},27,[124,1495,1496],{"class":177},"  // forEach针对每个列表每个数据进行操作\n",[124,1498,1500,1502,1505],{"class":126,"line":1499},28,[124,1501,1295],{"class":138},[124,1503,1504],{"class":134},"forEach",[124,1506,1507],{"class":138},"((item) \n",[124,1509,1511],{"class":126,"line":1510},29,[124,1512,1513],{"class":138},"  {\n",[124,1515,1517],{"class":126,"line":1516},30,[124,1518,1519],{"class":177},"    // 书写逻辑\n",[124,1521,1523,1526,1529],{"class":126,"line":1522},31,[124,1524,1525],{"class":134},"    print",[124,1527,1528],{"class":138},"(item); ",[124,1530,1531],{"class":177},"// Output: 王五\n",[124,1533,1535],{"class":126,"line":1534},32,[124,1536,1537],{"class":177},"                 //         新来的同学1\n",[124,1539,1541],{"class":126,"line":1540},33,[124,1542,1543],{"class":177},"                 //         新来的同学2\n",[124,1545,1547],{"class":126,"line":1546},34,[124,1548,1549],{"class":138},"  });\n",[124,1551,1553],{"class":126,"line":1552},35,[124,1554,185],{"emptyLinePlaceholder":184},[124,1556,1558],{"class":126,"line":1557},36,[124,1559,1560],{"class":177},"  // 是不是所有的同学都以新为开头\n",[124,1562,1564,1566,1569,1571,1574,1577],{"class":126,"line":1563},37,[124,1565,968],{"class":151},[124,1567,1568],{"class":138}," isAllStartWithNew ",[124,1570,158],{"class":130},[124,1572,1573],{"class":138}," students.",[124,1575,1576],{"class":134},"every",[124,1578,1507],{"class":138},[124,1580,1582],{"class":126,"line":1581},38,[124,1583,1513],{"class":138},[124,1585,1587,1590,1593,1596,1599,1602,1604,1607,1609],{"class":126,"line":1586},39,[124,1588,1589],{"class":130},"    return",[124,1591,1592],{"class":138}," item.",[124,1594,1595],{"class":134},"toString",[124,1597,1598],{"class":138},"().",[124,1600,1601],{"class":134},"startsWith",[124,1603,304],{"class":138},[124,1605,1606],{"class":161},"\"新\"",[124,1608,310],{"class":138},[124,1610,1611],{"class":177},"// 返回一个条件\n",[124,1613,1615],{"class":126,"line":1614},40,[124,1616,1549],{"class":138},[124,1618,1620,1622,1625],{"class":126,"line":1619},41,[124,1621,171],{"class":134},[124,1623,1624],{"class":138},"(isAllStartWithNew); ",[124,1626,1627],{"class":177},"// Output: false (因为王五不以新开头,需要满足所有的同学都以新开头才会返回true)\n",[124,1629,1631],{"class":126,"line":1630},42,[124,1632,185],{"emptyLinePlaceholder":184},[124,1634,1636],{"class":126,"line":1635},43,[124,1637,1638],{"class":177},"  // 筛选出所有的以新开头的同学呢\n",[124,1640,1642,1644,1647,1649,1651,1654],{"class":126,"line":1641},44,[124,1643,1252],{"class":151},[124,1645,1646],{"class":138}," newStudents ",[124,1648,158],{"class":130},[124,1650,1573],{"class":138},[124,1652,1653],{"class":134},"where",[124,1655,1507],{"class":138},[124,1657,1659],{"class":126,"line":1658},45,[124,1660,1513],{"class":138},[124,1662,1664,1666,1668,1670,1672,1674,1676,1678],{"class":126,"line":1663},46,[124,1665,1589],{"class":130},[124,1667,1592],{"class":138},[124,1669,1595],{"class":134},[124,1671,1598],{"class":138},[124,1673,1601],{"class":134},[124,1675,304],{"class":138},[124,1677,1606],{"class":161},[124,1679,1475],{"class":138},[124,1681,1683,1686,1689],{"class":126,"line":1682},47,[124,1684,1685],{"class":138},"  }).",[124,1687,1688],{"class":134},"toList",[124,1690,837],{"class":138},[124,1692,1694,1696,1699],{"class":126,"line":1693},48,[124,1695,171],{"class":134},[124,1697,1698],{"class":138},"(newStudents); ",[124,1700,1701],{"class":177},"// Output: [新来的同学1, 新来的同学2]\n",[124,1703,1705],{"class":126,"line":1704},49,[124,1706,185],{"emptyLinePlaceholder":184},[124,1708,1710],{"class":126,"line":1709},50,[124,1711,185],{"emptyLinePlaceholder":184},[124,1713,1715],{"class":126,"line":1714},51,[124,1716,1717],{"class":177},"  // List常用的一些属性 方法() .属性\n",[124,1719,1721],{"class":126,"line":1720},52,[124,1722,1723],{"class":177},"  // 列表的长度\n",[124,1725,1727,1729,1732],{"class":126,"line":1726},53,[124,1728,171],{"class":134},[124,1730,1731],{"class":138},"(students.length); ",[124,1733,1734],{"class":177},"// Output: 3\n",[124,1736,1738],{"class":126,"line":1737},54,[124,1739,185],{"emptyLinePlaceholder":184},[124,1741,1743],{"class":126,"line":1742},55,[124,1744,1745],{"class":177},"  // 列表的第一个\n",[124,1747,1749,1751,1754],{"class":126,"line":1748},56,[124,1750,171],{"class":134},[124,1752,1753],{"class":138},"(students.first); ",[124,1755,1531],{"class":177},[124,1757,1759],{"class":126,"line":1758},57,[124,1760,185],{"emptyLinePlaceholder":184},[124,1762,1764],{"class":126,"line":1763},58,[124,1765,1766],{"class":177},"  // 列表的最后一个\n",[124,1768,1770,1772,1775],{"class":126,"line":1769},59,[124,1771,171],{"class":134},[124,1773,1774],{"class":138},"(students.last); ",[124,1776,1777],{"class":177},"// Output: 新来的同学2\n",[124,1779,1781],{"class":126,"line":1780},60,[124,1782,185],{"emptyLinePlaceholder":184},[124,1784,1786],{"class":126,"line":1785},61,[124,1787,1788],{"class":177},"  // 列表是否是空的\n",[124,1790,1792,1794,1797],{"class":126,"line":1791},62,[124,1793,171],{"class":134},[124,1795,1796],{"class":138},"(students.isEmpty); ",[124,1798,1799],{"class":177},"// Output: false (因为列表中有数据)\n",[124,1801,1803],{"class":126,"line":1802},63,[124,1804,319],{"class":138},[1045,1806,1808],{"id":1807},"main-function-entry-parameters","Main function entry parameters",[15,1810,1811,1812,1815,1816,66,1819,22],{},"In addition to the code above, you can see that ",[19,1813,1814],{},"void main(List\u003CString> args)"," already has parameters. This is actually similar to ",[19,1817,1818],{},"int main(int argc, char* argv[])",[19,1820,21],{},[592,1822,1823,1835],{},[595,1824,1825],{},[598,1826,1827,1830,1832],{},[601,1828,1829],{},"Compare points",[601,1831,21],{},[601,1833,1834],{},"Dart",[611,1836,1837,1852,1867,1881,1892],{},[598,1838,1839,1842,1847],{},[616,1840,1841],{},"Number of parameters",[616,1843,1844],{},[19,1845,1846],{},"argc",[616,1848,1849],{},[19,1850,1851],{},"args.length",[598,1853,1854,1857,1862],{},[616,1855,1856],{},"Parameter array",[616,1858,1859],{},[19,1860,1861],{},"argv[]",[616,1863,1864],{},[19,1865,1866],{},"List\u003CString>",[598,1868,1869,1872,1878],{},[616,1870,1871],{},"Does it include the program name?",[616,1873,1874,1875,1877],{},"✅ argv",[124,1876,1467],{}," is the program name",[616,1879,1880],{},"❌ Not included",[598,1882,1883,1886,1889],{},[616,1884,1885],{},"Type safety",[616,1887,1888],{},"❌ char*",[616,1890,1891],{},"✅ String",[598,1893,1894,1897,1900],{},[616,1895,1896],{},"Memory management",[616,1898,1899],{},"Manual",[616,1901,1902],{},"automatic",[15,1904,1905],{},"For example",[115,1907,1909],{"className":546,"code":1908,"language":548,"meta":120,"style":120},"dart run app.dart hello world\n",[19,1910,1911],{"__ignoreMap":120},[124,1912,1913,1915,1918,1921,1924],{"class":126,"line":127},[124,1914,119],{"class":134},[124,1916,1917],{"class":161}," run",[124,1919,1920],{"class":161}," app.dart",[124,1922,1923],{"class":161}," hello",[124,1925,1926],{"class":161}," world\n",[15,1928,1929],{},"At this moment",[115,1931,1933],{"className":546,"code":1932,"language":548,"meta":120,"style":120},"args[0] = \"hello\"\nargs[1] = \"world\"\n",[19,1934,1935,1945],{"__ignoreMap":120},[124,1936,1937,1940,1942],{"class":126,"line":127},[124,1938,1939],{"class":134},"args[0]",[124,1941,275],{"class":161},[124,1943,1944],{"class":161}," \"hello\"\n",[124,1946,1947,1950,1952],{"class":126,"line":142},[124,1948,1949],{"class":134},"args[1]",[124,1951,275],{"class":161},[124,1953,1954],{"class":161}," \"world\"\n",[56,1956,1958],{"id":1957},"dictionary-type-map","Dictionary Type - Map",[15,1960,1961,1962,22],{},"Similar to C++'s ",[19,1963,1964],{},"std::map",[15,1966,71],{},[24,1968,1969,1972,1975],{},[27,1970,1971],{},"A key corresponds to a value.",[27,1973,1974],{},"Syntax 1: Map property name = { key: value };",[27,1976,1977,1978],{},"Grammar 2: ",[19,1979,1980],{},"字典[key] 可以取值和赋值",[15,1982,1983],{},"Common Usage:",[24,1985,1986,1991,1996,2002,2007],{},[27,1987,1988,1989],{},"Loop - ",[19,1990,1504],{},[27,1992,1993,1994],{},"When adding a dictionary-",[19,1995,1328],{},[27,1997,1998,1999],{},"Whether a certain key is included - ",[19,2000,2001],{},"containsKey",[27,2003,2004,2005],{},"Delete a key-",[19,2006,1392],{},[27,2008,2009,2010],{},"Clear-",[19,2011,2012],{},"clear",[115,2014,2016],{"className":117,"code":2015,"language":119,"meta":120,"style":120},"void main(List\u003CString> args) \n{\n  Map transMap = {\"lunch\": '午饭', \"morning\": \"早上\", \"hello\": '你好'};\n  print(transMap);\n  // 通过英文找到对应中文的描述\n  print(transMap[\"morning\"]);\n  transMap[\"hello\"] = \"你非常好\";\n  print(transMap[\"hello\"]);\n  // 字典里面有很多对应关系\n  transMap.forEach((key, value) {\n    print(\"$key,$value\");\n  });\n  // addAll 给当前字典添加一个字典\n  transMap.addAll({\"fine\": \"非常好\"});\n  print(transMap);\n  // containesKey判断字典中是否包含某个key\n  print(transMap.containsKey(\"fine\"));\n\n  transMap.remove(\"fine\");\n  print(transMap);\n\n  // 清空字典\n  transMap.clear();\n  print(transMap);\n}\n\n",[19,2017,2018,2034,2038,2083,2090,2095,2107,2124,2134,2139,2149,2175,2179,2184,2204,2210,2215,2231,2235,2247,2253,2257,2262,2270,2276],{"__ignoreMap":120},[124,2019,2020,2022,2024,2026,2028,2030,2032],{"class":126,"line":127},[124,2021,131],{"class":130},[124,2023,135],{"class":134},[124,2025,304],{"class":138},[124,2027,1048],{"class":151},[124,2029,1237],{"class":138},[124,2031,1240],{"class":151},[124,2033,1243],{"class":138},[124,2035,2036],{"class":126,"line":142},[124,2037,145],{"class":138},[124,2039,2040,2043,2046,2048,2051,2054,2057,2060,2062,2065,2067,2070,2072,2075,2077,2080],{"class":126,"line":148},[124,2041,2042],{"class":151},"  Map",[124,2044,2045],{"class":138}," transMap ",[124,2047,158],{"class":130},[124,2049,2050],{"class":138}," {",[124,2052,2053],{"class":161},"\"lunch\"",[124,2055,2056],{"class":130},":",[124,2058,2059],{"class":161}," '午饭'",[124,2061,329],{"class":138},[124,2063,2064],{"class":161},"\"morning\"",[124,2066,2056],{"class":130},[124,2068,2069],{"class":161}," \"早上\"",[124,2071,329],{"class":138},[124,2073,2074],{"class":161},"\"hello\"",[124,2076,2056],{"class":130},[124,2078,2079],{"class":161}," '你好'",[124,2081,2082],{"class":138},"};\n",[124,2084,2085,2087],{"class":126,"line":168},[124,2086,171],{"class":134},[124,2088,2089],{"class":138},"(transMap);\n",[124,2091,2092],{"class":126,"line":181},[124,2093,2094],{"class":177},"  // 通过英文找到对应中文的描述\n",[124,2096,2097,2099,2102,2104],{"class":126,"line":188},[124,2098,171],{"class":134},[124,2100,2101],{"class":138},"(transMap[",[124,2103,2064],{"class":161},[124,2105,2106],{"class":138},"]);\n",[124,2108,2109,2112,2114,2117,2119,2122],{"class":126,"line":201},[124,2110,2111],{"class":138},"  transMap[",[124,2113,2074],{"class":161},[124,2115,2116],{"class":138},"] ",[124,2118,158],{"class":130},[124,2120,2121],{"class":161}," \"你非常好\"",[124,2123,165],{"class":138},[124,2125,2126,2128,2130,2132],{"class":126,"line":211},[124,2127,171],{"class":134},[124,2129,2101],{"class":138},[124,2131,2074],{"class":161},[124,2133,2106],{"class":138},[124,2135,2136],{"class":126,"line":216},[124,2137,2138],{"class":177},"  // 字典里面有很多对应关系\n",[124,2140,2141,2144,2146],{"class":126,"line":251},[124,2142,2143],{"class":138},"  transMap.",[124,2145,1504],{"class":134},[124,2147,2148],{"class":138},"((key, value) {\n",[124,2150,2151,2153,2155,2158,2160,2163,2166,2168,2171,2173],{"class":126,"line":262},[124,2152,1525],{"class":134},[124,2154,304],{"class":138},[124,2156,2157],{"class":161},"\"",[124,2159,241],{"class":161},[124,2161,2162],{"class":151},"key",[124,2164,2165],{"class":161},",",[124,2167,241],{"class":161},[124,2169,2170],{"class":151},"value",[124,2172,2157],{"class":161},[124,2174,1475],{"class":138},[124,2176,2177],{"class":126,"line":267},[124,2178,1549],{"class":138},[124,2180,2181],{"class":126,"line":299},[124,2182,2183],{"class":177},"  // addAll 给当前字典添加一个字典\n",[124,2185,2186,2188,2190,2193,2196,2198,2201],{"class":126,"line":316},[124,2187,2143],{"class":138},[124,2189,1328],{"class":134},[124,2191,2192],{"class":138},"({",[124,2194,2195],{"class":161},"\"fine\"",[124,2197,2056],{"class":130},[124,2199,2200],{"class":161}," \"非常好\"",[124,2202,2203],{"class":138},"});\n",[124,2205,2206,2208],{"class":126,"line":480},[124,2207,171],{"class":134},[124,2209,2089],{"class":138},[124,2211,2212],{"class":126,"line":496},[124,2213,2214],{"class":177},"  // containesKey判断字典中是否包含某个key\n",[124,2216,2217,2219,2222,2224,2226,2228],{"class":126,"line":507},[124,2218,171],{"class":134},[124,2220,2221],{"class":138},"(transMap.",[124,2223,2001],{"class":134},[124,2225,304],{"class":138},[124,2227,2195],{"class":161},[124,2229,2230],{"class":138},"));\n",[124,2232,2233],{"class":126,"line":512},[124,2234,185],{"emptyLinePlaceholder":184},[124,2236,2237,2239,2241,2243,2245],{"class":126,"line":525},[124,2238,2143],{"class":138},[124,2240,1392],{"class":134},[124,2242,304],{"class":138},[124,2244,2195],{"class":161},[124,2246,1475],{"class":138},[124,2248,2249,2251],{"class":126,"line":535},[124,2250,171],{"class":134},[124,2252,2089],{"class":138},[124,2254,2255],{"class":126,"line":886},[124,2256,185],{"emptyLinePlaceholder":184},[124,2258,2259],{"class":126,"line":902},[124,2260,2261],{"class":177},"  // 清空字典\n",[124,2263,2264,2266,2268],{"class":126,"line":912},[124,2265,2143],{"class":138},[124,2267,2012],{"class":134},[124,2269,837],{"class":138},[124,2271,2272,2274],{"class":126,"line":917},[124,2273,171],{"class":134},[124,2275,2089],{"class":138},[124,2277,2278],{"class":126,"line":1478},[124,2279,319],{"class":138},[56,2281,2283],{"id":2282},"dynamic-type","dynamic type",[15,2285,1961,2286],{},[19,2287,2288],{},"std::any",[24,2290,2291,2298,2301],{},[27,2292,2293,2294,2297],{},"Definition: In the Dart language, ",[19,2295,2296],{},"dynamic"," is used to declare a dynamic type.",[27,2299,2300],{},"Feature: Allows variables to freely change type at runtime, while bypassing compile-time static checks.",[27,2302,2303,2304],{},"Syntax 1: ",[19,2305,2306],{},"dynamic 属性名 = 值;",[115,2308,2310],{"className":117,"code":2309,"language":119,"meta":120,"style":120},"void main(List\u003CString> args) \n{\n  // dynamic 可以动态的改变类型\n  dynamic name = \"张三\";\n  print(name);\n  name = 123;\n  print(name);\n}\n",[19,2311,2312,2328,2332,2337,2351,2358,2369,2375],{"__ignoreMap":120},[124,2313,2314,2316,2318,2320,2322,2324,2326],{"class":126,"line":127},[124,2315,131],{"class":130},[124,2317,135],{"class":134},[124,2319,304],{"class":138},[124,2321,1048],{"class":151},[124,2323,1237],{"class":138},[124,2325,1240],{"class":151},[124,2327,1243],{"class":138},[124,2329,2330],{"class":126,"line":142},[124,2331,145],{"class":138},[124,2333,2334],{"class":126,"line":148},[124,2335,2336],{"class":177},"  // dynamic 可以动态的改变类型\n",[124,2338,2339,2342,2344,2346,2349],{"class":126,"line":168},[124,2340,2341],{"class":151},"  dynamic",[124,2343,155],{"class":138},[124,2345,158],{"class":130},[124,2347,2348],{"class":161}," \"张三\"",[124,2350,165],{"class":138},[124,2352,2353,2355],{"class":126,"line":181},[124,2354,171],{"class":134},[124,2356,2357],{"class":138},"(name);\n",[124,2359,2360,2362,2364,2367],{"class":126,"line":188},[124,2361,191],{"class":138},[124,2363,158],{"class":130},[124,2365,2366],{"class":151}," 123",[124,2368,165],{"class":138},[124,2370,2371,2373],{"class":126,"line":201},[124,2372,171],{"class":134},[124,2374,2357],{"class":138},[124,2376,2377],{"class":126,"line":211},[124,2378,319],{"class":138},[15,2380,2381,2382,2384],{},"Only use ",[19,2383,2296],{}," if you are 100% certain that what you are writing is correct; otherwise, avoid it, as it may introduce many errors.",[56,2386,2388],{"id":2387},"auto-deduced-type-var","Auto-deduced type - var",[15,2390,2391,2392,22],{},"Similar to C/C++'s ",[19,2393,2394],{},"auto",[15,2396,2397],{},"This keyword can automatically deduce the type of a variable.",[24,2399,2400,2403,2408],{},[27,2401,2402],{},"Keywords: var",[27,2404,79,2405],{},[19,2406,2407],{},"var 变量名 = 值/表达式;",[27,2409,2410,2411,2414],{},"Note: The type of a variable declared with ",[19,2412,2413],{},"var"," is determined after its first assignment and cannot be reassigned to a different type.",[115,2416,2418],{"className":117,"code":2417,"language":119,"meta":120,"style":120},"void main(List\u003CString> args) \n{\n  var name = '张三';\n  print(name); // Output: 张三\n\n  name = '李四';\n  print(name); // Output: 李四\n\n  var age = 30;\n  print(age); // Output: 30\n\n  var isStudent = true;\n  print(isStudent); // Output: true\n\n  var height = 1.75;\n  print(height); // Output: 1.75\n}\n",[19,2419,2420,2436,2440,2454,2463,2467,2478,2487,2491,2504,2513,2517,2530,2540,2544,2557,2566],{"__ignoreMap":120},[124,2421,2422,2424,2426,2428,2430,2432,2434],{"class":126,"line":127},[124,2423,131],{"class":130},[124,2425,135],{"class":134},[124,2427,304],{"class":138},[124,2429,1048],{"class":151},[124,2431,1237],{"class":138},[124,2433,1240],{"class":151},[124,2435,1243],{"class":138},[124,2437,2438],{"class":126,"line":142},[124,2439,145],{"class":138},[124,2441,2442,2445,2447,2449,2452],{"class":126,"line":148},[124,2443,2444],{"class":130},"  var",[124,2446,155],{"class":138},[124,2448,158],{"class":130},[124,2450,2451],{"class":161}," '张三'",[124,2453,165],{"class":138},[124,2455,2456,2458,2460],{"class":126,"line":168},[124,2457,171],{"class":134},[124,2459,174],{"class":138},[124,2461,2462],{"class":177},"// Output: 张三\n",[124,2464,2465],{"class":126,"line":181},[124,2466,185],{"emptyLinePlaceholder":184},[124,2468,2469,2471,2473,2476],{"class":126,"line":188},[124,2470,191],{"class":138},[124,2472,158],{"class":130},[124,2474,2475],{"class":161}," '李四'",[124,2477,165],{"class":138},[124,2479,2480,2482,2484],{"class":126,"line":201},[124,2481,171],{"class":134},[124,2483,174],{"class":138},[124,2485,2486],{"class":177},"// Output: 李四\n",[124,2488,2489],{"class":126,"line":211},[124,2490,185],{"emptyLinePlaceholder":184},[124,2492,2493,2495,2497,2499,2502],{"class":126,"line":216},[124,2494,2444],{"class":130},[124,2496,377],{"class":138},[124,2498,158],{"class":130},[124,2500,2501],{"class":151}," 30",[124,2503,165],{"class":138},[124,2505,2506,2508,2510],{"class":126,"line":251},[124,2507,171],{"class":134},[124,2509,391],{"class":138},[124,2511,2512],{"class":177},"// Output: 30\n",[124,2514,2515],{"class":126,"line":262},[124,2516,185],{"emptyLinePlaceholder":184},[124,2518,2519,2521,2524,2526,2528],{"class":126,"line":267},[124,2520,2444],{"class":130},[124,2522,2523],{"class":138}," isStudent ",[124,2525,158],{"class":130},[124,2527,1014],{"class":151},[124,2529,165],{"class":138},[124,2531,2532,2534,2537],{"class":126,"line":299},[124,2533,171],{"class":134},[124,2535,2536],{"class":138},"(isStudent); ",[124,2538,2539],{"class":177},"// Output: true\n",[124,2541,2542],{"class":126,"line":316},[124,2543,185],{"emptyLinePlaceholder":184},[124,2545,2546,2548,2550,2552,2555],{"class":126,"line":480},[124,2547,2444],{"class":130},[124,2549,431],{"class":138},[124,2551,158],{"class":130},[124,2553,2554],{"class":151}," 1.75",[124,2556,165],{"class":138},[124,2558,2559,2561,2563],{"class":126,"line":496},[124,2560,171],{"class":134},[124,2562,445],{"class":138},[124,2564,2565],{"class":177},"// Output: 1.75\n",[124,2567,2568],{"class":126,"line":507},[124,2569,319],{"class":138},[15,2571,2572],{},[541,2573,2574,2575,2577],{},"Dynamic types in Dart: The difference between ",[19,2576,2296],{}," and `var:",[24,2579,2580,2583],{},[27,2581,2582],{},"dynamic: Types can be freely changed at runtime with no compile-time checks; methods and properties are called directly.",[27,2584,2585],{},"var: Infers the type based on the initial value. Once the type is determined, it is fixed and subject to compile-time checks. Only the inferred properties and methods are available.",[56,2587,2589],{"id":2588},"constant-declaration-constfinal","Constant Declaration - const/final",[1045,2591,2592],{"id":2592},"const",[15,2594,1961,2595,22],{},[19,2596,2597],{},"constexpr",[24,2599,2600,2603,2609],{},[27,2601,2602],{},"Keyword: const",[27,2604,2605,2606],{},"Syntax: ",[19,2607,2608],{},"const propertyName = value/expression;",[27,2610,2611,2612,2614],{},"Feature: ",[19,2613,2592],{}," is determined before code compilation and does not allow variables in expressions; it must be a constant or a fixed value.",[115,2616,2618],{"className":117,"code":2617,"language":119,"meta":120,"style":120},"void main(List\u003CString> args) \n{\n  const int a = 10;\n  const double b = 3.14;\n  const String c = \"Hello, Dart!\";\n\n  print(\"Value of a: ${a}\"); // Output: Value of a: 10\n  print(\"Value of b: ${b}\"); // Output: Value of b: 3.14\n  print(\"Value of c: ${c}\"); // Output: Value of c: Hello, Dart!\n}\n",[19,2619,2620,2636,2640,2656,2671,2687,2691,2714,2737,2760],{"__ignoreMap":120},[124,2621,2622,2624,2626,2628,2630,2632,2634],{"class":126,"line":127},[124,2623,131],{"class":130},[124,2625,135],{"class":134},[124,2627,304],{"class":138},[124,2629,1048],{"class":151},[124,2631,1237],{"class":138},[124,2633,1240],{"class":151},[124,2635,1243],{"class":138},[124,2637,2638],{"class":126,"line":142},[124,2639,145],{"class":138},[124,2641,2642,2645,2648,2650,2652,2654],{"class":126,"line":148},[124,2643,2644],{"class":130},"  const",[124,2646,2647],{"class":151}," int",[124,2649,736],{"class":138},[124,2651,158],{"class":130},[124,2653,741],{"class":151},[124,2655,165],{"class":138},[124,2657,2658,2660,2663,2665,2667,2669],{"class":126,"line":168},[124,2659,2644],{"class":130},[124,2661,2662],{"class":151}," double",[124,2664,764],{"class":138},[124,2666,158],{"class":130},[124,2668,769],{"class":151},[124,2670,165],{"class":138},[124,2672,2673,2675,2678,2680,2682,2685],{"class":126,"line":181},[124,2674,2644],{"class":130},[124,2676,2677],{"class":151}," String",[124,2679,798],{"class":138},[124,2681,158],{"class":130},[124,2683,2684],{"class":161}," \"Hello, Dart!\"",[124,2686,165],{"class":138},[124,2688,2689],{"class":126,"line":188},[124,2690,185],{"emptyLinePlaceholder":184},[124,2692,2693,2695,2697,2700,2702,2705,2707,2709,2711],{"class":126,"line":201},[124,2694,171],{"class":134},[124,2696,304],{"class":138},[124,2698,2699],{"class":161},"\"Value of a: ",[124,2701,229],{"class":161},[124,2703,2704],{"class":151},"a",[124,2706,235],{"class":161},[124,2708,2157],{"class":161},[124,2710,310],{"class":138},[124,2712,2713],{"class":177},"// Output: Value of a: 10\n",[124,2715,2716,2718,2720,2723,2725,2728,2730,2732,2734],{"class":126,"line":211},[124,2717,171],{"class":134},[124,2719,304],{"class":138},[124,2721,2722],{"class":161},"\"Value of b: ",[124,2724,229],{"class":161},[124,2726,2727],{"class":151},"b",[124,2729,235],{"class":161},[124,2731,2157],{"class":161},[124,2733,310],{"class":138},[124,2735,2736],{"class":177},"// Output: Value of b: 3.14\n",[124,2738,2739,2741,2743,2746,2748,2751,2753,2755,2757],{"class":126,"line":216},[124,2740,171],{"class":134},[124,2742,304],{"class":138},[124,2744,2745],{"class":161},"\"Value of c: ",[124,2747,229],{"class":161},[124,2749,2750],{"class":151},"c",[124,2752,235],{"class":161},[124,2754,2157],{"class":161},[124,2756,310],{"class":138},[124,2758,2759],{"class":177},"// Output: Value of c: Hello, Dart!\n",[124,2761,2762],{"class":126,"line":251},[124,2763,319],{"class":138},[1045,2765,2766],{"id":2766},"final",[15,2768,1961,2769,22],{},[19,2770,2592],{},[24,2772,2773,2776,2781],{},[27,2774,2775],{},"Keyword: final",[27,2777,2605,2778],{},[19,2779,2780],{},"final propertyName = value/expression;",[27,2782,2783],{},"Feature: A final variable is initialized at runtime, and its value cannot be changed once set.",[115,2785,2787],{"className":117,"code":2786,"language":119,"meta":120,"style":120},"void main(List\u003CString> args) \n{\n  final time = DateTime.now();\n  print('Current time: $time'); // Current time: 2026-02-16 20:53:53.045010\n}\n",[19,2788,2789,2805,2809,2828,2849],{"__ignoreMap":120},[124,2790,2791,2793,2795,2797,2799,2801,2803],{"class":126,"line":127},[124,2792,131],{"class":130},[124,2794,135],{"class":134},[124,2796,304],{"class":138},[124,2798,1048],{"class":151},[124,2800,1237],{"class":138},[124,2802,1240],{"class":151},[124,2804,1243],{"class":138},[124,2806,2807],{"class":126,"line":142},[124,2808,145],{"class":138},[124,2810,2811,2814,2817,2819,2822,2824,2826],{"class":126,"line":148},[124,2812,2813],{"class":130},"  final",[124,2815,2816],{"class":138}," time ",[124,2818,158],{"class":130},[124,2820,2821],{"class":151}," DateTime",[124,2823,22],{"class":138},[124,2825,288],{"class":134},[124,2827,837],{"class":138},[124,2829,2830,2832,2834,2837,2839,2842,2844,2846],{"class":126,"line":168},[124,2831,171],{"class":134},[124,2833,304],{"class":138},[124,2835,2836],{"class":161},"'Current time: ",[124,2838,241],{"class":161},[124,2840,2841],{"class":151},"time",[124,2843,995],{"class":161},[124,2845,310],{"class":138},[124,2847,2848],{"class":177},"// Current time: 2026-02-16 20:53:53.045010\n",[124,2850,2851],{"class":126,"line":181},[124,2852,319],{"class":138},[24,2854,2855,2861,2866],{},[27,2856,2857,2858,2860],{},"Variable: When you need to store a changing piece of data, you must use ",[19,2859,2413],{}," to declare the variable.",[27,2862,2863,2864,22],{},"Compile-time constant: When you need to store an unchanging piece of data that is determined at compile time, you must declare the constant using ",[19,2865,2592],{},[27,2867,2868,2869,22],{},"Runtime constant: When you need to store an unchanging piece of data that is only determined at runtime, you must declare the constant using ",[19,2870,2766],{},[592,2872,2873,2894],{},[595,2874,2875],{},[598,2876,2877,2880,2882,2885,2888,2891],{},[601,2878,2879],{},"concept",[601,2881,1834],{},[601,2883,2884],{},"C++",[601,2886,2887],{},"Is it a compile-time constant",[601,2889,2890],{},"Can it be determined at runtime?",[601,2892,2893],{},"Is the object immutable?",[611,2895,2896,2916,2936],{},[598,2897,2898,2901,2905,2909,2912,2914],{},[616,2899,2900],{},"Assigned only once",[616,2902,2903],{},[19,2904,2766],{},[616,2906,2907],{},[19,2908,2592],{},[616,2910,2911],{},"❌",[616,2913,682],{},[616,2915,2911],{},[598,2917,2918,2921,2925,2929,2931,2933],{},[616,2919,2920],{},"Compile-time constant",[616,2922,2923],{},[19,2924,2592],{},[616,2926,2927],{},[19,2928,2597],{},[616,2930,682],{},[616,2932,2911],{},[616,2934,2935],{},"✅ (Dart is stronger)",[598,2937,2938,2941,2944,2948,2950,2952],{},[616,2939,2940],{},"Read-only variable",[616,2942,2943],{},"not completely equivalent",[616,2945,2946],{},[19,2947,2592],{},[616,2949,2911],{},[616,2951,682],{},[616,2953,2911],{},[10,2955,2957],{"id":2956},"null-safety-mechanism","Null safety mechanism",[24,2959,2960,2963],{},[27,2961,2962],{},"Definition: In the Dart language, runtime null pointer errors are exposed early through compile-time static checks.",[27,2964,2965],{},"Feature: Moves null pointer exceptions from runtime to compile time, reducing production crashes.",[15,2967,2968],{},[541,2969,2970],{},"Common Null Safety Operators",[15,2972,2973],{},"|operator|symbol|effect|Here is the translation of the provided Simplified Chinese Markdown fragment into natural American English, following all specified rules.",[2975,2976],"hr",{},[15,2978,2979,2982,2983,2985,2986,2989,2990,2993,2994,2997,2998,3001,3002,3005,3006,3009,3010,3013,3014,3017,3018,3021],{},[541,2980,2981],{},"Example","|\n| :--- | :--- | :--------------------- | :------------------------------------------ |\n|Nullable types|",[19,2984,238],{},"|Declare a nullable variable|",[19,2987,2988],{},"String?"," → Allows String or null|\n|Secure Access|",[19,2991,2992],{},"?.","|Skip the operation when the object is null and return null.|",[19,2995,2996],{},"user?.name"," → returns null if user is null|\n|Non-null assertion|",[19,2999,3000],{},"!.","|The developer guarantees that the variable is not null (otherwise it will crash at runtime).|",[19,3003,3004],{},"name!.length"," → assert name is not empty|\n|null coalescing|",[19,3007,3008],{},"??","|Returns the default value on the right when the left side is null.|",[19,3011,3012],{},"name ?? \"Guest\""," → returns \"Guest\" when name is null|\n|Nullish coalescing assignment|",[19,3015,3016],{},"??=","|Assign a value only when the variable is null.|",[19,3019,3020],{},"name ??= \"Guest\"","|",[3023,3024,3025],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":120,"searchDepth":142,"depth":142,"links":3027},[3028,3029,3030],{"id":12,"depth":148,"text":13},{"id":48,"depth":148,"text":49},{"id":2956,"depth":148,"text":2957},"/en-us/wiki/2026-02-16-flutter-jiao-cheng/ch4-dart-yu-yan-jiao-cheng","4",4000000,"2026-02-16","wiki/2026-02-16-flutter-jiao-cheng","en-us:2026-02-16-flutter-jiao-cheng","/en-us/wiki/2026-02-16-flutter-jiao-cheng","Flutter教程","md","wiki/2026-02-16-Flutter教程/ch4-Dart语言教程",false,null,"en-US","en-us",{},{"title":5,"description":120},"/wiki/2026-02-16-flutter-jiao-cheng/ch4-dart-yu-yan-jiao-cheng","_i18n/en-us/wiki/2026-02-16-Flutter教程/ch4-Dart语言教程","tqKD2c20ixNx9kV8nwn2bjtzDRgiKG4_D3DeSG0OCqU",[3051,3057,3062,3068,3069],{"path":3052,"stem":3053,"title":3054,"date":3034,"chapter":3055,"chapterSort":3056,"docKey":3036,"docRoot":3037,"docTitle":3038,"isWikiDoc":184,"isWikiIndex":3041},"/en-us/wiki/2026-02-16-flutter-jiao-cheng/ch1-jian-jie","_i18n/en-us/wiki/2026-02-16-Flutter教程/ch1-简介","Introduction","1",1000000,{"path":3058,"stem":3059,"title":3060,"date":3034,"chapter":1472,"chapterSort":3061,"docKey":3036,"docRoot":3037,"docTitle":3038,"isWikiDoc":184,"isWikiIndex":3041},"/en-us/wiki/2026-02-16-flutter-jiao-cheng/ch2-can-kao-zi-liao","_i18n/en-us/wiki/2026-02-16-Flutter教程/ch2-参考资料","references",2000000,{"path":3063,"stem":3064,"title":3065,"date":3034,"chapter":3066,"chapterSort":3067,"docKey":3036,"docRoot":3037,"docTitle":3038,"isWikiDoc":184,"isWikiIndex":3041},"/en-us/wiki/2026-02-16-flutter-jiao-cheng/ch3-huan-jing-pei-zhi","_i18n/en-us/wiki/2026-02-16-Flutter教程/ch3-环境配置","Environment Setup","3",3000000,{"path":3031,"stem":3048,"title":5,"date":3034,"chapter":3032,"chapterSort":3033,"docKey":3036,"docRoot":3037,"docTitle":3038,"isWikiDoc":184,"isWikiIndex":3041},{"path":3037,"stem":3070,"title":3071,"date":3034,"chapter":3042,"chapterSort":3072,"docKey":3036,"docRoot":3037,"docTitle":3038,"isWikiDoc":184,"isWikiIndex":184},"_i18n/en-us/wiki/2026-02-16-Flutter教程/index","Flutter tutorial",0,{"variants":3074},[3075,3076,3079,3082,3085],{"path":3031,"localeSlug":3044,"i18nKey":3040},{"path":3077,"localeSlug":3078,"i18nKey":3040},"/zh-hant/wiki/2026-02-16-flutter-jiao-cheng/ch4-dart-yu-yan-jiao-cheng","zh-hant",{"path":3080,"localeSlug":3081,"i18nKey":3040},"/zh-hk/wiki/2026-02-16-flutter-jiao-cheng/ch4-dart-yu-yan-jiao-cheng","zh-hk",{"path":3083,"localeSlug":3084,"i18nKey":3040},"/zh-tw/wiki/2026-02-16-flutter-jiao-cheng/ch4-dart-yu-yan-jiao-cheng","zh-tw",{"path":3086,"localeSlug":3087,"i18nKey":3040},"/zh-cn/wiki/2026-02-16-flutter-jiao-cheng/ch4-dart-yu-yan-jiao-cheng","zh-cn",[3031,3047,3077,3047,3080,3047,3083,3047,3086,3047],1780663020787]