[{"data":1,"prerenderedAt":1075},["ShallowReactive",2],{"navigation_docs":3,"-interview-flutter-interview1":173,"-interview-flutter-interview1-surround":1070},[4,22,29,36,107,138,145,161],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"博客","i-lucide-pen-line","\u002Fblog","0.blog",[10,12,17],{"title":5,"path":7,"stem":11,"icon":6},"0.blog\u002Findex",{"title":13,"path":14,"stem":15,"icon":16},"创建基于 UIKit 的原生 iOS 项目","\u002Fblog\u002Fcreate-uikit-ios-project","0.blog\u002F01.create-uikit-ios-project","i-lucide-app-window",{"title":18,"path":19,"stem":20,"icon":21},"Lockify：把账号和密码留在自己的手机里","\u002Fblog\u002Flockify","0.blog\u002F02.lockify","i-lucide-lock",{"title":23,"path":24,"stem":25,"children":26,"icon":28},"年度总结","\u002Fannual-review","1.annual-review\u002Findex",[27],{"title":23,"path":24,"stem":25,"icon":28},"i-lucide-git-commit",{"title":30,"path":31,"stem":32,"children":33,"icon":35},"故事","\u002Fstories","2.stories\u002Findex",[34],{"title":30,"path":31,"stem":32,"icon":35},"i-lucide-feather",{"title":37,"icon":38,"path":39,"stem":40,"children":41},"Android","i-simple-icons-android","\u002Fandroid","3.android",[42,44,49],{"title":37,"path":39,"stem":43,"icon":38},"3.android\u002Findex",{"title":45,"path":46,"stem":47,"icon":48},"初探Navigation","\u002Fandroid\u002Fcompose-navigation","3.android\u002F01.compose-navigation","i-lucide-route",{"title":50,"icon":51,"path":52,"stem":53,"children":54},"安卓代码加固","i-lucide-shield","\u002Fandroid\u002Fhidden-hardening","3.android\u002F02.hidden-hardening\u002Findex",[55,58,62,67,72,77,82,87,92,97,102],{"title":56,"path":52,"stem":53,"icon":57},"安卓代码加固：总览","i-lucide-map",{"title":59,"path":60,"stem":61,"icon":21},"安卓代码加固（1）：加密DEX","\u002Fandroid\u002Fhidden-hardening\u002Fencrypt-dex","3.android\u002F02.hidden-hardening\u002F01.encrypt-dex",{"title":63,"path":64,"stem":65,"icon":66},"安卓代码加固（2）：Native解密","\u002Fandroid\u002Fhidden-hardening\u002Fnative-decrypt","3.android\u002F02.hidden-hardening\u002F02.native-decrypt","i-lucide-cpu",{"title":68,"path":69,"stem":70,"icon":71},"安卓代码加固（3）：内存加载","\u002Fandroid\u002Fhidden-hardening\u002Fmemory-load","3.android\u002F02.hidden-hardening\u002F03.memory-load","i-lucide-memory-stick",{"title":73,"path":74,"stem":75,"icon":76},"安卓代码加固（4）：指令分发","\u002Fandroid\u002Fhidden-hardening\u002Fopcode-dispatch","3.android\u002F02.hidden-hardening\u002F04.opcode-dispatch","i-lucide-hash",{"title":78,"path":79,"stem":80,"icon":81},"安卓代码加固（5）：XOR混淆","\u002Fandroid\u002Fhidden-hardening\u002Fxor-obfuscate","3.android\u002F02.hidden-hardening\u002F05.xor-obfuscate","i-lucide-shuffle",{"title":83,"path":84,"stem":85,"icon":86},"安卓代码加固（6）：密钥外置","\u002Fandroid\u002Fhidden-hardening\u002Fkey-external","3.android\u002F02.hidden-hardening\u002F06.key-external","i-lucide-key",{"title":88,"path":89,"stem":90,"icon":91},"安卓代码加固（7）：依赖隔离","\u002Fandroid\u002Fhidden-hardening\u002Fdep-isolate","3.android\u002F02.hidden-hardening\u002F07.dep-isolate","i-lucide-layers",{"title":93,"path":94,"stem":95,"icon":96},"安卓代码加固（8）：构建校验","\u002Fandroid\u002Fhidden-hardening\u002Fbuild-verify","3.android\u002F02.hidden-hardening\u002F08.build-verify","i-lucide-shield-check",{"title":98,"path":99,"stem":100,"icon":101},"安卓代码加固（9）：防录屏","\u002Fandroid\u002Fhidden-hardening\u002Fflag-secure","3.android\u002F02.hidden-hardening\u002F09.flag-secure","i-lucide-eye-off",{"title":103,"path":104,"stem":105,"icon":106},"安卓代码加固（10）：ABI门禁","\u002Fandroid\u002Fhidden-hardening\u002Fabi-gate","3.android\u002F02.hidden-hardening\u002F10.abi-gate","i-lucide-git-compare",{"title":108,"icon":109,"path":110,"stem":111,"children":112},"iOS","i-simple-icons-apple","\u002Fios","4.ios",[113,115,120,125,129,133],{"title":108,"path":110,"stem":114,"icon":109},"4.ios\u002Findex",{"title":116,"path":117,"stem":118,"icon":119},"iOS面试题1","\u002Fios\u002Fios-interview1","4.ios\u002F01.ios-interview1","i-lucide-sparkles",{"title":121,"path":122,"stem":123,"icon":124},"设置启动图","\u002Fios\u002Fset-launch-screen","4.ios\u002F02.set-launch-screen","i-lucide-image",{"title":126,"path":127,"stem":128,"icon":48},"路由管理","\u002Fios\u002Frouting","4.ios\u002F03.routing",{"title":130,"path":131,"stem":132,"icon":91},"状态管理","\u002Fios\u002Fstate-management","4.ios\u002F04.state-management",{"title":134,"path":135,"stem":136,"icon":137},"事件传递","\u002Fios\u002Fevent-delivery","4.ios\u002F05.event-delivery","i-lucide-pointer",{"title":139,"path":140,"stem":141,"children":142,"icon":144},"Flutter","\u002Fflutter","5.flutter\u002Findex",[143],{"title":139,"path":140,"stem":141,"icon":144},"i-simple-icons-flutter",{"title":146,"icon":147,"path":148,"stem":149,"children":150,"page":160},"面试","i-lucide-graduation-cap","\u002Finterview","6.interview",[151,156],{"title":152,"path":153,"stem":154,"icon":155},"Flutter面试题1","\u002Finterview\u002Fflutter-interview1","6.interview\u002F01.flutter-interview1","i-lucide-boxes",{"title":157,"path":158,"stem":159,"icon":66},"Flutter面试题2","\u002Finterview\u002Fflutter-interview2","6.interview\u002F02.flutter-interview2",false,{"title":162,"icon":163,"path":164,"stem":165,"children":166},"算法学习","i-lucide-binary","\u002Falgorithm","7.algorithm",[167,169],{"title":162,"path":164,"stem":168,"icon":163},"7.algorithm\u002Findex",{"title":170,"path":171,"stem":172},"算法基础1：复杂度分析","\u002Falgorithm\u002Ftime-space-complexity","7.algorithm\u002F01.time-space-complexity",{"id":174,"title":152,"body":175,"description":1054,"extension":1055,"links":1056,"meta":1058,"navigation":1065,"path":153,"seo":1066,"stem":154,"__hash__":1069},"docs\u002F6.interview\u002F01.flutter-interview1.md",{"type":176,"value":177,"toc":1044},"minimark",[178,187,191,199,278,365,424,428,432,538,594,642,648,652,684,726,778,784,788,822,829,834,864,867,884,887,890,922,970,973,977,1026,1037,1040],[179,180,181,182,186],"p",{},"和 ",[183,184,185],"a",{"href":158},"高频面试题 2"," 重叠的概念，这里写 Dart \u002F 发布视角。",[188,189,190],"h2",{"id":190},"事件循环怎么跑",[179,192,193,194,198],{},"考察",[195,196,197],"code",{},"事件循环与执行模型","。",[200,201,202,217,237,252],"ul",{},[203,204,205,209,212,213,216],"li",{},[206,207,208],"strong",{},"用什么驱动应用？",[210,211],"br",{},"\n事件循环，调度输入、动画和 UI 更新。由 ",[206,214,215],{},"Engine + Dart VM"," 组成。",[203,218,219,222],{},[206,220,221],{},"大致流程：",[223,224,225,228,231,234],"ol",{},[203,226,227],{},"引擎处理输入、动画",[203,229,230],{},"Dart VM 跑业务",[203,232,233],{},"引擎更新界面并上屏",[203,235,236],{},"进入下一轮",[203,238,239,242,244,247,248,251],{},[206,240,241],{},"Dart 单线程还是多线程？",[210,243],{},[206,245,246],{},"单线程","。一条事件循环 + 两个队列。",[195,249,250],{},"async"," 不会开线程。",[203,253,254,257],{},[206,255,256],{},"微任务队列和事件任务队列，微任务队列优先：",[223,258,259,262,268,275],{},[203,260,261],{},"同步代码跑完",[203,263,264,267],{},[206,265,266],{},"清空","微任务队列",[203,269,270,271,274],{},"从事件队列",[206,272,273],{},"取一个","任务",[203,276,277],{},"再回到微任务",[279,280,285],"pre",{"className":281,"code":282,"language":283,"meta":284,"style":284},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","print('sync');\nscheduleMicrotask(() => print('micro'));\nFuture(() => print('event'));\n\u002F\u002F sync → micro → event\n","dart","",[195,286,287,311,336,358],{"__ignoreMap":284},[288,289,292,296,300,304,307],"span",{"class":290,"line":291},"line",1,[288,293,295],{"class":294},"s2Zo4","print",[288,297,299],{"class":298},"sTEyZ","(",[288,301,303],{"class":302},"sfazB","'sync'",[288,305,306],{"class":298},")",[288,308,310],{"class":309},"sMK4o",";\n",[288,312,314,317,320,323,326,328,331,334],{"class":290,"line":313},2,[288,315,316],{"class":294},"scheduleMicrotask",[288,318,319],{"class":298},"(() ",[288,321,322],{"class":309},"=>",[288,324,325],{"class":294}," print",[288,327,299],{"class":298},[288,329,330],{"class":302},"'micro'",[288,332,333],{"class":298},"))",[288,335,310],{"class":309},[288,337,339,343,345,347,349,351,354,356],{"class":290,"line":338},3,[288,340,342],{"class":341},"sBMFI","Future",[288,344,319],{"class":298},[288,346,322],{"class":309},[288,348,325],{"class":294},[288,350,299],{"class":298},[288,352,353],{"class":302},"'event'",[288,355,333],{"class":298},[288,357,310],{"class":309},[288,359,361],{"class":290,"line":360},4,[288,362,364],{"class":363},"sHwdD","\u002F\u002F sync → micro → event\n",[366,367,368,383],"table",{},[369,370,371],"thead",{},[372,373,374,377,380],"tr",{},[375,376],"th",{},[375,378,379],{},"微任务",[375,381,382],{},"事件",[384,385,386,413],"tbody",{},[372,387,388,392,404],{},[389,390,391],"td",{},"谁在这",[389,393,394,396,397,396,400,403],{},[195,395,316],{},"、",[195,398,399],{},"then",[195,401,402],{},"await"," 续体",[389,405,406,396,409,412],{},[195,407,408],{},"Future(() {})",[195,410,411],{},"Timer","、IO、点击、帧",[372,414,415,418,421],{},[389,416,417],{},"规则",[389,419,420],{},"当前轮先清空",[389,422,423],{},"一次只取一个",[425,426,427],"note",{},"面试点：事件驱动 + 帧循环；「单线程 + 两个队列 + 微任务优先」。",[188,429,431],{"id":430},"future-和-stream","Future 和 Stream",[200,433,434,456,500,526],{},[203,435,436,439,441,442,445,446,449,450,452,453,455],{},[206,437,438],{},"差在哪？",[210,440],{},"\nFuture：",[206,443,444],{},"一次","结果。Stream：",[206,447,448],{},"一串","结果。",[195,451,250],{}," \u002F ",[195,454,402],{}," 只是 Future 的写法。",[203,457,458,461],{},[206,459,460],{},"Stream 两种形态：",[200,462,463,478],{},[203,464,465,468,470,471,474,475,477],{},[206,466,467],{},"单订阅（Single-subscription）",[210,469],{},"\n只能被订阅一次，第二次 ",[195,472,473],{},"listen"," 会报错。事件按顺序交给唯一消费者。",[210,476],{},"\n典型：HTTP 响应体、文件读、一次性请求结果流。",[203,479,480,483,485,486,488,489,492,493,496,497,198],{},[206,481,482],{},"广播（Broadcast）",[210,484],{},"\n可以多次订阅，多个订阅者同时收到同一批事件。后订阅的人通常只收到之后的事件。",[210,487],{},"\n典型：全局事件总线、通知广播。默认 ",[195,490,491],{},"StreamController"," 是单订阅，广播用 ",[195,494,495],{},"StreamController.broadcast()"," 或 ",[195,498,499],{},"asBroadcastStream()",[203,501,502,505,507,510,511,452,513,452,515,518,519,521,522,525],{},[206,503,504],{},"会阻塞吗？",[210,506],{},[206,508,509],{},"不阻塞","事件循环。",[195,512,402],{},[195,514,473],{},[195,516,517],{},"await for"," 只暂停当前函数，控制权交回循环，UI 还能跑。",[210,520],{},"\n但 Future \u002F Stream ",[206,523,524],{},"回调里的同步重活","仍在主 Isolate，会堵帧。IO 等结果不堵；解析、加密、大循环要丢 Isolate。",[203,527,528,531,533,534,537],{},[206,529,530],{},"容易漏的点：",[210,532],{},"\nFuture 忘了处理 error；Stream 忘了 ",[195,535,536],{},"cancel","。单订阅流不要当事件总线用。",[366,539,540,551],{},[369,541,542],{},[372,543,544,546,548],{},[375,545],{},[375,547,342],{},[375,549,550],{},"Stream",[384,552,553,562,576],{},[372,554,555,558,560],{},[389,556,557],{},"结果",[389,559,444],{},[389,561,448],{},[372,563,564,567,570],{},[389,565,566],{},"典型",[389,568,569],{},"请求、读文件",[389,571,572,573],{},"分页、socket、",[195,574,575],{},"EventChannel",[372,577,578,581,586],{},[389,579,580],{},"收尾",[389,582,583],{},[195,584,585],{},"try\u002Fcatch",[389,587,588,591,592],{},[195,589,590],{},"dispose"," 里 ",[195,593,536],{},[366,595,596,608],{},[369,597,598],{},[372,599,600,602,605],{},[375,601],{},[375,603,604],{},"单订阅",[375,606,607],{},"广播",[384,609,610,621,632],{},[372,611,612,615,618],{},[389,613,614],{},"订阅",[389,616,617],{},"只能一次",[389,619,620],{},"可以多次",[372,622,623,626,629],{},[389,624,625],{},"消费者",[389,627,628],{},"一个",[389,630,631],{},"多个同时收",[372,633,634,636,639],{},[389,635,566],{},[389,637,638],{},"请求结果流、读文件",[389,640,641],{},"事件总线、通知广播",[425,643,644,645,647],{},"面试点：单订阅 = 单消费者，广播 = 多消费者。一次结果不必上 Stream。",[195,646,250],{}," 不阻塞、也不开线程。",[188,649,651],{"id":650},"isolate-怎么隔离","Isolate 怎么隔离",[200,653,654,666],{},[203,655,656,659,661,662,665],{},[206,657,658],{},"是什么？",[210,660],{},"\nDart 的并发单元：独立堆、独立事件循环，",[206,663,664],{},"不共享内存","，靠 Port 传消息。",[203,667,668,671,673,674,198,677,679,452,681,683],{},[206,669,670],{},"什么时候用？",[210,672],{},"\n解析大 JSON、加密、压图这类 ",[206,675,676],{},"CPU 重活",[210,678],{},[195,680,250],{},[195,682,402],{}," 只是「先去做别的，算完再回来」，计算本身还在主 Isolate，UI 照样卡。要另开一个 Isolate 才能真并行。",[279,685,687],{"className":281,"code":686,"language":283,"meta":284,"style":284},"final data = await Isolate.run(() => parseHugeJson(raw));\n",[195,688,689],{"__ignoreMap":284},[288,690,691,695,698,701,705,708,711,714,716,718,721,724],{"class":290,"line":291},[288,692,694],{"class":693},"spNyl","final",[288,696,697],{"class":298}," data ",[288,699,700],{"class":309},"=",[288,702,704],{"class":703},"s7zQu"," await",[288,706,707],{"class":341}," Isolate",[288,709,710],{"class":309},".",[288,712,713],{"class":294},"run",[288,715,319],{"class":298},[288,717,322],{"class":309},[288,719,720],{"class":294}," parseHugeJson",[288,722,723],{"class":298},"(raw))",[288,725,310],{"class":309},[366,727,728,739],{},[369,729,730],{},[372,731,732,734,737],{},[375,733],{},[375,735,736],{},"Isolate",[375,738,250],{},[384,740,741,752,763],{},[372,742,743,746,749],{},[389,744,745],{},"解决",[389,747,748],{},"不堵 UI 的 CPU 重活",[389,750,751],{},"等 IO",[372,753,754,757,760],{},[389,755,756],{},"内存",[389,758,759],{},"不共享",[389,761,762],{},"仍在主 Isolate 同一堆",[372,764,765,768,775],{},[389,766,767],{},"限制",[389,769,770,771,774],{},"不能 ",[195,772,773],{},"setState","，结果要传回来",[389,776,777],{},"不增加核",[425,779,780,781,783],{},"面试点：主 Isolate 跑 UI，后台 Isolate 跑重任务。不是 ",[195,782,250],{}," 的升级版，也不是 Java 线程。",[188,785,787],{"id":786},"热重载热重启热更新","热重载、热重启、热更新",[200,789,790,796,806,816],{},[203,791,792,795],{},[206,793,794],{},"冷启动："," 从 0 启动，最慢。",[203,797,798,801,802,805],{},[206,799,800],{},"热重载："," 再执行 ",[195,803,804],{},"build","，尽量保状态。",[203,807,808,811,812,815],{},[206,809,810],{},"热重启："," 清 Dart 状态，重跑 ",[195,813,814],{},"main()","，不重装 App。",[203,817,818,821],{},[206,819,820],{},"热更新："," 线上发补丁。官方不直接支持，偏安全和合规。",[823,824,825,826,198],"tip",{},"口诀：热重载改 UI、保状态；热重启清状态；热更新是发版，不是 ",[195,827,828],{},"r",[830,831,833],"h3",{"id":832},"hot-reload-原理","Hot Reload 原理",[835,836,837],"accordion",{},[838,839,842,853],"accordion-item",{"icon":840,"label":841},"i-lucide-box","Kernel 是什么？",[179,843,844,845,848,849,852],{},"Dart 的",[206,846,847],{},"中间表示","（IR），产物常是 ",[195,850,851],{},".dill","。不是源码，也不是 CPU 指令。源码先编成 Kernel，VM 再执行。结构稳定、可按方法替换，所以能增量更新。",[179,854,855,856,859,860,863],{},"本质上是以二进制形式序列化后的",[206,857,858],{},"完整程序快照","—— 一份 \"已经编译完成、但还没有面向任何具体机器\" 的中间产物，类比一下就懂了：它相当于 Java 的 ",[195,861,862],{},".class","（JVM 字节码）。",[179,865,866],{},"Debug 用 JIT，走的就是这份可增量更新的 Kernel：",[223,868,869,872,875,878,881],{},[203,870,871],{},"扫描改动",[203,873,874],{},"只把改过的部分编成新 Kernel",[203,876,877],{},"推到设备上正在跑的 VM",[203,879,880],{},"和新老 Kernel 合并（换方法体，进程不重启）",[203,882,883],{},"Framework 重建 Widget，尽量保状态",[179,885,886],{},"Release 是 AOT：Kernel 已被编死成本机二进制，不能局部替换，所以没有热重载。",[830,888,889],{"id":889},"热重载经常无效",[200,891,892,901,908,916,919],{},[203,893,894,897,898],{},[195,895,896],{},"StatelessWidget"," → ",[195,899,900],{},"StatefulWidget",[203,902,903,904,907],{},"全局 \u002F ",[195,905,906],{},"static"," 初始化变了",[203,909,910,396,912,915],{},[195,911,814],{},[195,913,914],{},"initState()"," 变了",[203,917,918],{},"枚举 \u002F 泛型破坏性调整",[203,920,921],{},"改了原生或插件",[366,923,924,939],{},[369,925,926],{},[372,927,928,930,933,936],{},[375,929],{},[375,931,932],{},"热重载",[375,934,935],{},"热重启",[375,937,938],{},"热更新",[384,940,941,957],{},[372,942,943,946,949,954],{},[389,944,945],{},"做什么",[389,947,948],{},"增量换 Dart",[389,950,951,952],{},"重跑 ",[195,953,814],{},[389,955,956],{},"线上补丁",[372,958,959,962,965,967],{},[389,960,961],{},"状态",[389,963,964],{},"尽量保",[389,966,266],{},[389,968,969],{},"和开发期不是一类",[425,971,972],{},"面试点：Stateless 改 Stateful 要热重启。热更新不要讲成热重载的线上版。",[188,974,976],{"id":975},"jit-和-aot","JIT 和 AOT",[366,978,979,991],{},[369,980,981],{},[372,982,983,985,988],{},[375,984],{},[375,986,987],{},"JIT",[375,989,990],{},"AOT",[384,992,993,1004,1015],{},[372,994,995,998,1001],{},[389,996,997],{},"模式",[389,999,1000],{},"Debug",[389,1002,1003],{},"Release \u002F Profile",[372,1005,1006,1009,1012],{},[389,1007,1008],{},"产物",[389,1010,1011],{},"Kernel，可增量替换",[389,1013,1014],{},"本机二进制",[372,1016,1017,1020,1023],{},[389,1018,1019],{},"图什么",[389,1021,1022],{},"热重载、调试",[389,1024,1025],{},"启动、帧率、上架",[179,1027,1028,1029,1032,1033,1036],{},"看卡顿用 ",[206,1030,1031],{},"profile","，看包体用 ",[206,1034,1035],{},"release","，不要拿 Debug 包说事。",[425,1038,1039],{},"为什么能热重载：Debug 用 JIT → 增量 Kernel 推到 VM → 合并后重建 Widget，进程不重启。",[1041,1042,1043],"style",{},"html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}",{"title":284,"searchDepth":313,"depth":313,"links":1045},[1046,1047,1048,1049,1053],{"id":190,"depth":313,"text":190},{"id":430,"depth":313,"text":431},{"id":650,"depth":313,"text":651},{"id":786,"depth":313,"text":787,"children":1050},[1051,1052],{"id":832,"depth":338,"text":833},{"id":889,"depth":338,"text":889},{"id":975,"depth":313,"text":976},"事件循环、Future \u002F Stream、Isolate、热重载与 JIT \u002F AOT。","md",[1057],{"label":185,"icon":66,"to":158},{"date":1059,"categories":1060,"tags":1063},"2026-09-09",[1061,1062],"interview","flutter",[139,146,1064],"Dart",{"icon":155},{"title":1067,"description":1068},"高频面试题 1","Flutter \u002F Dart 高频题：事件循环、异步、Isolate、热重载与编译模式。","JuXXh96djjNZb7ODIRzuM7sPqCnY-V0KcRkscK7MldY",[1071,1073],{"title":139,"path":140,"stem":141,"description":1072,"icon":144,"children":-1},"Flutter 开发实践与笔记。",{"title":157,"path":158,"stem":159,"description":1074,"icon":66,"children":-1},"渲染管线、引擎线程、Channel、卡顿、混合栈与启动体积。",1790767048135]