CINXE.COM

<!doctype html><html lang="en"><head><title data-rh="true">Landing Flutter 3.22 and Dart 3.4 at Google I/O 2024 | by Michael Thomsen | Flutter | Medium</title><meta data-rh="true" charset="utf-8"/><meta data-rh="true" name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1,maximum-scale=1"/><meta data-rh="true" name="theme-color" content="#000000"/><meta data-rh="true" name="twitter:app:name:iphone" content="Medium"/><meta data-rh="true" name="twitter:app:id:iphone" content="828256236"/><meta data-rh="true" property="al:ios:app_name" content="Medium"/><meta data-rh="true" property="al:ios:app_store_id" content="828256236"/><meta data-rh="true" property="al:android:package" content="com.medium.reader"/><meta data-rh="true" property="fb:app_id" content="542599432471018"/><meta data-rh="true" property="og:site_name" content="Medium"/><meta data-rh="true" property="og:type" content="article"/><meta data-rh="true" property="article:published_time" content="2024-05-14T20:33:38.614Z"/><meta data-rh="true" name="title" content="Landing Flutter 3.22 and Dart 3.4 at Google I/O 2024 | by Michael Thomsen | Flutter | Medium"/><meta data-rh="true" property="og:title" content="Landing Flutter 3.22 and Dart 3.4 at Google I/O 2024"/><meta data-rh="true" property="al:android:url" content="medium://p/5e211f708a37"/><meta data-rh="true" property="al:ios:url" content="medium://p/5e211f708a37"/><meta data-rh="true" property="al:android:app_name" content="Medium"/><meta data-rh="true" name="description" content="It’s been a particularly busy last few months in Dart &amp; Flutter air traffic control, but we’re happy to announce that Flutter 3.22 and Dart 3.4 have landed and are available today, just in time for…"/><meta data-rh="true" property="og:description" content="Major milestones for Flutter web apps, graphics performance upgrades, productivity experiments, and more"/><meta data-rh="true" property="og:url" content="https://medium.com/flutter/io24-5e211f708a37"/><meta data-rh="true" property="al:web:url" content="https://medium.com/flutter/io24-5e211f708a37"/><meta data-rh="true" property="og:image" content="https://miro.medium.com/v2/da:true/resize:fit:1200/1*Mq-Uj8c8l7rrpPxYQ6Gemw.gif"/><meta data-rh="true" property="article:author" content="https://medium.com/@mit.mit"/><meta data-rh="true" name="author" content="Michael Thomsen"/><meta data-rh="true" name="robots" content="index,noarchive,follow,max-image-preview:large"/><meta data-rh="true" name="referrer" content="unsafe-url"/><meta data-rh="true" property="twitter:title" content="Landing Flutter 3.22 and Dart 3.4 at Google I/O 2024"/><meta data-rh="true" name="twitter:site" content="@flutterdev"/><meta data-rh="true" name="twitter:app:url:iphone" content="medium://p/5e211f708a37"/><meta data-rh="true" property="twitter:description" content="Major milestones for Flutter web apps, graphics performance upgrades, productivity experiments, and more"/><meta data-rh="true" name="twitter:image:src" content="https://miro.medium.com/v2/da:true/resize:fit:1200/1*Mq-Uj8c8l7rrpPxYQ6Gemw.gif"/><meta data-rh="true" name="twitter:card" content="summary_large_image"/><meta data-rh="true" name="twitter:label1" content="Reading time"/><meta data-rh="true" name="twitter:data1" content="7 min read"/><link data-rh="true" rel="icon" href="https://miro.medium.com/v2/5d8de952517e8160e40ef9841c781cdc14a5db313057fa3c3de41c6f5b494b19"/><link data-rh="true" rel="search" type="application/opensearchdescription+xml" title="Medium" href="/osd.xml"/><link data-rh="true" rel="apple-touch-icon" sizes="152x152" href="https://miro.medium.com/v2/resize:fill:304:304/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="120x120" href="https://miro.medium.com/v2/resize:fill:240:240/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="76x76" href="https://miro.medium.com/v2/resize:fill:152:152/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="60x60" href="https://miro.medium.com/v2/resize:fill:120:120/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="mask-icon" href="https://miro.medium.com/v2/resize:fill:1000:1000/7*GAOKVe--MXbEJmV9230oOQ.png" color="#171717"/><link data-rh="true" rel="preconnect" href="https://glyph.medium.com" crossOrigin=""/><link data-rh="true" id="glyph_preload_link" rel="preload" as="style" type="text/css" href="https://glyph.medium.com/css/unbound.css"/><link data-rh="true" id="glyph_link" rel="stylesheet" type="text/css" href="https://glyph.medium.com/css/unbound.css"/><link data-rh="true" rel="author" href="https://medium.com/@mit.mit"/><link data-rh="true" rel="canonical" href="https://medium.com/flutter/io24-5e211f708a37"/><link data-rh="true" rel="alternate" href="android-app://com.medium.reader/https/medium.com/p/5e211f708a37"/><script data-rh="true" type="application/ld+json">{"@context":"http:\u002F\u002Fschema.org","@type":"NewsArticle","image":["https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fda:true\u002Fresize:fit:1200\u002F1*Mq-Uj8c8l7rrpPxYQ6Gemw.gif"],"url":"https:\u002F\u002Fmedium.com\u002Fflutter\u002Fio24-5e211f708a37","dateCreated":"2024-05-14T20:33:38.614Z","datePublished":"2024-05-14T20:33:38.614Z","dateModified":"2024-11-26T12:47:24.297Z","headline":"Landing Flutter 3.22 and Dart 3.4 at Google I\u002FO 2024","name":"Landing Flutter 3.22 and Dart 3.4 at Google I\u002FO 2024","description":"It’s been a particularly busy last few months in Dart & Flutter air traffic control, but we’re happy to announce that Flutter 3.22 and Dart 3.4 have landed and are available today, just in time for…","identifier":"5e211f708a37","author":{"@type":"Person","name":"Michael Thomsen","url":"https:\u002F\u002Fmedium.com\u002F@mit.mit"},"creator":["Michael Thomsen"],"publisher":{"@type":"Organization","name":"Flutter","url":"https:\u002F\u002Fmedium.com\u002Fflutter","logo":{"@type":"ImageObject","width":228,"height":60,"url":"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:456\u002F1*KvnfbD1F5CzEsU9wSmRZyA.png"}},"mainEntityOfPage":"https:\u002F\u002Fmedium.com\u002Fflutter\u002Fio24-5e211f708a37"}</script><style type="text/css" data-fela-rehydration="579" data-fela-type="STATIC">html{box-sizing:border-box;-webkit-text-size-adjust:100%}*, *:before, *:after{box-sizing:inherit}body{margin:0;padding:0;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;color:rgba(0,0,0,0.8);position:relative;min-height:100vh}h1, h2, h3, h4, h5, h6, dl, dd, ol, ul, menu, figure, blockquote, p, pre, form{margin:0}menu, ol, ul{padding:0;list-style:none;list-style-image:none}main{display:block}a{color:inherit;text-decoration:none}a, button, input{-webkit-tap-highlight-color:transparent}img, svg{vertical-align:middle}button{background:transparent;overflow:visible}button, input, optgroup, select, textarea{margin:0}:root{--reach-tabs:1;--reach-menu-button:1}#speechify-root{font-family:Sohne, sans-serif}div[data-popper-reference-hidden="true"]{visibility:hidden;pointer-events:none}.grecaptcha-badge{visibility:hidden} /*XCode style (c) Angel Garcia <angelgarcia.mail@gmail.com>*/.hljs {background: #fff;color: black; }/* Gray DOCTYPE selectors like WebKit */ .xml .hljs-meta {color: #c0c0c0; }.hljs-comment, .hljs-quote {color: #007400; }.hljs-tag, .hljs-attribute, .hljs-keyword, .hljs-selector-tag, .hljs-literal, .hljs-name {color: #aa0d91; }.hljs-variable, .hljs-template-variable {color: #3F6E74; }.hljs-code, .hljs-string, .hljs-meta .hljs-string {color: #c41a16; }.hljs-regexp, .hljs-link {color: #0E0EFF; }.hljs-title, .hljs-symbol, .hljs-bullet, .hljs-number {color: #1c00cf; }.hljs-section, .hljs-meta {color: #643820; }.hljs-title.class_, .hljs-class .hljs-title, .hljs-type, .hljs-built_in, .hljs-params {color: #5c2699; }.hljs-attr {color: #836C28; }.hljs-subst {color: #000; }.hljs-formula {background-color: #eee;font-style: italic; }.hljs-addition {background-color: #baeeba; }.hljs-deletion {background-color: #ffc8bd; }.hljs-selector-id, .hljs-selector-class {color: #9b703f; }.hljs-doctag, .hljs-strong {font-weight: bold; }.hljs-emphasis {font-style: italic; } </style><style type="text/css" data-fela-rehydration="579" data-fela-type="KEYFRAME">@-webkit-keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}@-moz-keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}@keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}</style><style type="text/css" data-fela-rehydration="579" data-fela-type="RULE">.a{font-family:medium-content-sans-serif-font, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif}.b{font-weight:400}.c{background-color:rgba(255, 255, 255, 1)}.l{display:block}.m{position:sticky}.n{top:0}.o{z-index:500}.p{padding:0 24px}.q{align-items:center}.r{border-bottom:solid 1px #F2F2F2}.y{height:41px}.z{line-height:20px}.ab{display:flex}.ac{height:57px}.ae{flex:1 0 auto}.af{color:inherit}.ag{fill:inherit}.ah{font-size:inherit}.ai{border:inherit}.aj{font-family:inherit}.ak{letter-spacing:inherit}.al{font-weight:inherit}.am{padding:0}.an{margin:0}.ao{cursor:pointer}.ap:disabled{cursor:not-allowed}.aq:disabled{color:#6B6B6B}.ar:disabled{fill:#6B6B6B}.au{width:auto}.av path{fill:#242424}.aw{height:25px}.ax{margin-left:16px}.ay{border:none}.az{border-radius:20px}.ba{width:240px}.bb{background:#F9F9F9}.bc path{fill:#6B6B6B}.be{outline:none}.bf{font-family:sohne, "Helvetica Neue", Helvetica, Arial, sans-serif}.bg{font-size:14px}.bh{width:100%}.bi{padding:10px 20px 10px 0}.bj{background-color:transparent}.bk{color:#242424}.bl::placeholder{color:#6B6B6B}.bm{display:inline-block}.bn{margin-left:12px}.bo{margin-right:12px}.bp{border-radius:4px}.bq{margin-left:24px}.br{height:24px}.bx{background-color:#F9F9F9}.by{border-radius:50%}.bz{height:32px}.ca{width:32px}.cb{justify-content:center}.ch{max-width:680px}.ci{min-width:0}.cj{animation:k1 1.2s ease-in-out infinite}.ck{height:100vh}.cl{margin-bottom:16px}.cm{margin-top:48px}.cn{align-items:flex-start}.co{flex-direction:column}.cp{justify-content:space-between}.cq{margin-bottom:24px}.cw{width:80%}.cx{background-color:#F2F2F2}.dd{height:44px}.de{width:44px}.df{margin:auto 0}.dg{margin-bottom:4px}.dh{height:16px}.di{width:120px}.dj{width:80px}.dp{margin-bottom:8px}.dq{width:96%}.dr{width:98%}.ds{width:81%}.dt{margin-left:8px}.du{color:#6B6B6B}.dv{font-size:13px}.dw{height:100%}.ep{color:#FFFFFF}.eq{fill:#FFFFFF}.er{background:rgba(73, 139, 209, 1)}.es{border-color:rgba(73, 139, 209, 1)}.ew:disabled{cursor:inherit !important}.ex:disabled{opacity:0.3}.ey:disabled:hover{background:rgba(73, 139, 209, 1)}.ez:disabled:hover{border-color:rgba(73, 139, 209, 1)}.fa{border-radius:99em}.fb{border-width:1px}.fc{border-style:solid}.fd{box-sizing:border-box}.fe{text-decoration:none}.ff{text-align:center}.fi{margin-right:32px}.fj{position:relative}.fk{fill:#6B6B6B}.fn{background:transparent}.fo svg{margin-left:4px}.fp svg{fill:#6B6B6B}.fr{box-shadow:inset 0 0 0 1px rgba(0, 0, 0, 0.05)}.fs{position:absolute}.fz{margin:0 24px}.gd{background:rgba(255, 255, 255, 1)}.ge{border:1px solid #F2F2F2}.gf{box-shadow:0 1px 4px #F2F2F2}.gg{max-height:100vh}.gh{overflow-y:auto}.gi{left:0}.gj{top:calc(100vh + 100px)}.gk{bottom:calc(100vh + 100px)}.gl{width:10px}.gm{pointer-events:none}.gn{word-break:break-word}.go{word-wrap:break-word}.gp:after{display:block}.gq:after{content:""}.gr:after{clear:both}.gs{line-height:1.23}.gt{letter-spacing:0}.gu{font-style:normal}.gv{font-weight:700}.hq{margin-bottom:-0.27em}.hr{line-height:1.394}.ih{font-style:inherit}.in{align-items:baseline}.io{width:48px}.ip{height:48px}.iq{border:2px solid rgba(255, 255, 255, 1)}.ir{z-index:0}.is{box-shadow:none}.it{border:1px solid rgba(0, 0, 0, 0.05)}.iu{margin-left:-12px}.iv{width:28px}.iw{height:28px}.ix{z-index:1}.iy{width:24px}.iz{margin-bottom:2px}.ja{flex-wrap:nowrap}.jb{font-size:16px}.jc{line-height:24px}.je{margin:0 8px}.jf{display:inline}.jg{color:rgba(73, 139, 209, 1)}.jh{fill:rgba(73, 139, 209, 1)}.jk{flex:0 0 auto}.jn{flex-wrap:wrap}.jo{white-space:pre-wrap}.jp{margin-right:4px}.jq{overflow:hidden}.jr{max-height:20px}.js{text-overflow:ellipsis}.jt{display:-webkit-box}.ju{-webkit-line-clamp:1}.jv{-webkit-box-orient:vertical}.jw{word-break:break-all}.jy{padding-left:8px}.jz{padding-right:8px}.la> *{flex-shrink:0}.lb{overflow-x:scroll}.lc::-webkit-scrollbar{display:none}.ld{scrollbar-width:none}.le{-ms-overflow-style:none}.lf{width:74px}.lg{flex-direction:row}.lh{z-index:2}.lk{-webkit-user-select:none}.ll{border:0}.lm{fill:rgba(117, 117, 117, 1)}.lp{outline:0}.lq{user-select:none}.lr> svg{pointer-events:none}.ma{cursor:progress}.mb{margin-left:4px}.mc{margin-top:0px}.md{opacity:1}.me{padding:4px 0}.mh{width:16px}.mj{display:inline-flex}.mp{max-width:100%}.mq{padding:8px 2px}.mr svg{color:#6B6B6B}.ni{line-height:1.58}.nj{letter-spacing:-0.004em}.nk{font-family:source-serif-pro, Georgia, Cambria, "Times New Roman", Times, serif}.od{margin-bottom:-0.46em}.oe{text-decoration:underline}.of{margin-left:auto}.og{margin-right:auto}.oh{max-width:1920px}.on{clear:both}.op{cursor:zoom-in}.oq{z-index:auto}.os{height:auto}.ot{padding:2px 4px}.ou{font-size:75%}.ov> strong{font-family:inherit}.ow{font-family:source-code-pro, Menlo, Monaco, "Courier New", Courier, monospace}.ox{line-height:1.12}.oy{letter-spacing:-0.022em}.oz{font-weight:600}.ps{margin-bottom:-0.28em}.py{max-width:1440px}.pz{line-height:1.18}.qn{margin-bottom:-0.31em}.qo{list-style-type:disc}.qp{margin-left:30px}.qq{padding-left:0px}.qw{margin:auto}.qx{padding-bottom:56.206088992974244%}.qy{height:0}.qz{max-width:719px}.ra{margin-top:10px}.rb{max-width:728px}.re{font-style:italic}.rf{max-width:896px}.rg{max-width:1400px}.rh{margin-bottom:26px}.ri{margin-top:6px}.rj{margin-top:8px}.rk{margin-right:8px}.rl{padding:8px 16px}.rm{border-radius:100px}.rn{transition:background 300ms ease}.rp{white-space:nowrap}.rq{border-top:none}.rr{margin-bottom:50px}.rs{height:52px}.rt{max-height:52px}.ru{box-sizing:content-box}.rv{position:static}.rx{max-width:155px}.sd{margin-right:20px}.se{margin-bottom:64px}.sf{margin-bottom:48px}.st{border-radius:2px}.sv{height:64px}.sw{width:64px}.sx{align-self:flex-end}.sy{flex:1 1 auto}.te{padding-right:4px}.tf{font-weight:500}.tm{margin-top:16px}.tn{color:rgba(255, 255, 255, 1)}.to{fill:rgba(255, 255, 255, 1)}.tp{background:rgba(25, 25, 25, 1)}.tq{border-color:rgba(25, 25, 25, 1)}.tt:disabled{opacity:0.1}.tu:disabled:hover{background:rgba(25, 25, 25, 1)}.tv:disabled:hover{border-color:rgba(25, 25, 25, 1)}.ub{height:0px}.uc{gap:18px}.ud{fill:rgba(61, 61, 61, 1)}.uf{padding-bottom:6px}.ug{border-bottom:1px solid #F2F2F2}.um{margin-top:32px}.un{fill:#242424}.uo{background:0}.up{border-color:#242424}.uq:disabled:hover{color:#242424}.ur:disabled:hover{fill:#242424}.us:disabled:hover{border-color:#242424}.vd{border-bottom:solid 1px #E5E5E5}.ve{margin-top:72px}.vf{padding:24px 0}.vg{margin-bottom:0px}.vh{margin-right:16px}.as:hover:not(:disabled){color:rgba(25, 25, 25, 1)}.at:hover:not(:disabled){fill:rgba(25, 25, 25, 1)}.et:hover{background:rgba(68, 119, 175, 1)}.eu:hover{border-color:rgba(68, 119, 175, 1)}.ev:hover{cursor:pointer}.fl:hover{color:#242424}.fm:hover{fill:#242424}.fq:hover svg{fill:#242424}.ft:hover{background-color:rgba(0, 0, 0, 0.1)}.jd:hover{text-decoration:underline}.ji:hover:not(:disabled){color:rgba(68, 119, 175, 1)}.jj:hover:not(:disabled){fill:rgba(68, 119, 175, 1)}.lo:hover{fill:rgba(8, 8, 8, 1)}.mf:hover{fill:#000000}.mg:hover p{color:#000000}.mi:hover{color:#000000}.ms:hover svg{color:#000000}.ro:hover{background-color:#F2F2F2}.su:hover{background-color:none}.tr:hover{background:#000000}.ts:hover{border-color:#242424}.ue:hover{fill:rgba(25, 25, 25, 1)}.bd:focus-within path{fill:#242424}.ln:focus{fill:rgba(8, 8, 8, 1)}.mt:focus svg{color:#000000}.or:focus{transform:scale(1.01)}.ls:active{border-style:none}</style><style type="text/css" data-fela-rehydration="579" data-fela-type="RULE" media="all and (min-width: 1080px)">.d{display:none}.bw{width:64px}.cg{margin:0 64px}.cv{height:48px}.dc{margin-bottom:52px}.do{margin-bottom:48px}.ef{font-size:14px}.eg{line-height:20px}.em{font-size:13px}.eo{padding:5px 12px}.fh{display:flex}.fy{margin-bottom:50px}.gc{max-width:680px}.hm{font-size:42px}.hn{margin-top:1.19em}.ho{line-height:52px}.hp{letter-spacing:-0.011em}.ie{font-size:22px}.if{margin-top:0.92em}.ig{line-height:28px}.im{align-items:center}.km{border-top:solid 1px #F2F2F2}.kn{border-bottom:solid 1px #F2F2F2}.ko{margin:32px 0 0}.kp{padding:3px 8px}.ky> *{margin-right:24px}.kz> :last-child{margin-right:0}.lz{margin-top:0px}.mo{margin:0}.nz{font-size:20px}.oa{margin-top:2.14em}.ob{line-height:32px}.oc{letter-spacing:-0.003em}.om{margin-top:56px}.po{font-size:24px}.pp{margin-top:1.95em}.pq{line-height:30px}.pr{letter-spacing:-0.016em}.px{margin-top:0.94em}.qk{margin-top:1.72em}.ql{line-height:24px}.qm{letter-spacing:0}.qv{margin-top:1.14em}.sc{display:inline-block}.sg{flex-direction:row}.sj{margin-bottom:0}.sk{margin-right:20px}.sz{max-width:500px}.ua{margin-bottom:88px}.ul{margin:40px 0 16px}.ux{width:min-width}.vc{padding-top:72px}</style><style type="text/css" data-fela-rehydration="579" data-fela-type="RULE" media="all and (max-width: 1079.98px)">.e{display:none}.ly{margin-top:0px}.rc{margin-left:auto}.rd{text-align:center}.sb{display:inline-block}</style><style type="text/css" data-fela-rehydration="579" data-fela-type="RULE" media="all and (max-width: 903.98px)">.f{display:none}.lx{margin-top:0px}.sa{display:inline-block}</style><style type="text/css" data-fela-rehydration="579" data-fela-type="RULE" media="all and (max-width: 727.98px)">.g{display:none}.lv{margin-top:0px}.lw{margin-right:0px}.rz{display:inline-block}</style><style type="text/css" data-fela-rehydration="579" data-fela-type="RULE" media="all and (max-width: 551.98px)">.h{display:none}.s{display:flex}.t{justify-content:space-between}.bs{width:24px}.cc{margin:0 24px}.cr{height:40px}.cy{margin-bottom:44px}.dk{margin-bottom:32px}.dx{font-size:13px}.dy{line-height:20px}.eh{padding:0px 8px 1px}.fu{margin-bottom:2px}.gw{font-size:32px}.gx{margin-top:1.01em}.gy{line-height:38px}.gz{letter-spacing:-0.014em}.hs{font-size:18px}.ht{margin-top:0.79em}.hu{line-height:24px}.ii{align-items:flex-start}.jl{flex-direction:column}.ka{margin:24px -24px 0}.kb{padding:0}.kq> *{margin-right:8px}.kr> :last-child{margin-right:24px}.li{margin-left:0px}.lt{margin-top:0px}.lu{margin-right:0px}.mk{margin:0}.mu{border:1px solid #F2F2F2}.mv{border-radius:99em}.mw{padding:0px 16px 0px 12px}.mx{height:38px}.my{align-items:center}.na svg{margin-right:8px}.nl{margin-top:1.56em}.nm{line-height:28px}.nn{letter-spacing:-0.003em}.oi{margin-top:40px}.pa{font-size:20px}.pb{margin-top:1.2em}.pc{letter-spacing:0}.pt{margin-top:0.67em}.qa{font-size:16px}.qb{margin-top:1.23em}.qr{margin-top:1.34em}.ry{display:inline-block}.sr{margin-bottom:20px}.ss{margin-right:0}.td{max-width:100%}.tg{font-size:24px}.th{line-height:30px}.ti{letter-spacing:-0.016em}.tw{margin-bottom:64px}.uh{margin:32px 0 16px}.ut{width:100%}.uy{padding-top:48px}.mz:hover{border-color:#E5E5E5}</style><style type="text/css" data-fela-rehydration="579" data-fela-type="RULE" media="all and (min-width: 904px) and (max-width: 1079.98px)">.i{display:none}.bv{width:64px}.cf{margin:0 64px}.cu{height:48px}.db{margin-bottom:52px}.dn{margin-bottom:48px}.ed{font-size:14px}.ee{line-height:20px}.ek{font-size:13px}.el{padding:5px 12px}.fg{display:flex}.fx{margin-bottom:50px}.gb{max-width:680px}.hi{font-size:42px}.hj{margin-top:1.19em}.hk{line-height:52px}.hl{letter-spacing:-0.011em}.ib{font-size:22px}.ic{margin-top:0.92em}.id{line-height:28px}.il{align-items:center}.ki{border-top:solid 1px #F2F2F2}.kj{border-bottom:solid 1px #F2F2F2}.kk{margin:32px 0 0}.kl{padding:3px 8px}.kw> *{margin-right:24px}.kx> :last-child{margin-right:0}.mn{margin:0}.nv{font-size:20px}.nw{margin-top:2.14em}.nx{line-height:32px}.ny{letter-spacing:-0.003em}.ol{margin-top:56px}.pk{font-size:24px}.pl{margin-top:1.95em}.pm{line-height:30px}.pn{letter-spacing:-0.016em}.pw{margin-top:0.94em}.qh{margin-top:1.72em}.qi{line-height:24px}.qj{letter-spacing:0}.qu{margin-top:1.14em}.sh{flex-direction:row}.sl{margin-bottom:0}.sm{margin-right:20px}.ta{max-width:500px}.tz{margin-bottom:88px}.uk{margin:40px 0 16px}.uw{width:min-width}.vb{padding-top:72px}</style><style type="text/css" data-fela-rehydration="579" data-fela-type="RULE" media="all and (min-width: 728px) and (max-width: 903.98px)">.j{display:none}.w{display:flex}.x{justify-content:space-between}.bu{width:64px}.ce{margin:0 48px}.ct{height:48px}.da{margin-bottom:52px}.dm{margin-bottom:48px}.eb{font-size:13px}.ec{line-height:20px}.ej{padding:0px 8px 1px}.fw{margin-bottom:50px}.ga{max-width:680px}.he{font-size:42px}.hf{margin-top:1.19em}.hg{line-height:52px}.hh{letter-spacing:-0.011em}.hy{font-size:22px}.hz{margin-top:0.92em}.ia{line-height:28px}.ik{align-items:center}.ke{border-top:solid 1px #F2F2F2}.kf{border-bottom:solid 1px #F2F2F2}.kg{margin:32px 0 0}.kh{padding:3px 8px}.ku> *{margin-right:24px}.kv> :last-child{margin-right:0}.mm{margin:0}.nr{font-size:20px}.ns{margin-top:2.14em}.nt{line-height:32px}.nu{letter-spacing:-0.003em}.ok{margin-top:56px}.pg{font-size:24px}.ph{margin-top:1.95em}.pi{line-height:30px}.pj{letter-spacing:-0.016em}.pv{margin-top:0.94em}.qe{margin-top:1.72em}.qf{line-height:24px}.qg{letter-spacing:0}.qt{margin-top:1.14em}.si{flex-direction:row}.sn{margin-bottom:0}.so{margin-right:20px}.tb{max-width:500px}.ty{margin-bottom:88px}.uj{margin:40px 0 16px}.uv{width:min-width}.va{padding-top:72px}</style><style type="text/css" data-fela-rehydration="579" data-fela-type="RULE" media="all and (min-width: 552px) and (max-width: 727.98px)">.k{display:none}.u{display:flex}.v{justify-content:space-between}.bt{width:24px}.cd{margin:0 24px}.cs{height:40px}.cz{margin-bottom:44px}.dl{margin-bottom:32px}.dz{font-size:13px}.ea{line-height:20px}.ei{padding:0px 8px 1px}.fv{margin-bottom:2px}.ha{font-size:32px}.hb{margin-top:1.01em}.hc{line-height:38px}.hd{letter-spacing:-0.014em}.hv{font-size:18px}.hw{margin-top:0.79em}.hx{line-height:24px}.ij{align-items:flex-start}.jm{flex-direction:column}.kc{margin:24px 0 0}.kd{padding:0}.ks> *{margin-right:8px}.kt> :last-child{margin-right:8px}.lj{margin-left:0px}.ml{margin:0}.nb{border:1px solid #F2F2F2}.nc{border-radius:99em}.nd{padding:0px 16px 0px 12px}.ne{height:38px}.nf{align-items:center}.nh svg{margin-right:8px}.no{margin-top:1.56em}.np{line-height:28px}.nq{letter-spacing:-0.003em}.oj{margin-top:40px}.pd{font-size:20px}.pe{margin-top:1.2em}.pf{letter-spacing:0}.pu{margin-top:0.67em}.qc{font-size:16px}.qd{margin-top:1.23em}.qs{margin-top:1.34em}.sp{margin-bottom:20px}.sq{margin-right:0}.tc{max-width:100%}.tj{font-size:24px}.tk{line-height:30px}.tl{letter-spacing:-0.016em}.tx{margin-bottom:64px}.ui{margin:32px 0 16px}.uu{width:100%}.uz{padding-top:48px}.ng:hover{border-color:#E5E5E5}</style><style type="text/css" data-fela-rehydration="579" data-fela-type="RULE" media="print">.rw{display:none}</style><style type="text/css" data-fela-rehydration="579" data-fela-type="RULE" media="(orientation: landscape) and (max-width: 903.98px)">.jx{max-height:none}</style><style type="text/css" data-fela-rehydration="579" data-fela-type="RULE" media="(prefers-reduced-motion: no-preference)">.oo{transition:transform 300ms cubic-bezier(0.2, 0, 0.2, 1)}</style></head><body><div id="root"><div class="a b c"><div class="d e f g h i j k"></div><script>document.domain = document.domain;</script><div class="l c"><div class="l m n o c"><div class="p q r s t u v w x i d y z"><a class="du ag dv bf ak b am an ao ap aq ar as at s u w i d q dw z" href="https://rsci.app.link/?%24canonical_url=https%3A%2F%2Fmedium.com%2Fp%2F5e211f708a37&amp;%7Efeature=LoOpenInAppButton&amp;%7Echannel=ShowPostUnderCollection&amp;source=---top_nav_layout_nav-----------------------------------------" rel="noopener follow">Open in app<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" fill="none" viewBox="0 0 10 10" class="dt"><path fill="currentColor" d="M.985 8.485a.375.375 0 1 0 .53.53zM8.75 1.25h.375A.375.375 0 0 0 8.75.875zM8.375 6.5a.375.375 0 1 0 .75 0zM3.5.875a.375.375 0 1 0 0 .75zm-1.985 8.14 7.5-7.5-.53-.53-7.5 7.5zm6.86-7.765V6.5h.75V1.25zM3.5 1.625h5.25v-.75H3.5z"></path></svg></a><div class="ab q"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><button class="bf b dx dy eh dz ea ei eb ec ej ek ee el em eg eo ep eq er es et eu ev ew ex ey ez fa fb fc fd bm fe ff" data-testid="headerSignUpButton">Sign up</button></span></p><div class="ax l"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSignInButton" rel="noopener follow" href="/m/signin?operation=login&amp;redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fio24-5e211f708a37&amp;source=post_page---top_nav_layout_nav-----------------------global_nav------------------">Sign in</a></span></p></div></div></div><div class="p q r ab ac"><div class="ab q ae"><a class="af ag ah ai aj ak al am an ao ap aq ar as at ab" aria-label="Homepage" data-testid="headerMediumLogo" rel="noopener follow" href="/?source=---top_nav_layout_nav-----------------------------------------"><svg xmlns="http://www.w3.org/2000/svg" width="719" height="160" fill="none" viewBox="0 0 719 160" class="au av aw"><path fill="#242424" d="m174.104 9.734.215-.047V8.02H130.39L89.6 103.89 48.81 8.021H1.472v1.666l.212.047c8.018 1.81 12.09 4.509 12.09 14.242V137.93c0 9.734-4.087 12.433-12.106 14.243l-.212.047v1.671h32.118v-1.665l-.213-.048c-8.018-1.809-12.089-4.509-12.089-14.242V30.586l52.399 123.305h2.972l53.925-126.743V140.75c-.687 7.688-4.721 10.062-11.982 11.701l-.215.05v1.652h55.948v-1.652l-.215-.05c-7.269-1.639-11.4-4.013-12.087-11.701l-.037-116.774h.037c0-9.733 4.071-12.432 12.087-14.242m25.555 75.488c.915-20.474 8.268-35.252 20.606-35.507 3.806.063 6.998 1.312 9.479 3.714 5.272 5.118 7.751 15.812 7.368 31.793zm-.553 5.77h65.573v-.275c-.186-15.656-4.721-27.834-13.466-36.196-7.559-7.227-18.751-11.203-30.507-11.203h-.263c-6.101 0-13.584 1.48-18.909 4.16-6.061 2.807-11.407 7.003-15.855 12.511-7.161 8.874-11.499 20.866-12.554 34.343q-.05.606-.092 1.212a50 50 0 0 0-.065 1.151 85.807 85.807 0 0 0-.094 5.689c.71 30.524 17.198 54.917 46.483 54.917 25.705 0 40.675-18.791 44.407-44.013l-1.886-.664c-6.557 13.556-18.334 21.771-31.738 20.769-18.297-1.369-32.314-19.922-31.042-42.395m139.722 41.359c-2.151 5.101-6.639 7.908-12.653 7.908s-11.513-4.129-15.418-11.63c-4.197-8.053-6.405-19.436-6.405-32.92 0-28.067 8.729-46.22 22.24-46.22 5.657 0 10.111 2.807 12.236 7.704zm43.499 20.008c-8.019-1.897-12.089-4.722-12.089-14.951V1.309l-48.716 14.353v1.757l.299-.024c6.72-.543 11.278.386 13.925 2.83 2.072 1.915 3.082 4.853 3.082 8.987v18.66c-4.803-3.067-10.516-4.56-17.448-4.56-14.059 0-26.909 5.92-36.176 16.672-9.66 11.205-14.767 26.518-14.767 44.278-.003 31.72 15.612 53.039 38.851 53.039 13.595 0 24.533-7.449 29.54-20.013v16.865h43.711v-1.746zM424.1 19.819c0-9.904-7.468-17.374-17.375-17.374-9.859 0-17.573 7.632-17.573 17.374s7.721 17.374 17.573 17.374c9.907 0 17.375-7.47 17.375-17.374m11.499 132.546c-8.019-1.897-12.089-4.722-12.089-14.951h-.035V43.635l-43.714 12.551v1.705l.263.024c9.458.842 12.047 4.1 12.047 15.152v81.086h43.751v-1.746zm112.013 0c-8.018-1.897-12.089-4.722-12.089-14.951V43.635l-41.621 12.137v1.71l.246.026c7.733.813 9.967 4.257 9.967 15.36v59.279c-2.578 5.102-7.415 8.131-13.274 8.336-9.503 0-14.736-6.419-14.736-18.073V43.638l-43.714 12.55v1.703l.262.024c9.459.84 12.05 4.097 12.05 15.152v50.17a56.3 56.3 0 0 0 .91 10.444l.787 3.423c3.701 13.262 13.398 20.197 28.59 20.197 12.868 0 24.147-7.966 29.115-20.43v17.311h43.714v-1.747zm169.818 1.788v-1.749l-.213-.05c-8.7-2.006-12.089-5.789-12.089-13.49v-63.79c0-19.89-11.171-31.761-29.883-31.761-13.64 0-25.141 7.882-29.569 20.16-3.517-13.01-13.639-20.16-28.606-20.16-13.146 0-23.449 6.938-27.869 18.657V43.643L545.487 55.68v1.715l.263.024c9.345.829 12.047 4.181 12.047 14.95v81.784h40.787v-1.746l-.215-.053c-6.941-1.631-9.181-4.606-9.181-12.239V66.998c1.836-4.289 5.537-9.37 12.853-9.37 9.086 0 13.692 6.296 13.692 18.697v77.828h40.797v-1.746l-.215-.053c-6.94-1.631-9.18-4.606-9.18-12.239V75.066a42 42 0 0 0-.578-7.26c1.947-4.661 5.86-10.177 13.475-10.177 9.214 0 13.691 6.114 13.691 18.696v77.828z"></path></svg></a><div class="ax h"><div class="ab ay az ba bb q bc bd"><div class="bm" aria-hidden="false" aria-describedby="searchResults" aria-labelledby="searchResults"></div><div class="bn bo ab"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M4.092 11.06a6.95 6.95 0 1 1 13.9 0 6.95 6.95 0 0 1-13.9 0m6.95-8.05a8.05 8.05 0 1 0 5.13 14.26l3.75 3.75a.56.56 0 1 0 .79-.79l-3.73-3.73A8.05 8.05 0 0 0 11.042 3z" clip-rule="evenodd"></path></svg></div><input role="combobox" aria-controls="searchResults" aria-expanded="false" aria-label="search" data-testid="headerSearchInput" tabindex="0" class="ay be bf bg z bh bi bj bk bl" placeholder="Search" value=""/></div></div></div><div class="h k w fg fh"><div class="fi ab"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerWriteButton" rel="noopener follow" href="/m/signin?operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fnew-story&amp;source=---top_nav_layout_nav-----------------------new_post_topnav------------------"><div class="bf b bg z du fj fk ab q fl fm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24" aria-label="Write"><path fill="currentColor" d="M14 4a.5.5 0 0 0 0-1zm7 6a.5.5 0 0 0-1 0zm-7-7H4v1h10zM3 4v16h1V4zm1 17h16v-1H4zm17-1V10h-1v10zm-1 1a1 1 0 0 0 1-1h-1zM3 20a1 1 0 0 0 1 1v-1zM4 3a1 1 0 0 0-1 1h1z"></path><path stroke="currentColor" d="m17.5 4.5-8.458 8.458a.25.25 0 0 0-.06.098l-.824 2.47a.25.25 0 0 0 .316.316l2.47-.823a.25.25 0 0 0 .098-.06L19.5 6.5m-2-2 2.323-2.323a.25.25 0 0 1 .354 0l1.646 1.646a.25.25 0 0 1 0 .354L19.5 6.5m-2-2 2 2"></path></svg><div class="dt l">Write</div></div></a></span></div></div><div class="k j i d"><div class="fi ab"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSearchButton" rel="noopener follow" href="/search?source=---top_nav_layout_nav-----------------------------------------"><div class="bf b bg z du fj fk ab q fl fm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24" aria-label="Search"><path fill="currentColor" fill-rule="evenodd" d="M4.092 11.06a6.95 6.95 0 1 1 13.9 0 6.95 6.95 0 0 1-13.9 0m6.95-8.05a8.05 8.05 0 1 0 5.13 14.26l3.75 3.75a.56.56 0 1 0 .79-.79l-3.73-3.73A8.05 8.05 0 0 0 11.042 3z" clip-rule="evenodd"></path></svg></div></a></div></div><div class="fi h k j"><div class="ab q"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><button class="bf b dx dy eh dz ea ei eb ec ej ek ee el em eg eo ep eq er es et eu ev ew ex ey ez fa fb fc fd bm fe ff" data-testid="headerSignUpButton">Sign up</button></span></p><div class="ax l"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSignInButton" rel="noopener follow" href="/m/signin?operation=login&amp;redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fio24-5e211f708a37&amp;source=post_page---top_nav_layout_nav-----------------------global_nav------------------">Sign in</a></span></p></div></div></div><div class="l" aria-hidden="false"><button class="ay fn am ab q ao fo fp fq" aria-label="user options menu" data-testid="headerUserIcon"><div class="l fj"><img alt="" class="l fd by bz ca cx" src="https://miro.medium.com/v2/resize:fill:64:64/1*dmbNkD5D-u45r44go_cf0g.png" width="32" height="32" loading="lazy" role="presentation"/><div class="fr by l bz ca fs n ay ft"></div></div></button></div></div></div><div class="l"><div class="fu fv fw fx fy l"><div class="ab cb"><div class="ci bh fz ga gb gc"></div></div><article><div class="l"><div class="l"><span class="l"></span><section><div><div class="fs gi gj gk gl gm"></div><div class="gn go gp gq gr"><div class="ab cb"><div class="ci bh fz ga gb gc"><div><h1 id="48b3" class="pw-post-title gs gt gu bf gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq bk" data-testid="storyTitle">Landing Flutter 3.22 and Dart 3.4 at Google I/O 2024</h1></div><div><h2 id="3c18" class="pw-subtitle-paragraph hr gt gu bf b hs ht hu hv hw hx hy hz ia ib ic id ie if ig cq du"><em class="ih">Major milestones for Flutter web apps, graphics performance upgrades, productivity experiments, and more</em></h2><div><div class="speechify-ignore ab cp"><div class="speechify-ignore bh l"><div class="ii ij ik il im ab"><div><div class="ab in"><div><div class="bm" aria-hidden="false"><a rel="noopener follow" href="/@mit.mit?source=post_page---byline--5e211f708a37---------------------------------------"><div class="l io ip by iq ir"><div class="l fj"><img alt="Michael Thomsen" class="l fd by dd de cx" src="https://miro.medium.com/v2/resize:fill:88:88/0*Y_CFLc1qadgr3tPK." width="44" height="44" loading="lazy" data-testid="authorPhoto"/><div class="is by l dd de fs n it ft"></div></div></div></a></div></div><div class="iu ab fj"><div><div class="bm" aria-hidden="false"><a href="https://medium.com/flutter?source=post_page---byline--5e211f708a37---------------------------------------" rel="noopener follow"><div class="l iv iw by iq ix"><div class="l fj"><img alt="Flutter" class="l fd by br iy cx" src="https://miro.medium.com/v2/resize:fill:48:48/1*5-aoK8IBmXve5whBQM90GA.png" width="24" height="24" loading="lazy" data-testid="publicationPhoto"/><div class="is by l br iy fs n it ft"></div></div></div></a></div></div></div></div></div><div class="bn bh l"><div class="ab"><div style="flex:1"><span class="bf b bg z bk"><div class="iz ab q"><div class="ab q ja"><div class="ab q"><div><div class="bm" aria-hidden="false"><p class="bf b jb jc bk"><a class="af ag ah ai aj ak al am an ao ap aq ar jd" data-testid="authorName" rel="noopener follow" href="/@mit.mit?source=post_page---byline--5e211f708a37---------------------------------------">Michael Thomsen</a></p></div></div></div><span class="je jf" aria-hidden="true"><span class="bf b bg z du">·</span></span><p class="bf b jb jc du"><span><a class="jg jh ah ai aj ak al am an ao ap aq ar ex ji jj" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fsubscribe%2Fuser%2Fa6d788faa5e5&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fio24-5e211f708a37&amp;user=Michael+Thomsen&amp;userId=a6d788faa5e5&amp;source=post_page-a6d788faa5e5--byline--5e211f708a37---------------------post_header------------------">Follow</a></span></p></div></div></span></div></div><div class="l jk"><span class="bf b bg z du"><div class="ab cn jl jm jn"><div class="fu fv ab"><div class="bf b bg z du ab jo"><span class="jp l jk">Published in</span><div><div class="l" aria-hidden="false"><a class="af ag ah ai aj ak al am an ao ap aq ar jd ab q" data-testid="publicationName" href="https://medium.com/flutter?source=post_page---byline--5e211f708a37---------------------------------------" rel="noopener follow"><p class="bf b bg z jq jr js jt ju jv jw jx bk">Flutter</p></a></div></div></div><div class="h k"><span class="je jf" aria-hidden="true"><span class="bf b bg z du">·</span></span></div></div><span class="bf b bg z du"><div class="ab ae"><span data-testid="storyReadTime">7 min read</span><div class="jy jz l" aria-hidden="true"><span class="l" aria-hidden="true"><span class="bf b bg z du">·</span></span></div><span data-testid="storyPublishDate">May 14, 2024</span></div></span></div></span></div></div></div><div class="ab cp ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp"><div class="h k w fg fh q"><div class="lf l"><div class="ab q lg lh"><div class="pw-multi-vote-icon fj jp li lj lk"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerClapButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Fflutter%2F5e211f708a37&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fio24-5e211f708a37&amp;user=Michael+Thomsen&amp;userId=a6d788faa5e5&amp;source=---header_actions--5e211f708a37---------------------clap_footer------------------"><div><div class="bm" aria-hidden="false"><div class="ll ao lm ln lo lp am lq lr ls lk"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l lt lu lv lw lx ly lz"><p class="bf b dv z du"><span class="ma">--</span></p></div></div></div><div><div class="bm" aria-hidden="false"><button class="ao ll md me ab q fk mf mg" aria-label="responses"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" class="mc"><path d="M18.006 16.803c1.533-1.456 2.234-3.325 2.234-5.321C20.24 7.357 16.709 4 12.191 4S4 7.357 4 11.482c0 4.126 3.674 7.482 8.191 7.482.817 0 1.622-.111 2.393-.327.231.2.48.391.744.559 1.06.693 2.203 1.044 3.399 1.044.224-.008.4-.112.486-.287a.49.49 0 0 0-.042-.518c-.495-.67-.845-1.364-1.04-2.057a4 4 0 0 1-.125-.598zm-3.122 1.055-.067-.223-.315.096a8 8 0 0 1-2.311.338c-4.023 0-7.292-2.955-7.292-6.587 0-3.633 3.269-6.588 7.292-6.588 4.014 0 7.112 2.958 7.112 6.593 0 1.794-.608 3.469-2.027 4.72l-.195.168v.255c0 .056 0 .151.016.295.025.231.081.478.154.733.154.558.398 1.117.722 1.659a5.3 5.3 0 0 1-2.165-.845c-.276-.176-.714-.383-.941-.59z"></path></svg><p class="bf b dv z du"><span class="pw-responses-count mb mc">10</span></p></button></div></div></div><div class="ab q kq kr ks kt ku kv kw kx ky kz la lb lc ld le"><div class="mh k j i d"></div><div class="h k"><div><div class="bm" aria-hidden="false"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerBookmarkButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fbookmark%2Fp%2F5e211f708a37&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fio24-5e211f708a37&amp;source=---header_actions--5e211f708a37---------------------bookmark_footer------------------"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" fill="none" viewBox="0 0 25 25" class="du mi" aria-label="Add to list bookmark button"><path fill="currentColor" d="M18 2.5a.5.5 0 0 1 1 0V5h2.5a.5.5 0 0 1 0 1H19v2.5a.5.5 0 1 1-1 0V6h-2.5a.5.5 0 0 1 0-1H18zM7 7a1 1 0 0 1 1-1h3.5a.5.5 0 0 0 0-1H8a2 2 0 0 0-2 2v14a.5.5 0 0 0 .805.396L12.5 17l5.695 4.396A.5.5 0 0 0 19 21v-8.5a.5.5 0 0 0-1 0v7.485l-5.195-4.012a.5.5 0 0 0-.61 0L7 19.985z"></path></svg></a></span></div></div></div><div class="fd mj cn"><div class="l ae"><div class="ab cb"><div class="mk ml mm mn mo mp ci bh"><div class="ab"><div class="bm" aria-hidden="false"><div><div class="bm" aria-hidden="false"><button aria-label="Listen" data-testid="audioPlayButton" class="af fk ah ai aj ak al mq an ao ap ex mr ms mg mt mu mv mw mx s my mz na nb nc nd ne u nf ng nh"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M3 12a9 9 0 1 1 18 0 9 9 0 0 1-18 0m9-10C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2m3.376 10.416-4.599 3.066a.5.5 0 0 1-.777-.416V8.934a.5.5 0 0 1 .777-.416l4.599 3.066a.5.5 0 0 1 0 .832" clip-rule="evenodd"></path></svg><div class="j i d"><p class="bf b bg z du">Listen</p></div></button></div></div></div></div></div></div></div></div><div class="bm" aria-hidden="false" aria-describedby="postFooterSocialMenu" aria-labelledby="postFooterSocialMenu"><div><div class="bm" aria-hidden="false"><button aria-controls="postFooterSocialMenu" aria-expanded="false" aria-label="Share Post" data-testid="headerSocialShareButton" class="af fk ah ai aj ak al mq an ao ap ex mr ms mg mt mu mv mw mx s my mz na nb nc nd ne u nf ng nh"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M15.218 4.931a.4.4 0 0 1-.118.132l.012.006a.45.45 0 0 1-.292.074.5.5 0 0 1-.3-.13l-2.02-2.02v7.07c0 .28-.23.5-.5.5s-.5-.22-.5-.5v-7.04l-2 2a.45.45 0 0 1-.57.04h-.02a.4.4 0 0 1-.16-.3.4.4 0 0 1 .1-.32l2.8-2.8a.5.5 0 0 1 .7 0l2.8 2.79a.42.42 0 0 1 .068.498m-.106.138.008.004v-.01zM16 7.063h1.5a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-11c-1.1 0-2-.9-2-2v-10a2 2 0 0 1 2-2H8a.5.5 0 0 1 .35.15.5.5 0 0 1 .15.35.5.5 0 0 1-.15.35.5.5 0 0 1-.35.15H6.4c-.5 0-.9.4-.9.9v10.2a.9.9 0 0 0 .9.9h11.2c.5 0 .9-.4.9-.9v-10.2c0-.5-.4-.9-.9-.9H16a.5.5 0 0 1 0-1" clip-rule="evenodd"></path></svg><div class="j i d"><p class="bf b bg z du">Share</p></div></button></div></div></div></div></div></div></div></div></div><p id="2605" class="pw-post-body-paragraph ni nj gu nk b hs nl nm nn hv no np nq nr ns nt nu nv nw nx ny nz oa ob oc od gn bk">It’s been a particularly busy last few months in Dart &amp; Flutter air traffic control, but we’re happy to announce that Flutter 3.22 and Dart 3.4 have landed and are available today, just in time for this year’s <a class="af oe" href="https://io.google/2024/" rel="noopener ugc nofollow" target="_blank">Google I/O</a>!</p><p id="7175" class="pw-post-body-paragraph ni nj gu nk b hs nl nm nn hv no np nq nr ns nt nu nv nw nx ny nz oa ob oc od gn bk">We remain committed to providing a strong language and framework pairing, enabling you to build beautiful, rich, and fast apps from a single, shared code base — so you can deliver apps to users on mobile, web, and desktop — without having to fragment your product roadmap.</p><figure class="oi oj ok ol om on of og paragraph-image"><div role="button" tabindex="0" class="oo op fj oq bh or"><div class="of og oh"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/1*Mq-Uj8c8l7rrpPxYQ6Gemw.gif 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*Mq-Uj8c8l7rrpPxYQ6Gemw.gif 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*Mq-Uj8c8l7rrpPxYQ6Gemw.gif 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*Mq-Uj8c8l7rrpPxYQ6Gemw.gif 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*Mq-Uj8c8l7rrpPxYQ6Gemw.gif 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Mq-Uj8c8l7rrpPxYQ6Gemw.gif 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/1*Mq-Uj8c8l7rrpPxYQ6Gemw.gif 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/1*Mq-Uj8c8l7rrpPxYQ6Gemw.gif 640w, https://miro.medium.com/v2/resize:fit:720/1*Mq-Uj8c8l7rrpPxYQ6Gemw.gif 720w, https://miro.medium.com/v2/resize:fit:750/1*Mq-Uj8c8l7rrpPxYQ6Gemw.gif 750w, https://miro.medium.com/v2/resize:fit:786/1*Mq-Uj8c8l7rrpPxYQ6Gemw.gif 786w, https://miro.medium.com/v2/resize:fit:828/1*Mq-Uj8c8l7rrpPxYQ6Gemw.gif 828w, https://miro.medium.com/v2/resize:fit:1100/1*Mq-Uj8c8l7rrpPxYQ6Gemw.gif 1100w, https://miro.medium.com/v2/resize:fit:1400/1*Mq-Uj8c8l7rrpPxYQ6Gemw.gif 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/><img alt="" class="bh mp os c" width="700" height="547" loading="lazy" role="presentation"/></picture></div></div></figure><p id="eb5b" class="pw-post-body-paragraph ni nj gu nk b hs nl nm nn hv no np nq nr ns nt nu nv nw nx ny nz oa ob oc od gn bk">Flutter 3.22 and Dart 3.4 offer performance improvements and platform-specific refinements that bring us closer to that vision. We’re particularly excited to share more about our journey with Wasm, but you’ll find so much more, including an improved Impeller rendering engine, smoother visuals and reduced CPU usage on iOS, enhanced platform navigation with Android’s predictive back gesture, expanded monetization options with the Google Mobile Ads SDK, and a new powerful deep link validator in DevTools. Dart developers will enjoy streamlined API migration with <code class="cx ot ou ov ow b">dart fix</code> directly in the IDE and new DevTools capabilities for advanced profiling. Plus, you can now preview the Vertex AI for Firebase Dart SDK, integrating AI-powered features with robust security measures.</p><p id="ac39" class="pw-post-body-paragraph ni nj gu nk b hs nl nm nn hv no np nq nr ns nt nu nv nw nx ny nz oa ob oc od gn bk">Today, we’ll also spotlight top companies using Flutter to increase productivity and build performant experiences. We’ll highlight just a few particularly exciting features that move us closer to our goal to deliver native-like performance across platforms, and include selected updates on our investments in productivity, developer experience, and games.</p><p id="b087" class="pw-post-body-paragraph ni nj gu nk b hs nl nm nn hv no np nq nr ns nt nu nv nw nx ny nz oa ob oc od gn bk">If you want more details on everything included in the releases, check out the dedicated <a class="af oe" rel="noopener" href="/flutter/fbde6c164fe3">Flutter</a> and <a class="af oe" rel="noopener" href="/dartlang/dart-3-4-bd8d23b4462a">Dart</a> posts. It’s time to Dash!</p><h1 id="9ed0" class="ox oy gu bf oz pa pb hu pc pd pe hx pf pg ph pi pj pk pl pm pn po pp pq pr ps bk">Flutter in action</h1><p id="d76a" class="pw-post-body-paragraph ni nj gu nk b hs pt nm nn hv pu np nq nr pv nt nu nv pw nx ny nz px ob oc od gn bk">Flutter developers are busy launching large, new apps into the app stores. Let’s look at a few.</p><figure class="oi oj ok ol om on of og paragraph-image"><div role="button" tabindex="0" class="oo op fj oq bh or"><div class="of og py"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*cF6UE3y05YTyMBQn 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*cF6UE3y05YTyMBQn 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*cF6UE3y05YTyMBQn 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*cF6UE3y05YTyMBQn 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*cF6UE3y05YTyMBQn 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*cF6UE3y05YTyMBQn 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*cF6UE3y05YTyMBQn 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/0*cF6UE3y05YTyMBQn 640w, https://miro.medium.com/v2/resize:fit:720/0*cF6UE3y05YTyMBQn 720w, https://miro.medium.com/v2/resize:fit:750/0*cF6UE3y05YTyMBQn 750w, https://miro.medium.com/v2/resize:fit:786/0*cF6UE3y05YTyMBQn 786w, https://miro.medium.com/v2/resize:fit:828/0*cF6UE3y05YTyMBQn 828w, https://miro.medium.com/v2/resize:fit:1100/0*cF6UE3y05YTyMBQn 1100w, https://miro.medium.com/v2/resize:fit:1400/0*cF6UE3y05YTyMBQn 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/><img alt="" class="bh mp os c" width="700" height="331" loading="lazy" role="presentation"/></picture></div></div></figure><h2 id="a79b" class="pz oy gu bf oz qa qb dy pc qc qd ea pf nr qe qf qg nv qh qi qj nz qk ql qm qn bk">Helping large, enterprise-scale applications deliver on mobile and the web</h2><ul class=""><li id="c43c" class="ni nj gu nk b hs pt nm nn hv pu np nq nr pv nt nu nv pw nx ny nz px ob oc od qo qp qq bk">In the United Kingdom, financial institution <a class="af oe" href="https://uk.virginmoney.com/" rel="noopener ugc nofollow" target="_blank">Virgin Money</a> is <a class="af oe" href="http://flutter.dev/showcase/virgin-money" rel="noopener ugc nofollow" target="_blank">using Flutter</a> across their suite of mobile banking and credit card apps to unify app development processes, speed up change, and enable an industry-leading user experience.</li><li id="e242" class="ni nj gu nk b hs qr nm nn hv qs np nq nr qt nt nu nv qu nx ny nz qv ob oc od qo qp qq bk">US insurance company <a class="af oe" href="https://www.geico.com/about/corporate/at-a-glance/" rel="noopener ugc nofollow" target="_blank">GEICO</a> recently <a class="af oe" href="https://www.geico.com/techblog/flutter-as-the-multi-channel-ux-framework/" rel="noopener ugc nofollow" target="_blank">shared</a> that Flutter helped them improve branded user experiences across iOS, Android, and the web, reduce the size of their codebase, and increase development efficiency, all at scale.</li><li id="aafc" class="ni nj gu nk b hs qr nm nn hv qs np nq nr qt nt nu nv qu nx ny nz qv ob oc od qo qp qq bk"><a class="af oe" href="https://corporate.universaldestinationsandexperiences.com/" rel="noopener ugc nofollow" target="_blank">Universal Studios Destinations &amp; Experiences</a> released new Flutter mobile apps for their Hollywood, Osaka, and Orlando parks. Watch the video below to learn why they chose Flutter and to see how it’s performing so far.</li></ul><figure class="oi oj ok ol om on"><div class="qw jq l fj"><div class="qx qy l"></div></div></figure><h2 id="a80c" class="pz oy gu bf oz qa qb dy pc qc qd ea pf nr qe qf qg nv qh qi qj nz qk ql qm qn bk">Going beyond mobile and the web</h2><ul class=""><li id="5493" class="ni nj gu nk b hs pt nm nn hv pu np nq nr pv nt nu nv pw nx ny nz px ob oc od qo qp qq bk">The <a class="af oe" href="https://canonical.com/" rel="noopener ugc nofollow" target="_blank">Canonical</a> team has been working with Flutter <a class="af oe" href="https://ubuntu.com/blog/flutter-and-ubuntu-so-far" rel="noopener ugc nofollow" target="_blank">since 2021</a> to enable support for the Flutter <a class="af oe" href="https://pub.dev/publishers/canonical.com/packages" rel="noopener ugc nofollow" target="_blank">ecosystem</a> in Ubuntu. Over the past year the Canonical team has rebuilt the Ubuntu Installer from the ground up with Flutter.</li><li id="8a48" class="ni nj gu nk b hs qr nm nn hv qs np nq nr qt nt nu nv qu nx ny nz qv ob oc od qo qp qq bk"><a class="af oe" href="https://www.lg.com/us" rel="noopener ugc nofollow" target="_blank">LG</a> has chosen Flutter to enhance their smart TV operating system, webOS. Flutter’s performance, productivity, and strong ecosystem allow LG to rapidly develop and deploy webOS system apps that run smoothly. By 2025, Flutter will power system apps on tens of millions of LG TVs worldwide.</li></ul><p id="8078" class="pw-post-body-paragraph ni nj gu nk b hs nl nm nn hv no np nq nr ns nt nu nv nw nx ny nz oa ob oc od gn bk">We’re inspired by these success stories, and are committed to making Flutter even better. Let’s dive into the latest product updates to show what we’re doing to enable you to build even more amazing apps, games, and experiences.</p><h1 id="f570" class="ox oy gu bf oz pa pb hu pc pd pe hx pf pg ph pi pj pk pl pm pn po pp pq pr ps bk">WebAssembly: Chasing native performance on the web</h1><p id="4545" class="pw-post-body-paragraph ni nj gu nk b hs pt nm nn hv pu np nq nr pv nt nu nv pw nx ny nz px ob oc od gn bk">Today we’re announcing support in our stable release for <a class="af oe" href="https://docs.flutter.dev/platform-integration/web/wasm" rel="noopener ugc nofollow" target="_blank">compiling</a> Flutter web apps to WebAssembly (Wasm). This is an exciting new instruction format for web browsers, which provides a portable, platform neutral, binary code format.</p><p id="6c61" class="pw-post-body-paragraph ni nj gu nk b hs nl nm nn hv no np nq nr ns nt nu nv nw nx ny nz oa ob oc od gn bk">Our support for Wasm has been a deep, multi-year investment. First we partnered with the Chrome team on defining support in WebAssembly for high-level, managed languages like Dart, which commonly use garbage collection. This resulted in the <a class="af oe" href="https://developer.chrome.com/blog/wasmgc/" rel="noopener ugc nofollow" target="_blank">WasmGC</a> <a class="af oe" href="https://github.com/WebAssembly/gc/blob/main/proposals/gc/Overview.md" rel="noopener ugc nofollow" target="_blank">proposal</a>, which is now a full and finalized standard, with runtime implementations available in Chrome (Chromium 119 and later) and Firefox (120 and later), and with other browser vendors expected to follow. Next, we added a brand new Dart compiler backend to generate WasmGC code, and the Dart &amp; Flutter teams collaborated to run both the compiled app code and the Flutter rendering engine as Wasm modules with efficient Wasm to Wasm interop.</p><p id="3caa" class="pw-post-body-paragraph ni nj gu nk b hs nl nm nn hv no np nq nr ns nt nu nv nw nx ny nz oa ob oc od gn bk">So what’s the net result? We’re seeing much improved performance, approaching what we have on mobile and desktop devices running machine code. In our internal benchmarks (in Chrome on an M1 MacBook), the frame rendering time of <a class="af oe" href="https://flutter.gskinner.com/wonderous/" rel="noopener ugc nofollow" target="_blank">Wonderous</a> improved by 2x in the general case and by 3x for the 99% worst case performance. Improved rendering performance is critical in demanding apps that feature animations and rich transitions, where exceeding the frame budget (the time allocated to render the next frame) causes very visible jank. Wasm has the potential to eliminate that, as illustrated by the juxtaposition below of the Wonderous app running with our traditional JS compilation compared to Wasm compilation.</p><figure class="oi oj ok ol om on of og paragraph-image"><div role="button" tabindex="0" class="oo op fj oq bh or"><div class="of og qz"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*ebpdPSPlak3EwoAU 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*ebpdPSPlak3EwoAU 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*ebpdPSPlak3EwoAU 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*ebpdPSPlak3EwoAU 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*ebpdPSPlak3EwoAU 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*ebpdPSPlak3EwoAU 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*ebpdPSPlak3EwoAU 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/0*ebpdPSPlak3EwoAU 640w, https://miro.medium.com/v2/resize:fit:720/0*ebpdPSPlak3EwoAU 720w, https://miro.medium.com/v2/resize:fit:750/0*ebpdPSPlak3EwoAU 750w, https://miro.medium.com/v2/resize:fit:786/0*ebpdPSPlak3EwoAU 786w, https://miro.medium.com/v2/resize:fit:828/0*ebpdPSPlak3EwoAU 828w, https://miro.medium.com/v2/resize:fit:1100/0*ebpdPSPlak3EwoAU 1100w, https://miro.medium.com/v2/resize:fit:1400/0*ebpdPSPlak3EwoAU 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/><img alt="" class="bh mp os c" width="700" height="362" loading="lazy" role="presentation"/></picture></div></div><figcaption class="ra ff rb of og rc rd bf b bg z du"><em class="ih">Comparing the rendering speed of Javascript vs Wasm for the </em><a class="af oe" href="https://flutter.gskinner.com/wonderous/" rel="noopener ugc nofollow" target="_blank"><em class="ih">Wonderous</em></a><em class="ih"> demo application.</em></figcaption></figure><p id="9224" class="pw-post-body-paragraph ni nj gu nk b hs nl nm nn hv no np nq nr ns nt nu nv nw nx ny nz oa ob oc od gn bk">Wasm compilation for Flutter web apps is available in stable today. To get started, check out our <a class="af oe" href="https://dart.dev/web/wasm" rel="noopener ugc nofollow" target="_blank">Dart Wasm documentation</a> and <a class="af oe" href="https://docs.flutter.dev/platform-integration/web/wasm" rel="noopener ugc nofollow" target="_blank">Flutter Wasm documentation</a>.</p><h1 id="a366" class="ox oy gu bf oz pa pb hu pc pd pe hx pf pg ph pi pj pk pl pm pn po pp pq pr ps bk">Dart macros: raising the development abstraction level</h1><p id="ba35" class="pw-post-body-paragraph ni nj gu nk b hs pt nm nn hv pu np nq nr pv nt nu nv pw nx ny nz px ob oc od gn bk">We’re committed to providing a best-in-class developer experience. That means tackling long standing pain-points for Dart developers, like serializing JSON data.</p><p id="a627" class="pw-post-body-paragraph ni nj gu nk b hs nl nm nn hv no np nq nr ns nt nu nv nw nx ny nz oa ob oc od gn bk">It’s a prevalent pattern that’s equal parts trivial and tedious. Current solutions mean either slogging through encoding and decoding boilerplate manually, or layering on extra tooling in the form of code generation solutions like the <a class="af oe" href="https://docs.flutter.dev/data-and-backend/serialization/json#serializing-json-using-code-generation-libraries" rel="noopener ugc nofollow" target="_blank">JsonSerializable</a> package.</p><p id="d7e0" class="pw-post-body-paragraph ni nj gu nk b hs nl nm nn hv no np nq nr ns nt nu nv nw nx ny nz oa ob oc od gn bk">Today, we’re announcing a preview of a better option for JSON: the <a class="af oe" href="https://dart.dev/go/json-codable" rel="noopener ugc nofollow" target="_blank">JsonCodable</a> macro.</p><p id="ce6a" class="pw-post-body-paragraph ni nj gu nk b hs nl nm nn hv no np nq nr ns nt nu nv nw nx ny nz oa ob oc od gn bk">Macros are code that creates more code. They’re like code generation, except the macro system is <em class="re">built into Dart</em> and happens <em class="re">in real-time</em> as you are editing and running the code. It’s an integrated experience without delays, fully supporting our existing developer workflows such as hot reload, as illustrated by this screencast:</p><figure class="oi oj ok ol om on of og paragraph-image"><div role="button" tabindex="0" class="oo op fj oq bh or"><div class="of og rf"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*rWeEWxzBvcmOFNM4 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*rWeEWxzBvcmOFNM4 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*rWeEWxzBvcmOFNM4 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*rWeEWxzBvcmOFNM4 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*rWeEWxzBvcmOFNM4 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*rWeEWxzBvcmOFNM4 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*rWeEWxzBvcmOFNM4 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/0*rWeEWxzBvcmOFNM4 640w, https://miro.medium.com/v2/resize:fit:720/0*rWeEWxzBvcmOFNM4 720w, https://miro.medium.com/v2/resize:fit:750/0*rWeEWxzBvcmOFNM4 750w, https://miro.medium.com/v2/resize:fit:786/0*rWeEWxzBvcmOFNM4 786w, https://miro.medium.com/v2/resize:fit:828/0*rWeEWxzBvcmOFNM4 828w, https://miro.medium.com/v2/resize:fit:1100/0*rWeEWxzBvcmOFNM4 1100w, https://miro.medium.com/v2/resize:fit:1400/0*rWeEWxzBvcmOFNM4 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/><img alt="" class="bh mp os c" width="700" height="388" loading="lazy" role="presentation"/></picture></div></div><figcaption class="ra ff rb of og rc rd bf b bg z du"><em class="ih">Screencast showing the experience of using a macro: Initially no toJson code completion exists, but after adding @JsonCodable to the class, the toJson code completion shows up immediately.</em></figcaption></figure><p id="2eb1" class="pw-post-body-paragraph ni nj gu nk b hs nl nm nn hv no np nq nr ns nt nu nv nw nx ny nz oa ob oc od gn bk">We’re excited to see macros solve all kinds of problems for our developers. Take, for example, data classes, the <a class="af oe" href="https://github.com/dart-lang/language/issues?q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc" rel="noopener ugc nofollow" target="_blank">highest voted</a> Dart language feature. Beyond specific applications, our eventual goal is to have a macro system in Dart that allows users to create their own macros and raise the abstraction level of Dart programming.</p><p id="d635" class="pw-post-body-paragraph ni nj gu nk b hs nl nm nn hv no np nq nr ns nt nu nv nw nx ny nz oa ob oc od gn bk">Designing and implementing such a powerful macro system is a large task, so there is currently no date set for a stable release — for more details check out the <a class="af oe" rel="noopener" href="/dartlang/dart-3-4-bd8d23b4462a">Dart 3.4 post</a>. In the meantime, try out a preview of the <code class="cx ot ou ov ow b">JsonCodable</code> macro today. For more information, check out<a class="af oe" href="http://dart.dev/go/json-codable" rel="noopener ugc nofollow" target="_blank"> macros documentation</a>.</p><h1 id="0ed9" class="ox oy gu bf oz pa pb hu pc pd pe hx pf pg ph pi pj pk pl pm pn po pp pq pr ps bk">New resources for Flutter game development</h1><figure class="oi oj ok ol om on of og paragraph-image"><div role="button" tabindex="0" class="oo op fj oq bh or"><div class="of og rg"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*F19xflZ4BfoCekFQ 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*F19xflZ4BfoCekFQ 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*F19xflZ4BfoCekFQ 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*F19xflZ4BfoCekFQ 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*F19xflZ4BfoCekFQ 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*F19xflZ4BfoCekFQ 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*F19xflZ4BfoCekFQ 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/0*F19xflZ4BfoCekFQ 640w, https://miro.medium.com/v2/resize:fit:720/0*F19xflZ4BfoCekFQ 720w, https://miro.medium.com/v2/resize:fit:750/0*F19xflZ4BfoCekFQ 750w, https://miro.medium.com/v2/resize:fit:786/0*F19xflZ4BfoCekFQ 786w, https://miro.medium.com/v2/resize:fit:828/0*F19xflZ4BfoCekFQ 828w, https://miro.medium.com/v2/resize:fit:1100/0*F19xflZ4BfoCekFQ 1100w, https://miro.medium.com/v2/resize:fit:1400/0*F19xflZ4BfoCekFQ 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/><img alt="" class="bh mp os c" width="700" height="395" loading="lazy" role="presentation"/></picture></div></div></figure><p id="d638" class="pw-post-body-paragraph ni nj gu nk b hs nl nm nn hv no np nq nr ns nt nu nv nw nx ny nz oa ob oc od gn bk">We’re seeing promising results from our early investment in games, including success stories from industry leaders like <a class="af oe" href="http://flutter.dev/showcase/etermax" rel="noopener ugc nofollow" target="_blank">Etermax</a> and <a class="af oe" href="http://flutter.dev/showcase/supercell" rel="noopener ugc nofollow" target="_blank">Supercell</a>, who are each leveraging Flutter’s power and flexibility to efficiently deliver delightful user experiences and expand their reach.</p><p id="0fdb" class="pw-post-body-paragraph ni nj gu nk b hs nl nm nn hv no np nq nr ns nt nu nv nw nx ny nz oa ob oc od gn bk">Today, we’re excited to continue to build on that momentum with these new resources for Flutter game developers:</p><ul class=""><li id="a167" class="ni nj gu nk b hs nl nm nn hv no np nq nr ns nt nu nv nw nx ny nz oa ob oc od qo qp qq bk">The <a class="af oe" href="https://pub.dev/packages/flutter_soloud" rel="noopener ugc nofollow" target="_blank">SoLoud audio engine</a> is now available: We’ve collaborated with the Flutter community (@<a class="af oe" href="https://github.com/alnitak" rel="noopener ugc nofollow" target="_blank">Marco Bavagnoli</a>) to create a free and portable audio engine that delivers low-latency, high-performance sound, essential for many games. We also created a new <a class="af oe" href="https://codelabs.developers.google.com/codelabs/flutter-codelab-soloud#0" rel="noopener ugc nofollow" target="_blank">sound and music codelab</a> that uses SoLoud.</li><li id="80ce" class="ni nj gu nk b hs qr nm nn hv qs np nq nr qt nt nu nv qu nx ny nz qv ob oc od qo qp qq bk">Learn how to <a class="af oe" href="https://codelabs.developers.google.com/codelabs/flutter-word-puzzle#0" rel="noopener ugc nofollow" target="_blank">generate expansive crossword-style grids</a> of interlocking words without compromising the user experience, and <a class="af oe" href="https://codelabs.developers.google.com/codelabs/flutter-flame-forge2d#0" rel="noopener ugc nofollow" target="_blank">craft game mechanics in a Flutter and Flame game using a 2D physics simulation</a> along the lines of Box2D called <a class="af oe" href="https://pub.dev/packages/forge2d" rel="noopener ugc nofollow" target="_blank">Forge2D</a>.</li><li id="4941" class="ni nj gu nk b hs qr nm nn hv qs np nq nr qt nt nu nv qu nx ny nz qv ob oc od qo qp qq bk">A new guide for <a class="af oe" rel="noopener" href="/flutter/best-practices-for-optimizing-flutter-web-loading-speed-7cc0df14ce5c">optimizing Flutter web-based game loading speed</a>: Long load times are a major deterrent in web-based games. Follow this guide (authored by <a class="af oe" href="https://twitter.com/chenglinlim" rel="noopener ugc nofollow" target="_blank">Cheng Lin</a>) to optimize your loading speed so that players don’t abandon your game because it loads slowly.</li></ul><h1 id="c02a" class="ox oy gu bf oz pa pb hu pc pd pe hx pf pg ph pi pj pk pl pm pn po pp pq pr ps bk">Empowering sustainable game development</h1><p id="d42e" class="pw-post-body-paragraph ni nj gu nk b hs pt nm nn hv pu np nq nr pv nt nu nv pw nx ny nz px ob oc od gn bk">In January 2024, inspired by the <a class="af oe" href="https://www.youtube.com/watch?v=qgOlg173gcI&amp;pp=ygUWR2xvYmFsIENpdGl6ZW4gRmx1dHRlcg%3D%3D" rel="noopener ugc nofollow" target="_blank">story</a> behind their use of Flutter, we partnered with Global Citizen to challenge our communities to design, build, and publish sustainability games using Flutter. These games are meant to inspire and empower players to take small, but meaningful actions for the environment. Today, we’re announcing <a class="af oe" rel="noopener" href="/flutter/announcing-the-winners-of-the-global-gamers-challenge-1ccf4d271226">the 10 winners</a>.</p><figure class="oi oj ok ol om on"><div class="qw jq l fj"><div class="qx qy l"></div></div></figure><p id="f64a" class="pw-post-body-paragraph ni nj gu nk b hs nl nm nn hv no np nq nr ns nt nu nv nw nx ny nz oa ob oc od gn bk">Congrats to all of the winners!</p><h1 id="f9a5" class="ox oy gu bf oz pa pb hu pc pd pe hx pf pg ph pi pj pk pl pm pn po pp pq pr ps bk">Much more to explore</h1><p id="b279" class="pw-post-body-paragraph ni nj gu nk b hs pt nm nn hv pu np nq nr pv nt nu nv pw nx ny nz px ob oc od gn bk">That’s all we have time to spotlight today, but there are many more exciting improvements that we didn’t touch on. Here are a few more things to know:</p><ul class=""><li id="27c5" class="ni nj gu nk b hs nl nm nn hv no np nq nr ns nt nu nv nw nx ny nz oa ob oc od qo qp qq bk">You can<strong class="nk gv"> </strong>preview<strong class="nk gv"> </strong><a class="af oe" href="https://firebase.google.com/docs/vertex-ai/get-started?platform=flutter" rel="noopener ugc nofollow" target="_blank"><strong class="nk gv">the Vertex AI for Firebase Dart SDK</strong></a> to use the Gemini API for AI-driven features in a Dart or Flutter app. The SDK is integrated with Firebase App Check, which protects your API calls, and safeguards your backend infrastructure from serious threats like billing fraud, phishing, and app impersonation. For details, see our <a class="af oe" href="http://flutter.dev/ai" rel="noopener ugc nofollow" target="_blank">AI page</a>.</li><li id="2801" class="ni nj gu nk b hs qr nm nn hv qs np nq nr qt nt nu nv qu nx ny nz qv ob oc od qo qp qq bk"><strong class="nk gv">Impeller</strong>, our <a class="af oe" href="https://docs.flutter.dev/perf/impeller" rel="noopener ugc nofollow" target="_blank">next-gen rendering engine</a>, is now feature complete on Android.</li><li id="0061" class="ni nj gu nk b hs qr nm nn hv qs np nq nr qt nt nu nv qu nx ny nz qv ob oc od qo qp qq bk"><strong class="nk gv">Android’s </strong><a class="af oe" href="https://developer.android.com/guide/navigation/custom-back/predictive-back-gesture" rel="noopener ugc nofollow" target="_blank"><strong class="nk gv">predictive back</strong></a> gesture is now supported both when navigating within a Flutter app, and when navigating to another app or to the homescreen.</li><li id="2404" class="ni nj gu nk b hs qr nm nn hv qs np nq nr qt nt nu nv qu nx ny nz qv ob oc od qo qp qq bk"><strong class="nk gv">Platform views</strong> on iOS have been performance optimized, reducing CPU usage by up to 50%.</li><li id="2b70" class="ni nj gu nk b hs qr nm nn hv qs np nq nr qt nt nu nv qu nx ny nz qv ob oc od qo qp qq bk">The <strong class="nk gv">Google Mobile Ads SDK</strong> has been extended to support more ad partners and mediation options.</li><li id="a495" class="ni nj gu nk b hs qr nm nn hv qs np nq nr qt nt nu nv qu nx ny nz qv ob oc od qo qp qq bk">DevTools has a new <strong class="nk gv">deep link validator</strong> that helps you identify and troubleshoot errors in Android deep link configuration, so you can more easily connect web experiences to a Flutter app.</li><li id="35fd" class="ni nj gu nk b hs qr nm nn hv qs np nq nr qt nt nu nv qu nx ny nz qv ob oc od qo qp qq bk"><strong class="nk gv">Dart fix</strong>, our API migration tool, can now be invoked directly from the IDE.</li><li id="b651" class="ni nj gu nk b hs qr nm nn hv qs np nq nr qt nt nu nv qu nx ny nz qv ob oc od qo qp qq bk"><strong class="nk gv">DevTools</strong> now supports advanced filtering and CPU samples in the timeline.</li></ul><p id="2af0" class="pw-post-body-paragraph ni nj gu nk b hs nl nm nn hv no np nq nr ns nt nu nv nw nx ny nz oa ob oc od gn bk">Head over to the <a class="af oe" rel="noopener" href="/flutter/fbde6c164fe3">Flutter technical post</a> and the <a class="af oe" rel="noopener" href="/dartlang/dart-3-4-bd8d23b4462a">Dart 3.4 post</a> for more details on each of these, and more.</p><p id="5050" class="pw-post-body-paragraph ni nj gu nk b hs nl nm nn hv no np nq nr ns nt nu nv nw nx ny nz oa ob oc od gn bk">As always, we’re incredibly grateful for your continued support, passion, enthusiasm, and feedback. This project wouldn’t be possible without you, and we can’t wait to see how you continue to push Flutter forward.</p><p id="abf4" class="pw-post-body-paragraph ni nj gu nk b hs nl nm nn hv no np nq nr ns nt nu nv nw nx ny nz oa ob oc od gn bk">Flutter over and out. We hope to see you on board again soon!</p></div></div></div></div></section></div></div></article></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="rh ri ab jn"><div class="rj ab"><a class="rk ay am ao" rel="noopener follow" href="/tag/announcements?source=post_page-----5e211f708a37---------------------------------------"><div class="rl fj cx rm ge rn ro bf b bg z bk rp">Announcements</div></a></div><div class="rj ab"><a class="rk ay am ao" rel="noopener follow" href="/tag/flutter?source=post_page-----5e211f708a37---------------------------------------"><div class="rl fj cx rm ge rn ro bf b bg z bk rp">Flutter</div></a></div><div class="rj ab"><a class="rk ay am ao" rel="noopener follow" href="/tag/releases?source=post_page-----5e211f708a37---------------------------------------"><div class="rl fj cx rm ge rn ro bf b bg z bk rp">Releases</div></a></div></div></div></div><div class="l"></div><footer class="rq rr rs rt ru ab q rv ix c"><div class="l ae"><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ab cp rw"><div class="ab q lg"><div class="rx l"><span class="l ry rz sa e d"><div class="ab q lg lh"><div class="pw-multi-vote-icon fj jp li lj lk"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerClapButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Fflutter%2F5e211f708a37&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fio24-5e211f708a37&amp;user=Michael+Thomsen&amp;userId=a6d788faa5e5&amp;source=---footer_actions--5e211f708a37---------------------clap_footer------------------"><div><div class="bm" aria-hidden="false"><div class="ll ao lm ln lo lp am lq lr ls lk"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l lt lu lv lw lx ly lz"><p class="bf b dv z du"><span class="ma">--</span></p></div></div></span><span class="l h g f sb sc"><div class="ab q lg lh"><div class="pw-multi-vote-icon fj jp li lj lk"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerClapButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Fflutter%2F5e211f708a37&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fio24-5e211f708a37&amp;user=Michael+Thomsen&amp;userId=a6d788faa5e5&amp;source=---footer_actions--5e211f708a37---------------------clap_footer------------------"><div><div class="bm" aria-hidden="false"><div class="ll ao lm ln lo lp am lq lr ls lk"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l lt lu lv lw lx ly lz"><p class="bf b dv z du"><span class="ma">--</span></p></div></div></span></div><div class="bq ab"><div><div class="bm" aria-hidden="false"><button class="ao ll md me ab q fk mf mg" aria-label="responses"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" class="mc"><path d="M18.006 16.803c1.533-1.456 2.234-3.325 2.234-5.321C20.24 7.357 16.709 4 12.191 4S4 7.357 4 11.482c0 4.126 3.674 7.482 8.191 7.482.817 0 1.622-.111 2.393-.327.231.2.48.391.744.559 1.06.693 2.203 1.044 3.399 1.044.224-.008.4-.112.486-.287a.49.49 0 0 0-.042-.518c-.495-.67-.845-1.364-1.04-2.057a4 4 0 0 1-.125-.598zm-3.122 1.055-.067-.223-.315.096a8 8 0 0 1-2.311.338c-4.023 0-7.292-2.955-7.292-6.587 0-3.633 3.269-6.588 7.292-6.588 4.014 0 7.112 2.958 7.112 6.593 0 1.794-.608 3.469-2.027 4.72l-.195.168v.255c0 .056 0 .151.016.295.025.231.081.478.154.733.154.558.398 1.117.722 1.659a5.3 5.3 0 0 1-2.165-.845c-.276-.176-.714-.383-.941-.59z"></path></svg><p class="bf b bg z du"><span class="pw-responses-count mb mc">10</span></p></button></div></div></div></div><div class="ab q"><div class="sd l jk"><div><div class="bm" aria-hidden="false"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerBookmarkButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fbookmark%2Fp%2F5e211f708a37&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fio24-5e211f708a37&amp;source=---footer_actions--5e211f708a37---------------------bookmark_footer------------------"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" fill="none" viewBox="0 0 25 25" class="du mi" aria-label="Add to list bookmark button"><path fill="currentColor" d="M18 2.5a.5.5 0 0 1 1 0V5h2.5a.5.5 0 0 1 0 1H19v2.5a.5.5 0 1 1-1 0V6h-2.5a.5.5 0 0 1 0-1H18zM7 7a1 1 0 0 1 1-1h3.5a.5.5 0 0 0 0-1H8a2 2 0 0 0-2 2v14a.5.5 0 0 0 .805.396L12.5 17l5.695 4.396A.5.5 0 0 0 19 21v-8.5a.5.5 0 0 0-1 0v7.485l-5.195-4.012a.5.5 0 0 0-.61 0L7 19.985z"></path></svg></a></span></div></div></div><div class="sd l jk"><div class="bm" aria-hidden="false" aria-describedby="postFooterSocialMenu" aria-labelledby="postFooterSocialMenu"><div><div class="bm" aria-hidden="false"><button aria-controls="postFooterSocialMenu" aria-expanded="false" aria-label="Share Post" data-testid="footerSocialShareButton" class="af fk ah ai aj ak al mq an ao ap ex mr ms mg mt"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M15.218 4.931a.4.4 0 0 1-.118.132l.012.006a.45.45 0 0 1-.292.074.5.5 0 0 1-.3-.13l-2.02-2.02v7.07c0 .28-.23.5-.5.5s-.5-.22-.5-.5v-7.04l-2 2a.45.45 0 0 1-.57.04h-.02a.4.4 0 0 1-.16-.3.4.4 0 0 1 .1-.32l2.8-2.8a.5.5 0 0 1 .7 0l2.8 2.79a.42.42 0 0 1 .068.498m-.106.138.008.004v-.01zM16 7.063h1.5a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-11c-1.1 0-2-.9-2-2v-10a2 2 0 0 1 2-2H8a.5.5 0 0 1 .35.15.5.5 0 0 1 .15.35.5.5 0 0 1-.15.35.5.5 0 0 1-.35.15H6.4c-.5 0-.9.4-.9.9v10.2a.9.9 0 0 0 .9.9h11.2c.5 0 .9-.4.9-.9v-10.2c0-.5-.4-.9-.9-.9H16a.5.5 0 0 1 0-1" clip-rule="evenodd"></path></svg></button></div></div></div></div></div></div></div></div></div></footer><div class="se l"><div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="sf l"><div class="ab sg sh si jm jl"><div class="sj sk sl sm sn so sp sq sr ss ab cp"><div class="h k"><a href="https://medium.com/flutter?source=post_page---post_publication_info--5e211f708a37---------------------------------------" rel="noopener follow"><div class="fj ab"><img alt="Flutter" class="st io ip cx" src="https://miro.medium.com/v2/resize:fill:96:96/1*5-aoK8IBmXve5whBQM90GA.png" width="48" height="48" loading="lazy"/><div class="st l ip io fs n fr su"></div></div></a></div><div class="j i d"><a href="https://medium.com/flutter?source=post_page---post_publication_info--5e211f708a37---------------------------------------" rel="noopener follow"><div class="fj ab"><img alt="Flutter" class="st sw sv cx" src="https://miro.medium.com/v2/resize:fill:128:128/1*5-aoK8IBmXve5whBQM90GA.png" width="64" height="64" loading="lazy"/><div class="st l sv sw fs n fr su"></div></div></a></div><div class="j i d sx jk"><div class="ab"></div></div></div><div class="ab co sy"><div class="sz ta tb tc td l"><a class="af ag ah aj ak al am an ao ap aq ar as at ab q" href="https://medium.com/flutter?source=post_page---post_publication_info--5e211f708a37---------------------------------------" rel="noopener follow"><h2 class="pw-author-name bf tf tg th ti tj tk tl nr qf qg nv qi qj nz ql qm bk"><span class="gn te">Published in <!-- -->Flutter</span></h2></a><div class="rj ab in"><div class="l jk"><span class="pw-follower-count bf b bg z du"><a class="af ag ah ai aj ak al am an ao ap aq ar jd" rel="noopener follow" href="/flutter/followers?source=post_page---post_publication_info--5e211f708a37---------------------------------------">59K Followers</a></span></div><div class="bf b bg z du ab jo"><span class="je l" aria-hidden="true"><span class="bf b bg z du">·</span></span><a class="af ag ah ai aj ak al am an ao ap aq ar jd" rel="noopener follow" href="/flutter/whats-new-in-flutter-3-29-f90c380c2317?source=post_page---post_publication_info--5e211f708a37---------------------------------------">Last published <!-- -->5 days ago</a></div></div><div class="tm l"><p class="bf b bg z bk">Flutter is Google&#x27;s UI framework for crafting high-quality native interfaces on iOS, Android, web, and desktop. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source. Learn more at <a class="af ag ah ai aj ak al am an ao ap aq ar oe go" href="https://flutter.dev" rel="noopener ugc nofollow">https://flutter.dev</a></p></div></div></div><div class="h k"><div class="ab"></div></div></div></div><div class="ab sg sh si jm jl"><div class="sj sk sl sm sn so sp sq sr ss ab cp"><div class="h k"><a tabindex="0" rel="noopener follow" href="/@mit.mit?source=post_page---post_author_info--5e211f708a37---------------------------------------"><div class="l fj"><img alt="Michael Thomsen" class="l fd by ip io cx" src="https://miro.medium.com/v2/resize:fill:96:96/0*Y_CFLc1qadgr3tPK." width="48" height="48" loading="lazy"/><div class="fr by l ip io fs n ay su"></div></div></a></div><div class="j i d"><a tabindex="0" rel="noopener follow" href="/@mit.mit?source=post_page---post_author_info--5e211f708a37---------------------------------------"><div class="l fj"><img alt="Michael Thomsen" class="l fd by sv sw cx" src="https://miro.medium.com/v2/resize:fill:128:128/0*Y_CFLc1qadgr3tPK." width="64" height="64" loading="lazy"/><div class="fr by l sv sw fs n ay su"></div></div></a></div><div class="j i d sx jk"><div class="ab"><span><button class="bf b bg z tn rl to tp tq tr ts ev ew tt tu tv fa fb fc fd bm fe ff">Follow</button></span></div></div></div><div class="ab co sy"><div class="sz ta tb tc td l"><a class="af ag ah aj ak al am an ao ap aq ar as at ab q" rel="noopener follow" href="/@mit.mit?source=post_page---post_author_info--5e211f708a37---------------------------------------"><h2 class="pw-author-name bf tf tg th ti tj tk tl nr qf qg nv qi qj nz ql qm bk"><span class="gn te">Written by <!-- -->Michael Thomsen</span></h2></a><div class="rj ab in"><div class="l jk"><span class="pw-follower-count bf b bg z du"><a class="af ag ah ai aj ak al am an ao ap aq ar jd" rel="noopener follow" href="/@mit.mit/followers?source=post_page---post_author_info--5e211f708a37---------------------------------------">9.2K Followers</a></span></div><div class="bf b bg z du ab jo"><span class="je l" aria-hidden="true"><span class="bf b bg z du">·</span></span><a class="af ag ah ai aj ak al am an ao ap aq ar jd" rel="noopener follow" href="/@mit.mit/following?source=post_page---post_author_info--5e211f708a37---------------------------------------">4 Following</a></div></div><div class="tm l"><p class="bf b bg z bk"><span class="gn">Product Manager working on Dart and Flutter. Helping developers is my passion!</span></p></div></div></div><div class="h k"><div class="ab"><span><button class="bf b bg z tn rl to tp tq tr ts ev ew tt tu tv fa fb fc fd bm fe ff">Follow</button></span></div></div></div></div></div></div></div><div class="tw tx ty tz ua l"><div class="ub bh r se"></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ab q cp"><h2 class="bf tf pa hu pc pd hx pf pg pi pj pk pm pn po pq pr bk">Responses (<!-- -->10<!-- -->)</h2><div class="ab uc"><div><div class="bm" aria-hidden="false"><a class="ud ue" href="https://policy.medium.com/medium-rules-30e5502c4eb4?source=post_page---post_responses--5e211f708a37---------------------------------------" rel="noopener follow" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" viewBox="0 0 25 25"><path fill-rule="evenodd" d="M11.987 5.036a.754.754 0 0 1 .914-.01c.972.721 1.767 1.218 2.6 1.543.828.322 1.719.485 2.887.505a.755.755 0 0 1 .741.757c-.018 3.623-.43 6.256-1.449 8.21-1.034 1.984-2.662 3.209-4.966 4.083a.75.75 0 0 1-.537-.003c-2.243-.874-3.858-2.095-4.897-4.074-1.024-1.951-1.457-4.583-1.476-8.216a.755.755 0 0 1 .741-.757c1.195-.02 2.1-.182 2.923-.503.827-.322 1.6-.815 2.519-1.535m.468.903c-.897.69-1.717 1.21-2.623 1.564-.898.35-1.856.527-3.026.565.037 3.45.469 5.817 1.36 7.515.884 1.684 2.25 2.762 4.284 3.571 2.092-.81 3.465-1.89 4.344-3.575.886-1.698 1.299-4.065 1.334-7.512-1.149-.039-2.091-.217-2.99-.567-.906-.353-1.745-.873-2.683-1.561m-.009 9.155a2.672 2.672 0 1 0 0-5.344 2.672 2.672 0 0 0 0 5.344m0 1a3.672 3.672 0 1 0 0-7.344 3.672 3.672 0 0 0 0 7.344m-1.813-3.777.525-.526.916.917 1.623-1.625.526.526-2.149 2.152z" clip-rule="evenodd"></path></svg></a></div></div></div></div><div class="uf ug uh ui uj uk ul l"></div><div class="um l"><button class="bf b bg z bk rl un uo up mi mf ts ev ew ex uq ur us fa ut uu uv uw ux fb fc fd bm fe ff">See all responses</button></div></div></div></div><div class="uy uz va vb vc l bx"><div class="h k j"><div class="ub bh vd ve"></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="vf ab lg jn"><div class="vg vh l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://help.medium.com/hc/en-us?source=post_page-----5e211f708a37---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Help</p></a></div><div class="vg vh l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://medium.statuspage.io/?source=post_page-----5e211f708a37---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Status</p></a></div><div class="vg vh l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" rel="noopener follow" href="/about?autoplay=1&amp;source=post_page-----5e211f708a37---------------------------------------"><p class="bf b dv z du">About</p></a></div><div class="vg vh l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" rel="noopener follow" href="/jobs-at-medium/work-at-medium-959d1a85284e?source=post_page-----5e211f708a37---------------------------------------"><p class="bf b dv z du">Careers</p></a></div><div class="vg vh l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="mailto:pressinquiries@medium.com" rel="noopener follow"><p class="bf b dv z du">Press</p></a></div><div class="vg vh l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://blog.medium.com/?source=post_page-----5e211f708a37---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Blog</p></a></div><div class="vg vh l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://policy.medium.com/medium-privacy-policy-f03bf92035c9?source=post_page-----5e211f708a37---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Privacy</p></a></div><div class="vg vh l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://policy.medium.com/medium-terms-of-service-9db0094a1e0f?source=post_page-----5e211f708a37---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Terms</p></a></div><div class="vg vh l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://speechify.com/medium?source=post_page-----5e211f708a37---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Text to speech</p></a></div><div class="vg l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" rel="noopener follow" href="/business?source=post_page-----5e211f708a37---------------------------------------"><p class="bf b dv z du">Teams</p></a></div></div></div></div></div></div></div></div></div></div><script>window.__BUILD_ID__="main-20250217-152844-ca206ec2ba"</script><script>window.__GRAPHQL_URI__ = "https://medium.com/_/graphql"</script><script>window.__PRELOADED_STATE__ = {"algolia":{"queries":{}},"cache":{"experimentGroupSet":true,"reason":"","group":"enabled","tags":["group-edgeCachePosts","post-5e211f708a37","user-a6d788faa5e5","collection-4da7dfd21a33"],"serverVariantState":"44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a","middlewareEnabled":true,"cacheStatus":"DYNAMIC","shouldUseCache":true,"vary":[],"pubFeaturingPostPageLabelEnabled":false},"client":{"hydrated":false,"isUs":false,"isNativeMedium":false,"isSafariMobile":false,"isSafari":false,"isFirefox":false,"routingEntity":{"type":"DEFAULT","explicit":false},"viewerIsBot":false},"debug":{"requestId":"61d34078-f12f-4c41-8df8-03aa826e68b2","requestTag":"","hybridDevServices":[],"originalSpanCarrier":{"traceparent":"00-33892bf2f8061341af891075b12bc362-b26705631ddef620-01"}},"multiVote":{"clapsPerPost":{}},"navigation":{"branch":{"show":null,"hasRendered":null,"blockedByCTA":false},"hideGoogleOneTap":false,"hasRenderedAlternateUserBanner":null,"currentLocation":"https:\u002F\u002Fmedium.com\u002Fflutter\u002Fio24-5e211f708a37","host":"medium.com","hostname":"medium.com","referrer":"","hasSetReferrer":false,"susiModal":{"step":null,"operation":"register"},"postRead":false,"partnerProgram":{"selectedCountryCode":null},"queryString":"","currentHash":""},"config":{"nodeEnv":"production","version":"main-20250217-152844-ca206ec2ba","target":"production","productName":"Medium","publicUrl":"https:\u002F\u002Fcdn-client.medium.com\u002Flite","authDomain":"medium.com","authGoogleClientId":"216296035834-k1k6qe060s2tp2a2jam4ljdcms00sttg.apps.googleusercontent.com","favicon":"production","glyphUrl":"https:\u002F\u002Fglyph.medium.com","branchKey":"key_live_ofxXr2qTrrU9NqURK8ZwEhknBxiI6KBm","algolia":{"appId":"MQ57UUUQZ2","apiKeySearch":"394474ced050e3911ae2249ecc774921","indexPrefix":"medium_","host":"-dsn.algolia.net"},"recaptchaKey":"6Lfc37IUAAAAAKGGtC6rLS13R1Hrw_BqADfS1LRk","recaptcha3Key":"6Lf8R9wUAAAAABMI_85Wb8melS7Zj6ziuf99Yot5","recaptchaEnterpriseKeyId":"6Le-uGgpAAAAAPprRaokM8AKthQ9KNGdoxaGUvVp","datadog":{"applicationId":"6702d87d-a7e0-42fe-bbcb-95b469547ea0","clientToken":"pub853ea8d17ad6821d9f8f11861d23dfed","rumToken":"pubf9cc52896502b9413b68ba36fc0c7162","context":{"deployment":{"target":"production","tag":"main-20250217-152844-ca206ec2ba","commit":"ca206ec2ba708507b1bef4ec007a67163085196c"}},"datacenter":"us"},"googleAnalyticsCode":"G-7JY7T788PK","googlePay":{"apiVersion":"2","apiVersionMinor":"0","merchantId":"BCR2DN6TV7EMTGBM","merchantName":"Medium","instanceMerchantId":"13685562959212738550"},"applePay":{"version":3},"signInWallCustomDomainCollectionIds":["3a8144eabfe3","336d898217ee","61061eb0c96b","138adf9c44c","819cc2aaeee0"],"mediumMastodonDomainName":"me.dm","mediumOwnedAndOperatedCollectionIds":["8a9336e5bb4","b7e45b22fec3","193b68bd4fba","8d6b8a439e32","54c98c43354d","3f6ecf56618","d944778ce714","92d2092dc598","ae2a65f35510","1285ba81cada","544c7006046e","fc8964313712","40187e704f1c","88d9857e584e","7b6769f2748b","bcc38c8f6edf","cef6983b292","cb8577c9149e","444d13b52878","713d7dbc99b0","ef8e90590e66","191186aaafa0","55760f21cdc5","9dc80918cc93","bdc4052bbdba","8ccfed20cbb2"],"tierOneDomains":["medium.com","thebolditalic.com","arcdigital.media","towardsdatascience.com","uxdesign.cc","codeburst.io","psiloveyou.xyz","writingcooperative.com","entrepreneurshandbook.co","prototypr.io","betterhumans.coach.me","theascent.pub"],"topicsToFollow":["d61cf867d93f","8a146bc21b28","1eca0103fff3","4d562ee63426","aef1078a3ef5","e15e46793f8d","6158eb913466","55f1c20aba7a","3d18b94f6858","4861fee224fd","63c6f1f93ee","1d98b3a9a871","decb52b64abf","ae5d4995e225","830cded25262"],"topicToTagMappings":{"accessibility":"accessibility","addiction":"addiction","android-development":"android-development","art":"art","artificial-intelligence":"artificial-intelligence","astrology":"astrology","basic-income":"basic-income","beauty":"beauty","biotech":"biotech","blockchain":"blockchain","books":"books","business":"business","cannabis":"cannabis","cities":"cities","climate-change":"climate-change","comics":"comics","coronavirus":"coronavirus","creativity":"creativity","cryptocurrency":"cryptocurrency","culture":"culture","cybersecurity":"cybersecurity","data-science":"data-science","design":"design","digital-life":"digital-life","disability":"disability","economy":"economy","education":"education","equality":"equality","family":"family","feminism":"feminism","fiction":"fiction","film":"film","fitness":"fitness","food":"food","freelancing":"freelancing","future":"future","gadgets":"gadgets","gaming":"gaming","gun-control":"gun-control","health":"health","history":"history","humor":"humor","immigration":"immigration","ios-development":"ios-development","javascript":"javascript","justice":"justice","language":"language","leadership":"leadership","lgbtqia":"lgbtqia","lifestyle":"lifestyle","machine-learning":"machine-learning","makers":"makers","marketing":"marketing","math":"math","media":"media","mental-health":"mental-health","mindfulness":"mindfulness","money":"money","music":"music","neuroscience":"neuroscience","nonfiction":"nonfiction","outdoors":"outdoors","parenting":"parenting","pets":"pets","philosophy":"philosophy","photography":"photography","podcasts":"podcast","poetry":"poetry","politics":"politics","privacy":"privacy","product-management":"product-management","productivity":"productivity","programming":"programming","psychedelics":"psychedelics","psychology":"psychology","race":"race","relationships":"relationships","religion":"religion","remote-work":"remote-work","san-francisco":"san-francisco","science":"science","self":"self","self-driving-cars":"self-driving-cars","sexuality":"sexuality","social-media":"social-media","society":"society","software-engineering":"software-engineering","space":"space","spirituality":"spirituality","sports":"sports","startups":"startup","style":"style","technology":"technology","transportation":"transportation","travel":"travel","true-crime":"true-crime","tv":"tv","ux":"ux","venture-capital":"venture-capital","visual-design":"visual-design","work":"work","world":"world","writing":"writing"},"defaultImages":{"avatar":{"imageId":"1*dmbNkD5D-u45r44go_cf0g.png","height":150,"width":150},"orgLogo":{"imageId":"7*V1_7XP4snlmqrc_0Njontw.png","height":110,"width":500},"postLogo":{"imageId":"bd978bb536350a710e8efb012513429cabdc4c28700604261aeda246d0f980b7","height":810,"width":1440},"postPreviewImage":{"imageId":"1*hn4v1tCaJy7cWMyb0bpNpQ.png","height":386,"width":579}},"collectionStructuredData":{"8d6b8a439e32":{"name":"Elemental","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F980\u002F1*9ygdqoKprhwuTVKUM0DLPA@2x.png","width":980,"height":159}}},"3f6ecf56618":{"name":"Forge","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F596\u002F1*uULpIlImcO5TDuBZ6lm7Lg@2x.png","width":596,"height":183}}},"ae2a65f35510":{"name":"GEN","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F264\u002F1*RdVZMdvfV3YiZTw6mX7yWA.png","width":264,"height":140}}},"88d9857e584e":{"name":"LEVEL","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*JqYMhNX6KNNb2UlqGqO2WQ.png","width":540,"height":108}}},"7b6769f2748b":{"name":"Marker","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F383\u002F1*haCUs0wF6TgOOvfoY-jEoQ@2x.png","width":383,"height":92}}},"444d13b52878":{"name":"OneZero","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*cw32fIqCbRWzwJaoQw6BUg.png","width":540,"height":123}}},"8ccfed20cbb2":{"name":"Zora","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*tZUQqRcCCZDXjjiZ4bDvgQ.png","width":540,"height":106}}}},"embeddedPostIds":{"coronavirus":"cd3010f9d81f"},"sharedCdcMessaging":{"COVID_APPLICABLE_TAG_SLUGS":[],"COVID_APPLICABLE_TOPIC_NAMES":[],"COVID_APPLICABLE_TOPIC_NAMES_FOR_TOPIC_PAGE":[],"COVID_MESSAGES":{"tierA":{"text":"For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":66,"end":73,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"tierB":{"text":"Anyone can publish on Medium per our Policies, but we don’t fact-check every story. For more info about the coronavirus, see cdc.gov.","markups":[{"start":37,"end":45,"href":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Fcategories\u002F201931128-Policies-Safety"},{"start":125,"end":132,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"paywall":{"text":"This article has been made free for everyone, thanks to Medium Members. For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":56,"end":70,"href":"https:\u002F\u002Fmedium.com\u002Fmembership"},{"start":138,"end":145,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"unbound":{"text":"This article is free for everyone, thanks to Medium Members. For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":45,"end":59,"href":"https:\u002F\u002Fmedium.com\u002Fmembership"},{"start":127,"end":134,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]}},"COVID_BANNER_POST_ID_OVERRIDE_WHITELIST":["3b31a67bff4a"]},"sharedVoteMessaging":{"TAGS":["politics","election-2020","government","us-politics","election","2020-presidential-race","trump","donald-trump","democrats","republicans","congress","republican-party","democratic-party","biden","joe-biden","maga"],"TOPICS":["politics","election"],"MESSAGE":{"text":"Find out more about the U.S. election results here.","markups":[{"start":46,"end":50,"href":"https:\u002F\u002Fcookpolitical.com\u002F2020-national-popular-vote-tracker"}]},"EXCLUDE_POSTS":["397ef29e3ca5"]},"embedPostRules":[],"recircOptions":{"v1":{"limit":3},"v2":{"limit":8}},"braintreeClientKey":"production_zjkj96jm_m56f8fqpf7ngnrd4","braintree":{"enabled":true,"merchantId":"m56f8fqpf7ngnrd4","merchantAccountId":{"usd":"AMediumCorporation_instant","eur":"amediumcorporation_EUR","cad":"amediumcorporation_CAD"},"publicKey":"ds2nn34bg2z7j5gd","braintreeEnvironment":"production","dashboardUrl":"https:\u002F\u002Fwww.braintreegateway.com\u002Fmerchants","gracePeriodDurationInDays":14,"mediumMembershipPlanId":{"monthly":"ce105f8c57a3","monthlyV2":"e8a5e126-792b-4ee6-8fba-d574c1b02fc5","monthlyWithTrial":"d5ee3dbe3db8","monthlyPremium":"fa741a9b47a2","yearly":"a40ad4a43185","yearlyV2":"3815d7d6-b8ca-4224-9b8c-182f9047866e","yearlyStaff":"d74fb811198a","yearlyWithTrial":"b3bc7350e5c7","yearlyPremium":"e21bd2c12166","monthlyOneYearFree":"e6c0637a-2bad-4171-ab4f-3c268633d83c","monthly25PercentOffFirstYear":"235ecc62-0cdb-49ae-9378-726cd21c504b","monthly20PercentOffFirstYear":"ba518864-9c13-4a99-91ca-411bf0cac756","monthly15PercentOffFirstYear":"594c029b-9f89-43d5-88f8-8173af4e070e","monthly10PercentOffFirstYear":"c6c7bc9a-40f2-4b51-8126-e28511d5bdb0","monthlyForStudents":"629ebe51-da7d-41fd-8293-34cd2f2030a8","yearlyOneYearFree":"78ba7be9-0d9f-4ece-aa3e-b54b826f2bf1","yearly25PercentOffFirstYear":"2dbb010d-bb8f-4eeb-ad5c-a08509f42d34","yearly20PercentOffFirstYear":"47565488-435b-47f8-bf93-40d5fbe0ebc8","yearly15PercentOffFirstYear":"8259809b-0881-47d9-acf7-6c001c7f720f","yearly10PercentOffFirstYear":"9dd694fb-96e1-472c-8d9e-3c868d5c1506","yearlyForStudents":"e29345ef-ab1c-4234-95c5-70e50fe6bc23","monthlyCad":"p52orjkaceei","yearlyCad":"h4q9g2up9ktt"},"braintreeDiscountId":{"oneMonthFree":"MONTHS_FREE_01","threeMonthsFree":"MONTHS_FREE_03","sixMonthsFree":"MONTHS_FREE_06","fiftyPercentOffOneYear":"FIFTY_PERCENT_OFF_ONE_YEAR"},"3DSecureVersion":"2","defaultCurrency":"usd","providerPlanIdCurrency":{"4ycw":"usd","rz3b":"usd","3kqm":"usd","jzw6":"usd","c2q2":"usd","nnsw":"usd","q8qw":"usd","d9y6":"usd","fx7w":"cad","nwf2":"cad"}},"paypalClientId":"AXj1G4fotC2GE8KzWX9mSxCH1wmPE3nJglf4Z2ig_amnhvlMVX87otaq58niAg9iuLktVNF_1WCMnN7v","paypal":{"host":"https:\u002F\u002Fapi.paypal.com:443","clientMode":"production","serverMode":"live","webhookId":"4G466076A0294510S","monthlyPlan":{"planId":"P-9WR0658853113943TMU5FDQA","name":"Medium Membership (Monthly) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"yearlyPlan":{"planId":"P-7N8963881P8875835MU5JOPQ","name":"Medium Membership (Annual) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"oneYearGift":{"name":"Medium Membership (1 Year, Digital Gift Code)","description":"Unlimited access to the best and brightest stories on Medium. Gift codes can be redeemed at medium.com\u002Fredeem.","price":"50.00","currency":"USD","sku":"membership-gift-1-yr"},"oldMonthlyPlan":{"planId":"P-96U02458LM656772MJZUVH2Y","name":"Medium Membership (Monthly)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"oldYearlyPlan":{"planId":"P-59P80963JF186412JJZU3SMI","name":"Medium Membership (Annual)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"monthlyPlanWithTrial":{"planId":"P-66C21969LR178604GJPVKUKY","name":"Medium Membership (Monthly) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"yearlyPlanWithTrial":{"planId":"P-6XW32684EX226940VKCT2MFA","name":"Medium Membership (Annual) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"oldMonthlyPlanNoSetupFee":{"planId":"P-4N046520HR188054PCJC7LJI","name":"Medium Membership (Monthly)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"oldYearlyPlanNoSetupFee":{"planId":"P-7A4913502Y5181304CJEJMXQ","name":"Medium Membership (Annual)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"sdkUrl":"https:\u002F\u002Fwww.paypal.com\u002Fsdk\u002Fjs"},"stripePublishableKey":"pk_live_7FReX44VnNIInZwrIIx6ghjl","log":{"json":true,"level":"info"},"imageUploadMaxSizeMb":25,"staffPicks":{"title":"Staff Picks","catalogId":"c7bc6e1ee00f"}},"session":{"xsrf":""}}</script><script>window.__APOLLO_STATE__ = {"ROOT_QUERY":{"__typename":"Query","viewer":null,"collectionByDomainOrSlug({\"domainOrSlug\":\"flutter\"})":{"__ref":"Collection:4da7dfd21a33"},"postResult({\"id\":\"5e211f708a37\"})":{"__ref":"Post:5e211f708a37"}},"ImageMetadata:":{"__typename":"ImageMetadata","id":""},"Collection:4da7dfd21a33":{"__typename":"Collection","id":"4da7dfd21a33","favicon":{"__ref":"ImageMetadata:"},"customStyleSheet":null,"colorPalette":{"__typename":"ColorPalette","highlightSpectrum":{"__typename":"ColorSpectrum","backgroundColor":"#FFFFFFFF","colorPoints":[{"__typename":"ColorPoint","color":"#FFE8F5FF","point":0},{"__typename":"ColorPoint","color":"#FFE3F3FF","point":0.1},{"__typename":"ColorPoint","color":"#FFDEF2FF","point":0.2},{"__typename":"ColorPoint","color":"#FFDAF0FF","point":0.3},{"__typename":"ColorPoint","color":"#FFD5EFFF","point":0.4},{"__typename":"ColorPoint","color":"#FFD0EDFF","point":0.5},{"__typename":"ColorPoint","color":"#FFCBECFF","point":0.6},{"__typename":"ColorPoint","color":"#FFC6EBFF","point":0.7},{"__typename":"ColorPoint","color":"#FFC1E9FF","point":0.8},{"__typename":"ColorPoint","color":"#FFBCE8FF","point":0.9},{"__typename":"ColorPoint","color":"#FFB6E6FF","point":1}]},"defaultBackgroundSpectrum":{"__typename":"ColorSpectrum","backgroundColor":"#FFFFFFFF","colorPoints":[{"__typename":"ColorPoint","color":"#FF498BD1","point":0},{"__typename":"ColorPoint","color":"#FF4781C0","point":0.1},{"__typename":"ColorPoint","color":"#FF4477AF","point":0.2},{"__typename":"ColorPoint","color":"#FF416D9E","point":0.3},{"__typename":"ColorPoint","color":"#FF3D638D","point":0.4},{"__typename":"ColorPoint","color":"#FF38587C","point":0.5},{"__typename":"ColorPoint","color":"#FF324D6B","point":0.6},{"__typename":"ColorPoint","color":"#FF2C415A","point":0.7},{"__typename":"ColorPoint","color":"#FF253548","point":0.8},{"__typename":"ColorPoint","color":"#FF1C2937","point":0.9},{"__typename":"ColorPoint","color":"#FF121B25","point":1}]},"tintBackgroundSpectrum":{"__typename":"ColorSpectrum","backgroundColor":"#FF01579B","colorPoints":[{"__typename":"ColorPoint","color":"#FF01579B","point":0},{"__typename":"ColorPoint","color":"#FF306CA9","point":0.1},{"__typename":"ColorPoint","color":"#FF4D7FB7","point":0.2},{"__typename":"ColorPoint","color":"#FF6591C4","point":0.3},{"__typename":"ColorPoint","color":"#FF7CA3D0","point":0.4},{"__typename":"ColorPoint","color":"#FF92B4DC","point":0.5},{"__typename":"ColorPoint","color":"#FFA7C4E7","point":0.6},{"__typename":"ColorPoint","color":"#FFBCD3F1","point":0.7},{"__typename":"ColorPoint","color":"#FFD0E3FC","point":0.8},{"__typename":"ColorPoint","color":"#FFE3F2FF","point":0.9},{"__typename":"ColorPoint","color":"#FFF7FFFF","point":1}]}},"domain":null,"slug":"flutter","googleAnalyticsId":null,"name":"Flutter","avatar":{"__ref":"ImageMetadata:1*5-aoK8IBmXve5whBQM90GA.png"},"description":"Flutter is Google's UI framework for crafting high-quality native interfaces on iOS, Android, web, and desktop. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source. Learn more at https:\u002F\u002Fflutter.dev","subscriberCount":59319,"latestPostsConnection({\"paging\":{\"limit\":1}})":{"__typename":"PostConnection","posts":[{"__ref":"Post:f90c380c2317"}]},"isAuroraVisible":false,"tintColor":"#FF01579B","newsletterV3":null,"viewerEdge":{"__ref":"CollectionViewerEdge:collectionId:4da7dfd21a33-viewerId:lo_0f49d056f9f1"},"twitterUsername":"flutterdev","facebookPageId":null,"logo":{"__ref":"ImageMetadata:1*KvnfbD1F5CzEsU9wSmRZyA.png"}},"ImageMetadata:1*5-aoK8IBmXve5whBQM90GA.png":{"__typename":"ImageMetadata","id":"1*5-aoK8IBmXve5whBQM90GA.png"},"User:7cb43f46877f":{"__typename":"User","id":"7cb43f46877f","customDomainState":null,"hasSubdomain":false,"username":"kevinchisholm"},"Post:f90c380c2317":{"__typename":"Post","id":"f90c380c2317","firstPublishedAt":1739387397531,"creator":{"__ref":"User:7cb43f46877f"},"collection":{"__ref":"Collection:4da7dfd21a33"},"isSeries":false,"mediumUrl":"https:\u002F\u002Fmedium.com\u002Fflutter\u002Fwhats-new-in-flutter-3-29-f90c380c2317","sequence":null,"uniqueSlug":"whats-new-in-flutter-3-29-f90c380c2317"},"LinkedAccounts:a6d788faa5e5":{"__typename":"LinkedAccounts","mastodon":null,"id":"a6d788faa5e5"},"User:a6d788faa5e5":{"__typename":"User","id":"a6d788faa5e5","linkedAccounts":{"__ref":"LinkedAccounts:a6d788faa5e5"},"isSuspended":false,"name":"Michael Thomsen","imageId":"0*Y_CFLc1qadgr3tPK.","customDomainState":null,"hasSubdomain":false,"username":"mit.mit","verifications":{"__typename":"VerifiedInfo","isBookAuthor":false},"socialStats":{"__typename":"SocialStats","followerCount":9277,"followingCount":1,"collectionFollowingCount":3},"bio":"Product Manager working on Dart and Flutter. Helping developers is my passion!","membership":null,"allowNotes":true,"viewerEdge":{"__ref":"UserViewerEdge:userId:a6d788faa5e5-viewerId:lo_0f49d056f9f1"},"twitterScreenName":""},"Paragraph:80c47cd7582c_0":{"__typename":"Paragraph","id":"80c47cd7582c_0","name":"48b3","type":"H3","href":null,"layout":null,"metadata":null,"text":"Landing Flutter 3.22 and Dart 3.4 at Google I\u002FO 2024","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_1":{"__typename":"Paragraph","id":"80c47cd7582c_1","name":"3c18","type":"H4","href":null,"layout":null,"metadata":null,"text":"Major milestones for Flutter web apps, graphics performance upgrades, productivity experiments, and more","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"EM","start":0,"end":104,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_2":{"__typename":"Paragraph","id":"80c47cd7582c_2","name":"2605","type":"P","href":null,"layout":null,"metadata":null,"text":"It’s been a particularly busy last few months in Dart & Flutter air traffic control, but we’re happy to announce that Flutter 3.22 and Dart 3.4 have landed and are available today, just in time for this year’s Google I\u002FO!","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":210,"end":220,"href":"https:\u002F\u002Fio.google\u002F2024\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_3":{"__typename":"Paragraph","id":"80c47cd7582c_3","name":"7175","type":"P","href":null,"layout":null,"metadata":null,"text":"We remain committed to providing a strong language and framework pairing, enabling you to build beautiful, rich, and fast apps from a single, shared code base — so you can deliver apps to users on mobile, web, and desktop — without having to fragment your product roadmap.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*Mq-Uj8c8l7rrpPxYQ6Gemw.gif":{"__typename":"ImageMetadata","id":"1*Mq-Uj8c8l7rrpPxYQ6Gemw.gif","originalHeight":1500,"originalWidth":1920,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:80c47cd7582c_4":{"__typename":"Paragraph","id":"80c47cd7582c_4","name":"7958","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:1*Mq-Uj8c8l7rrpPxYQ6Gemw.gif"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_5":{"__typename":"Paragraph","id":"80c47cd7582c_5","name":"eb5b","type":"P","href":null,"layout":null,"metadata":null,"text":"Flutter 3.22 and Dart 3.4 offer performance improvements and platform-specific refinements that bring us closer to that vision. We’re particularly excited to share more about our journey with Wasm, but you’ll find so much more, including an improved Impeller rendering engine, smoother visuals and reduced CPU usage on iOS, enhanced platform navigation with Android’s predictive back gesture, expanded monetization options with the Google Mobile Ads SDK, and a new powerful deep link validator in DevTools. Dart developers will enjoy streamlined API migration with dart fix directly in the IDE and new DevTools capabilities for advanced profiling. Plus, you can now preview the Vertex AI for Firebase Dart SDK, integrating AI-powered features with robust security measures.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":565,"end":573,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_6":{"__typename":"Paragraph","id":"80c47cd7582c_6","name":"ac39","type":"P","href":null,"layout":null,"metadata":null,"text":"Today, we’ll also spotlight top companies using Flutter to increase productivity and build performant experiences. We’ll highlight just a few particularly exciting features that move us closer to our goal to deliver native-like performance across platforms, and include selected updates on our investments in productivity, developer experience, and games.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_7":{"__typename":"Paragraph","id":"80c47cd7582c_7","name":"b087","type":"P","href":null,"layout":null,"metadata":null,"text":"If you want more details on everything included in the releases, check out the dedicated Flutter and Dart posts. It’s time to Dash!","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":89,"end":96,"href":"https:\u002F\u002Fmedium.com\u002Fflutter\u002Ffbde6c164fe3","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":101,"end":105,"href":"https:\u002F\u002Fmedium.com\u002Fdartlang\u002Fdart-3-4-bd8d23b4462a","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_8":{"__typename":"Paragraph","id":"80c47cd7582c_8","name":"9ed0","type":"H3","href":null,"layout":null,"metadata":null,"text":"Flutter in action","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_9":{"__typename":"Paragraph","id":"80c47cd7582c_9","name":"d76a","type":"P","href":null,"layout":null,"metadata":null,"text":"Flutter developers are busy launching large, new apps into the app stores. Let’s look at a few.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*cF6UE3y05YTyMBQn":{"__typename":"ImageMetadata","id":"0*cF6UE3y05YTyMBQn","originalHeight":680,"originalWidth":1440,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:80c47cd7582c_10":{"__typename":"Paragraph","id":"80c47cd7582c_10","name":"0396","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*cF6UE3y05YTyMBQn"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_11":{"__typename":"Paragraph","id":"80c47cd7582c_11","name":"a79b","type":"H4","href":null,"layout":null,"metadata":null,"text":"Helping large, enterprise-scale applications deliver on mobile and the web","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_12":{"__typename":"Paragraph","id":"80c47cd7582c_12","name":"c43c","type":"ULI","href":null,"layout":null,"metadata":null,"text":"In the United Kingdom, financial institution Virgin Money is using Flutter across their suite of mobile banking and credit card apps to unify app development processes, speed up change, and enable an industry-leading user experience.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":45,"end":57,"href":"https:\u002F\u002Fuk.virginmoney.com\u002F","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":61,"end":74,"href":"http:\u002F\u002Fflutter.dev\u002Fshowcase\u002Fvirgin-money","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_13":{"__typename":"Paragraph","id":"80c47cd7582c_13","name":"e242","type":"ULI","href":null,"layout":null,"metadata":null,"text":"US insurance company GEICO recently shared that Flutter helped them improve branded user experiences across iOS, Android, and the web, reduce the size of their codebase, and increase development efficiency, all at scale.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":21,"end":26,"href":"https:\u002F\u002Fwww.geico.com\u002Fabout\u002Fcorporate\u002Fat-a-glance\u002F","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":36,"end":42,"href":"https:\u002F\u002Fwww.geico.com\u002Ftechblog\u002Fflutter-as-the-multi-channel-ux-framework\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_14":{"__typename":"Paragraph","id":"80c47cd7582c_14","name":"aafc","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Universal Studios Destinations & Experiences released new Flutter mobile apps for their Hollywood, Osaka, and Orlando parks. Watch the video below to learn why they chose Flutter and to see how it’s performing so far.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":44,"href":"https:\u002F\u002Fcorporate.universaldestinationsandexperiences.com\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"MediaResource:721111dda3bc3595ada438b543af64a4":{"__typename":"MediaResource","id":"721111dda3bc3595ada438b543af64a4","iframeSrc":"https:\u002F\u002Fcdn.embedly.com\u002Fwidgets\u002Fmedia.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FJTk2Exr7FO4%3Ffeature%3Doembed&display_name=YouTube&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DJTk2Exr7FO4&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FJTk2Exr7FO4%2Fhqdefault.jpg&type=text%2Fhtml&schema=youtube","iframeHeight":480,"iframeWidth":854,"title":"How Universal Destinations & Experiences build next generation experiences with #Flutter"},"Paragraph:80c47cd7582c_15":{"__typename":"Paragraph","id":"80c47cd7582c_15","name":"0490","type":"IFRAME","href":null,"layout":"INSET_CENTER","metadata":null,"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":{"__typename":"Iframe","mediaResource":{"__ref":"MediaResource:721111dda3bc3595ada438b543af64a4"}},"mixtapeMetadata":null},"Paragraph:80c47cd7582c_16":{"__typename":"Paragraph","id":"80c47cd7582c_16","name":"a80c","type":"H4","href":null,"layout":null,"metadata":null,"text":"Going beyond mobile and the web","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_17":{"__typename":"Paragraph","id":"80c47cd7582c_17","name":"5493","type":"ULI","href":null,"layout":null,"metadata":null,"text":"The Canonical team has been working with Flutter since 2021 to enable support for the Flutter ecosystem in Ubuntu. Over the past year the Canonical team has rebuilt the Ubuntu Installer from the ground up with Flutter.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":4,"end":13,"href":"https:\u002F\u002Fcanonical.com\u002F","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":49,"end":59,"href":"https:\u002F\u002Fubuntu.com\u002Fblog\u002Fflutter-and-ubuntu-so-far","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":94,"end":103,"href":"https:\u002F\u002Fpub.dev\u002Fpublishers\u002Fcanonical.com\u002Fpackages","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_18":{"__typename":"Paragraph","id":"80c47cd7582c_18","name":"8a48","type":"ULI","href":null,"layout":null,"metadata":null,"text":"LG has chosen Flutter to enhance their smart TV operating system, webOS. Flutter’s performance, productivity, and strong ecosystem allow LG to rapidly develop and deploy webOS system apps that run smoothly. By 2025, Flutter will power system apps on tens of millions of LG TVs worldwide.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":2,"href":"https:\u002F\u002Fwww.lg.com\u002Fus","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_19":{"__typename":"Paragraph","id":"80c47cd7582c_19","name":"8078","type":"P","href":null,"layout":null,"metadata":null,"text":"We’re inspired by these success stories, and are committed to making Flutter even better. Let’s dive into the latest product updates to show what we’re doing to enable you to build even more amazing apps, games, and experiences.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_20":{"__typename":"Paragraph","id":"80c47cd7582c_20","name":"f570","type":"H3","href":null,"layout":null,"metadata":null,"text":"WebAssembly: Chasing native performance on the web","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_21":{"__typename":"Paragraph","id":"80c47cd7582c_21","name":"4545","type":"P","href":null,"layout":null,"metadata":null,"text":"Today we’re announcing support in our stable release for compiling Flutter web apps to WebAssembly (Wasm). This is an exciting new instruction format for web browsers, which provides a portable, platform neutral, binary code format.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":57,"end":66,"href":"https:\u002F\u002Fdocs.flutter.dev\u002Fplatform-integration\u002Fweb\u002Fwasm","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_22":{"__typename":"Paragraph","id":"80c47cd7582c_22","name":"6c61","type":"P","href":null,"layout":null,"metadata":null,"text":"Our support for Wasm has been a deep, multi-year investment. First we partnered with the Chrome team on defining support in WebAssembly for high-level, managed languages like Dart, which commonly use garbage collection. This resulted in the WasmGC proposal, which is now a full and finalized standard, with runtime implementations available in Chrome (Chromium 119 and later) and Firefox (120 and later), and with other browser vendors expected to follow. Next, we added a brand new Dart compiler backend to generate WasmGC code, and the Dart & Flutter teams collaborated to run both the compiled app code and the Flutter rendering engine as Wasm modules with efficient Wasm to Wasm interop.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":241,"end":247,"href":"https:\u002F\u002Fdeveloper.chrome.com\u002Fblog\u002Fwasmgc\u002F","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":248,"end":256,"href":"https:\u002F\u002Fgithub.com\u002FWebAssembly\u002Fgc\u002Fblob\u002Fmain\u002Fproposals\u002Fgc\u002FOverview.md","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_23":{"__typename":"Paragraph","id":"80c47cd7582c_23","name":"3caa","type":"P","href":null,"layout":null,"metadata":null,"text":"So what’s the net result? We’re seeing much improved performance, approaching what we have on mobile and desktop devices running machine code. In our internal benchmarks (in Chrome on an M1 MacBook), the frame rendering time of Wonderous improved by 2x in the general case and by 3x for the 99% worst case performance. Improved rendering performance is critical in demanding apps that feature animations and rich transitions, where exceeding the frame budget (the time allocated to render the next frame) causes very visible jank. Wasm has the potential to eliminate that, as illustrated by the juxtaposition below of the Wonderous app running with our traditional JS compilation compared to Wasm compilation.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":228,"end":237,"href":"https:\u002F\u002Fflutter.gskinner.com\u002Fwonderous\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*ebpdPSPlak3EwoAU":{"__typename":"ImageMetadata","id":"0*ebpdPSPlak3EwoAU","originalHeight":371,"originalWidth":719,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:80c47cd7582c_24":{"__typename":"Paragraph","id":"80c47cd7582c_24","name":"1484","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*ebpdPSPlak3EwoAU"},"text":"Comparing the rendering speed of Javascript vs Wasm for the Wonderous demo application.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":60,"end":69,"href":"https:\u002F\u002Fflutter.gskinner.com\u002Fwonderous\u002F","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":0,"end":87,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_25":{"__typename":"Paragraph","id":"80c47cd7582c_25","name":"9224","type":"P","href":null,"layout":null,"metadata":null,"text":"Wasm compilation for Flutter web apps is available in stable today. To get started, check out our Dart Wasm documentation and Flutter Wasm documentation.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":98,"end":121,"href":"https:\u002F\u002Fdart.dev\u002Fweb\u002Fwasm","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":126,"end":152,"href":"https:\u002F\u002Fdocs.flutter.dev\u002Fplatform-integration\u002Fweb\u002Fwasm","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_26":{"__typename":"Paragraph","id":"80c47cd7582c_26","name":"a366","type":"H3","href":null,"layout":null,"metadata":null,"text":"Dart macros: raising the development abstraction level","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_27":{"__typename":"Paragraph","id":"80c47cd7582c_27","name":"ba35","type":"P","href":null,"layout":null,"metadata":null,"text":"We’re committed to providing a best-in-class developer experience. That means tackling long standing pain-points for Dart developers, like serializing JSON data.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_28":{"__typename":"Paragraph","id":"80c47cd7582c_28","name":"a627","type":"P","href":null,"layout":null,"metadata":null,"text":"It’s a prevalent pattern that’s equal parts trivial and tedious. Current solutions mean either slogging through encoding and decoding boilerplate manually, or layering on extra tooling in the form of code generation solutions like the JsonSerializable package.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":235,"end":251,"href":"https:\u002F\u002Fdocs.flutter.dev\u002Fdata-and-backend\u002Fserialization\u002Fjson#serializing-json-using-code-generation-libraries","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_29":{"__typename":"Paragraph","id":"80c47cd7582c_29","name":"d7e0","type":"P","href":null,"layout":null,"metadata":null,"text":"Today, we’re announcing a preview of a better option for JSON: the JsonCodable macro.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":67,"end":78,"href":"https:\u002F\u002Fdart.dev\u002Fgo\u002Fjson-codable","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_30":{"__typename":"Paragraph","id":"80c47cd7582c_30","name":"ce6a","type":"P","href":null,"layout":null,"metadata":null,"text":"Macros are code that creates more code. They’re like code generation, except the macro system is built into Dart and happens in real-time as you are editing and running the code. It’s an integrated experience without delays, fully supporting our existing developer workflows such as hot reload, as illustrated by this screencast:","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"EM","start":97,"end":112,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":125,"end":137,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*rWeEWxzBvcmOFNM4":{"__typename":"ImageMetadata","id":"0*rWeEWxzBvcmOFNM4","originalHeight":496,"originalWidth":896,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:80c47cd7582c_31":{"__typename":"Paragraph","id":"80c47cd7582c_31","name":"c521","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*rWeEWxzBvcmOFNM4"},"text":"Screencast showing the experience of using a macro: Initially no toJson code completion exists, but after adding @JsonCodable to the class, the toJson code completion shows up immediately.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"EM","start":0,"end":188,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_32":{"__typename":"Paragraph","id":"80c47cd7582c_32","name":"2eb1","type":"P","href":null,"layout":null,"metadata":null,"text":"We’re excited to see macros solve all kinds of problems for our developers. Take, for example, data classes, the highest voted Dart language feature. Beyond specific applications, our eventual goal is to have a macro system in Dart that allows users to create their own macros and raise the abstraction level of Dart programming.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":113,"end":126,"href":"https:\u002F\u002Fgithub.com\u002Fdart-lang\u002Flanguage\u002Fissues?q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_33":{"__typename":"Paragraph","id":"80c47cd7582c_33","name":"d635","type":"P","href":null,"layout":null,"metadata":null,"text":"Designing and implementing such a powerful macro system is a large task, so there is currently no date set for a stable release — for more details check out the Dart 3.4 post. In the meantime, try out a preview of the JsonCodable macro today. For more information, check out macros documentation.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":218,"end":229,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":161,"end":174,"href":"https:\u002F\u002Fmedium.com\u002Fdartlang\u002Fdart-3-4-bd8d23b4462a","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":274,"end":295,"href":"http:\u002F\u002Fdart.dev\u002Fgo\u002Fjson-codable","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_34":{"__typename":"Paragraph","id":"80c47cd7582c_34","name":"0ed9","type":"H3","href":null,"layout":null,"metadata":null,"text":"New resources for Flutter game development","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*F19xflZ4BfoCekFQ":{"__typename":"ImageMetadata","id":"0*F19xflZ4BfoCekFQ","originalHeight":789,"originalWidth":1400,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:80c47cd7582c_35":{"__typename":"Paragraph","id":"80c47cd7582c_35","name":"3f7d","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*F19xflZ4BfoCekFQ"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_36":{"__typename":"Paragraph","id":"80c47cd7582c_36","name":"d638","type":"P","href":null,"layout":null,"metadata":null,"text":"We’re seeing promising results from our early investment in games, including success stories from industry leaders like Etermax and Supercell, who are each leveraging Flutter’s power and flexibility to efficiently deliver delightful user experiences and expand their reach.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":120,"end":127,"href":"http:\u002F\u002Fflutter.dev\u002Fshowcase\u002Fetermax","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":132,"end":141,"href":"http:\u002F\u002Fflutter.dev\u002Fshowcase\u002Fsupercell","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_37":{"__typename":"Paragraph","id":"80c47cd7582c_37","name":"0fdb","type":"P","href":null,"layout":null,"metadata":null,"text":"Today, we’re excited to continue to build on that momentum with these new resources for Flutter game developers:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_38":{"__typename":"Paragraph","id":"80c47cd7582c_38","name":"a167","type":"ULI","href":null,"layout":null,"metadata":null,"text":"The SoLoud audio engine is now available: We’ve collaborated with the Flutter community (@Marco Bavagnoli) to create a free and portable audio engine that delivers low-latency, high-performance sound, essential for many games. We also created a new sound and music codelab that uses SoLoud.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":4,"end":23,"href":"https:\u002F\u002Fpub.dev\u002Fpackages\u002Fflutter_soloud","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":90,"end":105,"href":"https:\u002F\u002Fgithub.com\u002Falnitak","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":249,"end":272,"href":"https:\u002F\u002Fcodelabs.developers.google.com\u002Fcodelabs\u002Fflutter-codelab-soloud#0","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_39":{"__typename":"Paragraph","id":"80c47cd7582c_39","name":"80ce","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Learn how to generate expansive crossword-style grids of interlocking words without compromising the user experience, and craft game mechanics in a Flutter and Flame game using a 2D physics simulation along the lines of Box2D called Forge2D.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":13,"end":53,"href":"https:\u002F\u002Fcodelabs.developers.google.com\u002Fcodelabs\u002Fflutter-word-puzzle#0","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":122,"end":200,"href":"https:\u002F\u002Fcodelabs.developers.google.com\u002Fcodelabs\u002Fflutter-flame-forge2d#0","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":233,"end":240,"href":"https:\u002F\u002Fpub.dev\u002Fpackages\u002Fforge2d","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_40":{"__typename":"Paragraph","id":"80c47cd7582c_40","name":"4941","type":"ULI","href":null,"layout":null,"metadata":null,"text":"A new guide for optimizing Flutter web-based game loading speed: Long load times are a major deterrent in web-based games. Follow this guide (authored by Cheng Lin) to optimize your loading speed so that players don’t abandon your game because it loads slowly.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":16,"end":63,"href":"https:\u002F\u002Fmedium.com\u002Fflutter\u002Fbest-practices-for-optimizing-flutter-web-loading-speed-7cc0df14ce5c","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":154,"end":163,"href":"https:\u002F\u002Ftwitter.com\u002Fchenglinlim","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_41":{"__typename":"Paragraph","id":"80c47cd7582c_41","name":"c02a","type":"H3","href":null,"layout":null,"metadata":null,"text":"Empowering sustainable game development","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_42":{"__typename":"Paragraph","id":"80c47cd7582c_42","name":"d42e","type":"P","href":null,"layout":null,"metadata":null,"text":"In January 2024, inspired by the story behind their use of Flutter, we partnered with Global Citizen to challenge our communities to design, build, and publish sustainability games using Flutter. These games are meant to inspire and empower players to take small, but meaningful actions for the environment. Today, we’re announcing the 10 winners.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":33,"end":38,"href":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=qgOlg173gcI&pp=ygUWR2xvYmFsIENpdGl6ZW4gRmx1dHRlcg%3D%3D","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":332,"end":346,"href":"https:\u002F\u002Fmedium.com\u002Fflutter\u002Fannouncing-the-winners-of-the-global-gamers-challenge-1ccf4d271226","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"MediaResource:f79ed19f8ef6235e83b919df5506662f":{"__typename":"MediaResource","id":"f79ed19f8ef6235e83b919df5506662f","iframeSrc":"https:\u002F\u002Fcdn.embedly.com\u002Fwidgets\u002Fmedia.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F_GgqdB9md1w&display_name=YouTube&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D_GgqdB9md1w&image=http%3A%2F%2Fi.ytimg.com%2Fvi%2F_GgqdB9md1w%2Fhqdefault.jpg&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&schema=youtube","iframeHeight":480,"iframeWidth":854,"title":""},"Paragraph:80c47cd7582c_43":{"__typename":"Paragraph","id":"80c47cd7582c_43","name":"f802","type":"IFRAME","href":null,"layout":"INSET_CENTER","metadata":null,"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":{"__typename":"Iframe","mediaResource":{"__ref":"MediaResource:f79ed19f8ef6235e83b919df5506662f"}},"mixtapeMetadata":null},"Paragraph:80c47cd7582c_44":{"__typename":"Paragraph","id":"80c47cd7582c_44","name":"f64a","type":"P","href":null,"layout":null,"metadata":null,"text":"Congrats to all of the winners!","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_45":{"__typename":"Paragraph","id":"80c47cd7582c_45","name":"f9a5","type":"H3","href":null,"layout":null,"metadata":null,"text":"Much more to explore","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_46":{"__typename":"Paragraph","id":"80c47cd7582c_46","name":"b279","type":"P","href":null,"layout":null,"metadata":null,"text":"That’s all we have time to spotlight today, but there are many more exciting improvements that we didn’t touch on. Here are a few more things to know:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_47":{"__typename":"Paragraph","id":"80c47cd7582c_47","name":"27c5","type":"ULI","href":null,"layout":null,"metadata":null,"text":"You can preview the Vertex AI for Firebase Dart SDK to use the Gemini API for AI-driven features in a Dart or Flutter app. The SDK is integrated with Firebase App Check, which protects your API calls, and safeguards your backend infrastructure from serious threats like billing fraud, phishing, and app impersonation. For details, see our AI page.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":16,"end":51,"href":"https:\u002F\u002Ffirebase.google.com\u002Fdocs\u002Fvertex-ai\u002Fget-started?platform=flutter","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":339,"end":346,"href":"http:\u002F\u002Fflutter.dev\u002Fai","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":7,"end":8,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":15,"end":51,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_48":{"__typename":"Paragraph","id":"80c47cd7582c_48","name":"2801","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Impeller, our next-gen rendering engine, is now feature complete on Android.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":14,"end":39,"href":"https:\u002F\u002Fdocs.flutter.dev\u002Fperf\u002Fimpeller","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":0,"end":8,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_49":{"__typename":"Paragraph","id":"80c47cd7582c_49","name":"0061","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Android’s predictive back gesture is now supported both when navigating within a Flutter app, and when navigating to another app or to the homescreen.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":10,"end":25,"href":"https:\u002F\u002Fdeveloper.android.com\u002Fguide\u002Fnavigation\u002Fcustom-back\u002Fpredictive-back-gesture","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":0,"end":25,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_50":{"__typename":"Paragraph","id":"80c47cd7582c_50","name":"2404","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Platform views on iOS have been performance optimized, reducing CPU usage by up to 50%.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":14,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_51":{"__typename":"Paragraph","id":"80c47cd7582c_51","name":"2b70","type":"ULI","href":null,"layout":null,"metadata":null,"text":"The Google Mobile Ads SDK has been extended to support more ad partners and mediation options.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":4,"end":25,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_52":{"__typename":"Paragraph","id":"80c47cd7582c_52","name":"a495","type":"ULI","href":null,"layout":null,"metadata":null,"text":"DevTools has a new deep link validator that helps you identify and troubleshoot errors in Android deep link configuration, so you can more easily connect web experiences to a Flutter app.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":19,"end":38,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_53":{"__typename":"Paragraph","id":"80c47cd7582c_53","name":"35fd","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Dart fix, our API migration tool, can now be invoked directly from the IDE.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":8,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_54":{"__typename":"Paragraph","id":"80c47cd7582c_54","name":"b651","type":"ULI","href":null,"layout":null,"metadata":null,"text":"DevTools now supports advanced filtering and CPU samples in the timeline.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":8,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_55":{"__typename":"Paragraph","id":"80c47cd7582c_55","name":"2af0","type":"P","href":null,"layout":null,"metadata":null,"text":"Head over to the Flutter technical post and the Dart 3.4 post for more details on each of these, and more.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":17,"end":39,"href":"https:\u002F\u002Fmedium.com\u002Fflutter\u002Ffbde6c164fe3","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":48,"end":61,"href":"https:\u002F\u002Fmedium.com\u002Fdartlang\u002Fdart-3-4-bd8d23b4462a","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_56":{"__typename":"Paragraph","id":"80c47cd7582c_56","name":"5050","type":"P","href":null,"layout":null,"metadata":null,"text":"As always, we’re incredibly grateful for your continued support, passion, enthusiasm, and feedback. This project wouldn’t be possible without you, and we can’t wait to see how you continue to push Flutter forward.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:80c47cd7582c_57":{"__typename":"Paragraph","id":"80c47cd7582c_57","name":"abf4","type":"P","href":null,"layout":null,"metadata":null,"text":"Flutter over and out. We hope to see you on board again soon!","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"CollectionViewerEdge:collectionId:4da7dfd21a33-viewerId:lo_0f49d056f9f1":{"__typename":"CollectionViewerEdge","id":"collectionId:4da7dfd21a33-viewerId:lo_0f49d056f9f1","isEditor":false,"isMuting":false},"UserViewerEdge:userId:a6d788faa5e5-viewerId:lo_0f49d056f9f1":{"__typename":"UserViewerEdge","id":"userId:a6d788faa5e5-viewerId:lo_0f49d056f9f1","isMuting":false},"ImageMetadata:1*KvnfbD1F5CzEsU9wSmRZyA.png":{"__typename":"ImageMetadata","id":"1*KvnfbD1F5CzEsU9wSmRZyA.png","originalWidth":538,"originalHeight":141},"PostViewerEdge:postId:5e211f708a37-viewerId:lo_0f49d056f9f1":{"__typename":"PostViewerEdge","shouldIndexPostForExternalSearch":true,"id":"postId:5e211f708a37-viewerId:lo_0f49d056f9f1"},"Tag:announcements":{"__typename":"Tag","id":"announcements","displayTitle":"Announcements","normalizedTagSlug":"announcements"},"Tag:flutter":{"__typename":"Tag","id":"flutter","displayTitle":"Flutter","normalizedTagSlug":"flutter"},"Tag:releases":{"__typename":"Tag","id":"releases","displayTitle":"Releases","normalizedTagSlug":"releases"},"Post:5e211f708a37":{"__typename":"Post","id":"5e211f708a37","collection":{"__ref":"Collection:4da7dfd21a33"},"content({\"postMeteringOptions\":{\"referrer\":\"\"}})":{"__typename":"PostContent","isLockedPreviewOnly":false,"bodyModel":{"__typename":"RichText","sections":[{"__typename":"Section","name":"fbc7","startIndex":0,"textLayout":null,"imageLayout":null,"backgroundImage":null,"videoLayout":null,"backgroundVideo":null}],"paragraphs":[{"__ref":"Paragraph:80c47cd7582c_0"},{"__ref":"Paragraph:80c47cd7582c_1"},{"__ref":"Paragraph:80c47cd7582c_2"},{"__ref":"Paragraph:80c47cd7582c_3"},{"__ref":"Paragraph:80c47cd7582c_4"},{"__ref":"Paragraph:80c47cd7582c_5"},{"__ref":"Paragraph:80c47cd7582c_6"},{"__ref":"Paragraph:80c47cd7582c_7"},{"__ref":"Paragraph:80c47cd7582c_8"},{"__ref":"Paragraph:80c47cd7582c_9"},{"__ref":"Paragraph:80c47cd7582c_10"},{"__ref":"Paragraph:80c47cd7582c_11"},{"__ref":"Paragraph:80c47cd7582c_12"},{"__ref":"Paragraph:80c47cd7582c_13"},{"__ref":"Paragraph:80c47cd7582c_14"},{"__ref":"Paragraph:80c47cd7582c_15"},{"__ref":"Paragraph:80c47cd7582c_16"},{"__ref":"Paragraph:80c47cd7582c_17"},{"__ref":"Paragraph:80c47cd7582c_18"},{"__ref":"Paragraph:80c47cd7582c_19"},{"__ref":"Paragraph:80c47cd7582c_20"},{"__ref":"Paragraph:80c47cd7582c_21"},{"__ref":"Paragraph:80c47cd7582c_22"},{"__ref":"Paragraph:80c47cd7582c_23"},{"__ref":"Paragraph:80c47cd7582c_24"},{"__ref":"Paragraph:80c47cd7582c_25"},{"__ref":"Paragraph:80c47cd7582c_26"},{"__ref":"Paragraph:80c47cd7582c_27"},{"__ref":"Paragraph:80c47cd7582c_28"},{"__ref":"Paragraph:80c47cd7582c_29"},{"__ref":"Paragraph:80c47cd7582c_30"},{"__ref":"Paragraph:80c47cd7582c_31"},{"__ref":"Paragraph:80c47cd7582c_32"},{"__ref":"Paragraph:80c47cd7582c_33"},{"__ref":"Paragraph:80c47cd7582c_34"},{"__ref":"Paragraph:80c47cd7582c_35"},{"__ref":"Paragraph:80c47cd7582c_36"},{"__ref":"Paragraph:80c47cd7582c_37"},{"__ref":"Paragraph:80c47cd7582c_38"},{"__ref":"Paragraph:80c47cd7582c_39"},{"__ref":"Paragraph:80c47cd7582c_40"},{"__ref":"Paragraph:80c47cd7582c_41"},{"__ref":"Paragraph:80c47cd7582c_42"},{"__ref":"Paragraph:80c47cd7582c_43"},{"__ref":"Paragraph:80c47cd7582c_44"},{"__ref":"Paragraph:80c47cd7582c_45"},{"__ref":"Paragraph:80c47cd7582c_46"},{"__ref":"Paragraph:80c47cd7582c_47"},{"__ref":"Paragraph:80c47cd7582c_48"},{"__ref":"Paragraph:80c47cd7582c_49"},{"__ref":"Paragraph:80c47cd7582c_50"},{"__ref":"Paragraph:80c47cd7582c_51"},{"__ref":"Paragraph:80c47cd7582c_52"},{"__ref":"Paragraph:80c47cd7582c_53"},{"__ref":"Paragraph:80c47cd7582c_54"},{"__ref":"Paragraph:80c47cd7582c_55"},{"__ref":"Paragraph:80c47cd7582c_56"},{"__ref":"Paragraph:80c47cd7582c_57"}]},"validatedShareKey":"","shareKeyCreator":null},"creator":{"__ref":"User:a6d788faa5e5"},"inResponseToEntityType":null,"isLocked":false,"isMarkedPaywallOnly":false,"lockedSource":"LOCKED_POST_SOURCE_NONE","mediumUrl":"https:\u002F\u002Fmedium.com\u002Fflutter\u002Fio24-5e211f708a37","primaryTopic":null,"topics":[{"__typename":"Topic","slug":"programming"}],"isLimitedState":false,"isPublished":true,"allowResponses":true,"latestPublishedVersion":"80c47cd7582c","visibility":"PUBLIC","postResponses":{"__typename":"PostResponses","count":10},"responseDistribution":"NOT_DISTRIBUTED","clapCount":2467,"title":"Landing Flutter 3.22 and Dart 3.4 at Google I\u002FO 2024","isSeries":false,"sequence":null,"uniqueSlug":"io24-5e211f708a37","socialTitle":"","socialDek":"","canonicalUrl":"","metaDescription":"","latestPublishedAt":1715718818614,"readingTime":6.984276729559748,"previewContent":{"__typename":"PreviewContent","subtitle":"Major milestones for Flutter web apps, graphics performance upgrades, productivity experiments, and more"},"previewImage":{"__ref":"ImageMetadata:1*Mq-Uj8c8l7rrpPxYQ6Gemw.gif"},"isShortform":false,"seoTitle":"","firstPublishedAt":1715718818614,"updatedAt":1732625244297,"shortformType":"SHORTFORM_TYPE_LINK","seoDescription":"","viewerEdge":{"__ref":"PostViewerEdge:postId:5e211f708a37-viewerId:lo_0f49d056f9f1"},"isSuspended":false,"license":"ALL_RIGHTS_RESERVED","tags":[{"__ref":"Tag:announcements"},{"__ref":"Tag:flutter"},{"__ref":"Tag:releases"}],"isFeaturedInPublishedPublication":false,"isNewsletter":false,"statusForCollection":"APPROVED","pendingCollection":null,"detectedLanguage":"en","wordCount":1630,"layerCake":1,"responsesLocked":false}}</script><script>window.__MIDDLEWARE_STATE__={"session":{"xsrf":""},"cache":{"cacheStatus":"HIT"}}</script><script src="https://cdn-client.medium.com/lite/static/js/manifest.4b5fe151.js"></script><script src="https://cdn-client.medium.com/lite/static/js/9865.1496d74a.js"></script><script src="https://cdn-client.medium.com/lite/static/js/main.af7becea.js"></script><script src="https://cdn-client.medium.com/lite/static/js/instrumentation.5bef8967.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/reporting.ff22a7a5.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/9120.5df29668.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5049.d1ead72d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/4505.6dfaf853.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6618.db187378.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/9380.fb176dee.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2707.dc8dbee4.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/9977.933c1c9a.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8599.68bc318b.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/3045.1cc3d8cb.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6349.3329b100.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2648.26563adf.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8393.a4ecfb83.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6428.7d30b23c.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6199.6da73f3b.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5642.7d9f7f3d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6546.67eb283b.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6834.8aa8d357.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/4492.0c3e1a1d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2571.6814b962.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/839.1c286b32.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6128.f8800a13.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2135.2e8dc177.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/7975.60bcefe8.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/144.86429b48.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5240.6281357f.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8819.c627c2bf.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8204.d0637ed0.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/PostPage.MainContent.a27c27dc.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8414.0d800846.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/3974.8d3e0217.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2527.18a8996d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/PostResponsesContent.e1e580cb.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/responses.editor.e89462cb.chunk.js"></script><script>window.main();</script><script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'9141b0a03fc04a23',t:'MTczOTkyMDIyMS4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body></html>

Pages: 1 2 3 4 5 6 7 8 9 10