CINXE.COM

<!doctype html><html lang="en"><head><title data-rh="true">What’s new in Flutter 3.3. Exciting updates for text handling… | by Kevin Chisholm | 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="2022-08-31T13:14:18.947Z"/><meta data-rh="true" name="title" content="What’s new in Flutter 3.3. Exciting updates for text handling… | by Kevin Chisholm | Flutter | Medium"/><meta data-rh="true" property="og:title" content="What’s new in Flutter 3.3"/><meta data-rh="true" property="al:android:url" content="medium://p/893c7b9af1ff"/><meta data-rh="true" property="al:ios:url" content="medium://p/893c7b9af1ff"/><meta data-rh="true" property="al:android:app_name" content="Medium"/><meta data-rh="true" name="description" content="Welcome to Flutter 3.3! Only three months ago we announced Flutter 3, a massive milestone that included stable support for all platforms! The good news is that the momentum since this major release…"/><meta data-rh="true" property="og:description" content="Exciting updates for text handling, performance improvements, and more!"/><meta data-rh="true" property="og:url" content="https://medium.com/flutter/whats-new-in-flutter-3-3-893c7b9af1ff"/><meta data-rh="true" property="al:web:url" content="https://medium.com/flutter/whats-new-in-flutter-3-3-893c7b9af1ff"/><meta data-rh="true" property="og:image" content="https://miro.medium.com/v2/da:true/resize:fit:1068/0*4Mac8uQL3ynXVIuD"/><meta data-rh="true" property="article:author" content="https://medium.com/@kevinchisholm"/><meta data-rh="true" name="author" content="Kevin Chisholm"/><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="What’s new in Flutter 3.3"/><meta data-rh="true" name="twitter:site" content="@flutterdev"/><meta data-rh="true" name="twitter:app:url:iphone" content="medium://p/893c7b9af1ff"/><meta data-rh="true" property="twitter:description" content="Exciting updates for text handling, performance improvements, and more!"/><meta data-rh="true" name="twitter:image:src" content="https://miro.medium.com/v2/da:true/resize:fit:1068/0*4Mac8uQL3ynXVIuD"/><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="9 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/@kevinchisholm"/><link data-rh="true" rel="canonical" href="https://medium.com/flutter/whats-new-in-flutter-3-3-893c7b9af1ff"/><link data-rh="true" rel="alternate" href="android-app://com.medium.reader/https/medium.com/p/893c7b9af1ff"/><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\u002F0*4Mac8uQL3ynXVIuD"],"url":"https:\u002F\u002Fmedium.com\u002Fflutter\u002Fwhats-new-in-flutter-3-3-893c7b9af1ff","dateCreated":"2022-08-30T18:28:14.293Z","datePublished":"2022-08-30T18:28:14.293Z","dateModified":"2023-10-19T21:48:49.597Z","headline":"What’s new in Flutter 3.3 - Flutter - Medium","name":"What’s new in Flutter 3.3 - Flutter - Medium","description":"Welcome to Flutter 3.3! Only three months ago we announced Flutter 3, a massive milestone that included stable support for all platforms! The good news is that the momentum since this major release…","identifier":"893c7b9af1ff","author":{"@type":"Person","name":"Kevin Chisholm","url":"https:\u002F\u002Fmedium.com\u002F@kevinchisholm"},"creator":["Kevin Chisholm"],"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\u002Fwhats-new-in-flutter-3-3-893c7b9af1ff"}</script><style type="text/css" data-fela-rehydration="570" 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="570" 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="570" 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}.ia{align-items:baseline}.ib{width:48px}.ic{height:48px}.id{border:2px solid rgba(255, 255, 255, 1)}.ie{z-index:0}.if{box-shadow:none}.ig{border:1px solid rgba(0, 0, 0, 0.05)}.ih{margin-left:-12px}.ii{width:28px}.ij{height:28px}.ik{z-index:1}.il{width:24px}.im{margin-bottom:2px}.in{flex-wrap:nowrap}.io{font-size:16px}.ip{line-height:24px}.ir{margin:0 8px}.is{display:inline}.it{color:rgba(73, 139, 209, 1)}.iu{fill:rgba(73, 139, 209, 1)}.ix{flex:0 0 auto}.ja{flex-wrap:wrap}.jd{white-space:pre-wrap}.je{margin-right:4px}.jf{overflow:hidden}.jg{max-height:20px}.jh{text-overflow:ellipsis}.ji{display:-webkit-box}.jj{-webkit-line-clamp:1}.jk{-webkit-box-orient:vertical}.jl{word-break:break-all}.jn{padding-left:8px}.jo{padding-right:8px}.kp> *{flex-shrink:0}.kq{overflow-x:scroll}.kr::-webkit-scrollbar{display:none}.ks{scrollbar-width:none}.kt{-ms-overflow-style:none}.ku{width:74px}.kv{flex-direction:row}.kw{z-index:2}.kz{-webkit-user-select:none}.la{border:0}.lb{fill:rgba(117, 117, 117, 1)}.le{outline:0}.lf{user-select:none}.lg> svg{pointer-events:none}.lp{cursor:progress}.lq{margin-left:4px}.lr{margin-top:0px}.ls{opacity:1}.lt{padding:4px 0}.lw{width:16px}.ly{display:inline-flex}.me{max-width:100%}.mf{padding:8px 2px}.mg svg{color:#6B6B6B}.mx{line-height:1.58}.my{letter-spacing:-0.004em}.mz{font-family:source-serif-pro, Georgia, Cambria, "Times New Roman", Times, serif}.nu{margin-bottom:-0.46em}.nv{font-style:italic}.nw{padding:2px 4px}.nx{font-size:75%}.ny> strong{font-family:inherit}.nz{font-family:source-code-pro, Menlo, Monaco, "Courier New", Courier, monospace}.oa{line-height:1.12}.ob{letter-spacing:-0.022em}.oc{font-weight:600}.ox{margin-bottom:-0.28em}.oy{line-height:1.18}.pm{margin-bottom:-0.31em}.ps{margin-left:auto}.pt{margin-right:auto}.pu{max-width:1068px}.qa{clear:both}.qc{cursor:zoom-in}.qd{z-index:auto}.qf{height:auto}.qg{text-decoration:underline}.qh{list-style-type:decimal}.qi{margin-left:30px}.qj{padding-left:0px}.qp{list-style-type:disc}.qq{max-width:1500px}.qr{max-width:1286px}.qs{max-width:1184px}.qt{max-width:522px}.qu{max-width:688px}.qv{max-width:1465px}.qw{max-width:1600px}.qx{margin-bottom:40px}.qy{margin-top:6px}.qz{margin-top:8px}.ra{margin-right:8px}.rb{padding:8px 16px}.rc{border-radius:100px}.rd{transition:background 300ms ease}.rf{white-space:nowrap}.rg{margin-bottom:26px}.rh{border-top:none}.ri{margin-bottom:14px}.rj{height:52px}.rk{max-height:52px}.rl{box-sizing:content-box}.rm{position:static}.ro{max-width:155px}.ru{margin-right:20px}.sa{height:0px}.sb{margin-bottom:48px}.sp{border-radius:2px}.sr{height:64px}.ss{width:64px}.st{align-self:flex-end}.su{flex:1 1 auto}.ta{padding-right:4px}.tb{font-weight:500}.ti{margin-top:16px}.tj{color:rgba(255, 255, 255, 1)}.tk{fill:rgba(255, 255, 255, 1)}.tl{background:rgba(25, 25, 25, 1)}.tm{border-color:rgba(25, 25, 25, 1)}.tp:disabled{opacity:0.1}.tq:disabled:hover{background:rgba(25, 25, 25, 1)}.tr:disabled:hover{border-color:rgba(25, 25, 25, 1)}.ua{gap:18px}.ub{fill:rgba(61, 61, 61, 1)}.ud{margin-top:32px}.ue{fill:#242424}.uf{background:0}.ug{border-color:#242424}.uh:disabled:hover{color:#242424}.ui:disabled:hover{fill:#242424}.uj:disabled:hover{border-color:#242424}.uu{border-bottom:solid 1px #E5E5E5}.uv{margin-top:72px}.uw{padding:24px 0}.ux{margin-bottom:0px}.uy{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)}.iq:hover{text-decoration:underline}.iv:hover:not(:disabled){color:rgba(68, 119, 175, 1)}.iw:hover:not(:disabled){fill:rgba(68, 119, 175, 1)}.ld:hover{fill:rgba(8, 8, 8, 1)}.lu:hover{fill:#000000}.lv:hover p{color:#000000}.lx:hover{color:#000000}.mh:hover svg{color:#000000}.re:hover{background-color:#F2F2F2}.sq:hover{background-color:none}.tn:hover{background:#000000}.to:hover{border-color:#242424}.uc:hover{fill:rgba(25, 25, 25, 1)}.bd:focus-within path{fill:#242424}.lc:focus{fill:rgba(8, 8, 8, 1)}.mi:focus svg{color:#000000}.qe:focus{transform:scale(1.01)}.lh:active{border-style:none}</style><style type="text/css" data-fela-rehydration="570" 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:68px}.gc{max-width:680px}.hq{font-size:42px}.hr{margin-top:1.19em}.hs{margin-bottom:32px}.ht{line-height:52px}.hu{letter-spacing:-0.011em}.hz{align-items:center}.kb{border-top:solid 1px #F2F2F2}.kc{border-bottom:solid 1px #F2F2F2}.kd{margin:32px 0 0}.ke{padding:3px 8px}.kn> *{margin-right:24px}.ko> :last-child{margin-right:0}.lo{margin-top:0px}.md{margin:0}.nq{font-size:20px}.nr{margin-top:2.14em}.ns{line-height:32px}.nt{letter-spacing:-0.003em}.ot{font-size:24px}.ou{margin-top:1.95em}.ov{line-height:30px}.ow{letter-spacing:-0.016em}.pj{margin-top:1.72em}.pk{line-height:24px}.pl{letter-spacing:0}.pr{margin-top:0.94em}.pz{margin-top:56px}.qo{margin-top:1.14em}.rt{display:inline-block}.rz{margin-bottom:104px}.sc{flex-direction:row}.sf{margin-bottom:0}.sg{margin-right:20px}.sv{max-width:500px}.tw{margin-bottom:88px}.tz{margin-bottom:72px}.uo{width:min-width}.ut{padding-top:72px}</style><style type="text/css" data-fela-rehydration="570" data-fela-type="RULE" media="all and (max-width: 1079.98px)">.e{display:none}.ln{margin-top:0px}.rs{display:inline-block}</style><style type="text/css" data-fela-rehydration="570" data-fela-type="RULE" media="all and (max-width: 903.98px)">.f{display:none}.lm{margin-top:0px}.rr{display:inline-block}</style><style type="text/css" data-fela-rehydration="570" data-fela-type="RULE" media="all and (max-width: 727.98px)">.g{display:none}.lk{margin-top:0px}.ll{margin-right:0px}.rq{display:inline-block}</style><style type="text/css" data-fela-rehydration="570" 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:4px}.gw{font-size:32px}.gx{margin-top:1.01em}.gy{margin-bottom:24px}.gz{line-height:38px}.ha{letter-spacing:-0.014em}.hv{align-items:flex-start}.iy{flex-direction:column}.jb{margin-bottom:2px}.jp{margin:24px -24px 0}.jq{padding:0}.kf> *{margin-right:8px}.kg> :last-child{margin-right:24px}.kx{margin-left:0px}.li{margin-top:0px}.lj{margin-right:0px}.lz{margin:0}.mj{border:1px solid #F2F2F2}.mk{border-radius:99em}.ml{padding:0px 16px 0px 12px}.mm{height:38px}.mn{align-items:center}.mp svg{margin-right:8px}.na{font-size:18px}.nb{margin-top:1.56em}.nc{line-height:28px}.nd{letter-spacing:-0.003em}.od{font-size:20px}.oe{margin-top:1.2em}.of{line-height:24px}.og{letter-spacing:0}.oz{font-size:16px}.pa{margin-top:1.23em}.pn{margin-top:0.67em}.pv{margin-top:40px}.qk{margin-top:1.34em}.rp{display:inline-block}.rv{margin-bottom:96px}.sn{margin-bottom:20px}.so{margin-right:0}.sz{max-width:100%}.tc{font-size:24px}.td{line-height:30px}.te{letter-spacing:-0.016em}.ts{margin-bottom:64px}.uk{width:100%}.up{padding-top:48px}.mo:hover{border-color:#E5E5E5}</style><style type="text/css" data-fela-rehydration="570" 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:68px}.gb{max-width:680px}.hl{font-size:42px}.hm{margin-top:1.19em}.hn{margin-bottom:32px}.ho{line-height:52px}.hp{letter-spacing:-0.011em}.hy{align-items:center}.jx{border-top:solid 1px #F2F2F2}.jy{border-bottom:solid 1px #F2F2F2}.jz{margin:32px 0 0}.ka{padding:3px 8px}.kl> *{margin-right:24px}.km> :last-child{margin-right:0}.mc{margin:0}.nm{font-size:20px}.nn{margin-top:2.14em}.no{line-height:32px}.np{letter-spacing:-0.003em}.op{font-size:24px}.oq{margin-top:1.95em}.or{line-height:30px}.os{letter-spacing:-0.016em}.pg{margin-top:1.72em}.ph{line-height:24px}.pi{letter-spacing:0}.pq{margin-top:0.94em}.py{margin-top:56px}.qn{margin-top:1.14em}.ry{margin-bottom:104px}.sd{flex-direction:row}.sh{margin-bottom:0}.si{margin-right:20px}.sw{max-width:500px}.tv{margin-bottom:88px}.ty{margin-bottom:72px}.un{width:min-width}.us{padding-top:72px}</style><style type="text/css" data-fela-rehydration="570" 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:68px}.ga{max-width:680px}.hg{font-size:42px}.hh{margin-top:1.19em}.hi{margin-bottom:32px}.hj{line-height:52px}.hk{letter-spacing:-0.011em}.hx{align-items:center}.jt{border-top:solid 1px #F2F2F2}.ju{border-bottom:solid 1px #F2F2F2}.jv{margin:32px 0 0}.jw{padding:3px 8px}.kj> *{margin-right:24px}.kk> :last-child{margin-right:0}.mb{margin:0}.ni{font-size:20px}.nj{margin-top:2.14em}.nk{line-height:32px}.nl{letter-spacing:-0.003em}.ol{font-size:24px}.om{margin-top:1.95em}.on{line-height:30px}.oo{letter-spacing:-0.016em}.pd{margin-top:1.72em}.pe{line-height:24px}.pf{letter-spacing:0}.pp{margin-top:0.94em}.px{margin-top:56px}.qm{margin-top:1.14em}.rx{margin-bottom:104px}.se{flex-direction:row}.sj{margin-bottom:0}.sk{margin-right:20px}.sx{max-width:500px}.tu{margin-bottom:88px}.tx{margin-bottom:72px}.um{width:min-width}.ur{padding-top:72px}</style><style type="text/css" data-fela-rehydration="570" 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:4px}.hb{font-size:32px}.hc{margin-top:1.01em}.hd{margin-bottom:24px}.he{line-height:38px}.hf{letter-spacing:-0.014em}.hw{align-items:flex-start}.iz{flex-direction:column}.jc{margin-bottom:2px}.jr{margin:24px 0 0}.js{padding:0}.kh> *{margin-right:8px}.ki> :last-child{margin-right:8px}.ky{margin-left:0px}.ma{margin:0}.mq{border:1px solid #F2F2F2}.mr{border-radius:99em}.ms{padding:0px 16px 0px 12px}.mt{height:38px}.mu{align-items:center}.mw svg{margin-right:8px}.ne{font-size:18px}.nf{margin-top:1.56em}.ng{line-height:28px}.nh{letter-spacing:-0.003em}.oh{font-size:20px}.oi{margin-top:1.2em}.oj{line-height:24px}.ok{letter-spacing:0}.pb{font-size:16px}.pc{margin-top:1.23em}.po{margin-top:0.67em}.pw{margin-top:40px}.ql{margin-top:1.34em}.rw{margin-bottom:96px}.sl{margin-bottom:20px}.sm{margin-right:0}.sy{max-width:100%}.tf{font-size:24px}.tg{line-height:30px}.th{letter-spacing:-0.016em}.tt{margin-bottom:64px}.ul{width:100%}.uq{padding-top:48px}.mv:hover{border-color:#E5E5E5}</style><style type="text/css" data-fela-rehydration="570" data-fela-type="RULE" media="print">.rn{display:none}</style><style type="text/css" data-fela-rehydration="570" data-fela-type="RULE" media="(orientation: landscape) and (max-width: 903.98px)">.jm{max-height:none}</style><style type="text/css" data-fela-rehydration="570" data-fela-type="RULE" media="(prefers-reduced-motion: no-preference)">.qb{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%2F893c7b9af1ff&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%2Fwhats-new-in-flutter-3-3-893c7b9af1ff&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%2Fwhats-new-in-flutter-3-3-893c7b9af1ff&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="d2d4" 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 hr hs ht hu bk" data-testid="storyTitle">What’s new in Flutter 3.3</h1><div><div class="speechify-ignore ab cp"><div class="speechify-ignore bh l"><div class="hv hw hx hy hz ab"><div><div class="ab ia"><div><div class="bm" aria-hidden="false"><a rel="noopener follow" href="/@kevinchisholm?source=post_page---byline--893c7b9af1ff--------------------------------"><div class="l ib ic by id ie"><div class="l fj"><img alt="Kevin Chisholm" class="l fd by dd de cx" src="https://miro.medium.com/v2/resize:fill:88:88/1*HEfsynQuQpVrGR-qdGeSvg.jpeg" width="44" height="44" loading="lazy" data-testid="authorPhoto"/><div class="if by l dd de fs n ig ft"></div></div></div></a></div></div><div class="ih ab fj"><div><div class="bm" aria-hidden="false"><a href="https://medium.com/flutter?source=post_page---byline--893c7b9af1ff--------------------------------" rel="noopener follow"><div class="l ii ij by id ik"><div class="l fj"><img alt="Flutter" class="l fd by br il 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="if by l br il fs n ig 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="im ab q"><div class="ab q in"><div class="ab q"><div><div class="bm" aria-hidden="false"><p class="bf b io ip bk"><a class="af ag ah ai aj ak al am an ao ap aq ar iq" data-testid="authorName" rel="noopener follow" href="/@kevinchisholm?source=post_page---byline--893c7b9af1ff--------------------------------">Kevin Chisholm</a></p></div></div></div><span class="ir is" aria-hidden="true"><span class="bf b bg z du">·</span></span><p class="bf b io ip du"><span><a class="it iu ah ai aj ak al am an ao ap aq ar ex iv iw" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fsubscribe%2Fuser%2F7cb43f46877f&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fwhats-new-in-flutter-3-3-893c7b9af1ff&amp;user=Kevin+Chisholm&amp;userId=7cb43f46877f&amp;source=post_page-7cb43f46877f--byline--893c7b9af1ff---------------------post_header-----------">Follow</a></span></p></div></div></span></div></div><div class="l ix"><span class="bf b bg z du"><div class="ab cn iy iz ja"><div class="jb jc ab"><div class="bf b bg z du ab jd"><span class="je l ix">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 iq ab q" data-testid="publicationName" href="https://medium.com/flutter?source=post_page---byline--893c7b9af1ff--------------------------------" rel="noopener follow"><p class="bf b bg z jf jg jh ji jj jk jl jm bk">Flutter</p></a></div></div></div><div class="h k"><span class="ir is" 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">9 min read</span><div class="jn jo l" aria-hidden="true"><span class="l" aria-hidden="true"><span class="bf b bg z du">·</span></span></div><span data-testid="storyPublishDate">Aug 30, 2022</span></div></span></div></span></div></div></div><div class="ab cp jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke"><div class="h k w fg fh q"><div class="ku l"><div class="ab q kv kw"><div class="pw-multi-vote-icon fj je kx ky kz"><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%2F893c7b9af1ff&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fwhats-new-in-flutter-3-3-893c7b9af1ff&amp;user=Kevin+Chisholm&amp;userId=7cb43f46877f&amp;source=---header_actions--893c7b9af1ff---------------------clap_footer-----------"><div><div class="bm" aria-hidden="false"><div class="la ao lb lc ld le am lf lg lh kz"><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 li lj lk ll lm ln lo"><p class="bf b dv z du"><span class="lp">--</span></p></div></div></div><div><div class="bm" aria-hidden="false"><button class="ao la ls lt ab q fk lu lv" aria-label="responses"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" class="lr"><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 lq lr">14</span></p></button></div></div></div><div class="ab q kf kg kh ki kj kk kl km kn ko kp kq kr ks kt"><div class="lw 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%2F893c7b9af1ff&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fwhats-new-in-flutter-3-3-893c7b9af1ff&amp;source=---header_actions--893c7b9af1ff---------------------bookmark_footer-----------"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" fill="none" viewBox="0 0 25 25" class="du lx" 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 ly cn"><div class="l ae"><div class="ab cb"><div class="lz ma mb mc md me ci bh"><div class="ab"><div class="bm bh" 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 mf an ao ap ex mg mh lv mi mj mk ml mm s mn mo mp mq mr ms mt u mu mv mw"><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 mf an ao ap ex mg mh lv mi mj mk ml mm s mn mo mp mq mr ms mt u mu mv mw"><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="4afa" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk"><em class="nv">Exciting updates for text handling, performance improvements, and more!</em></p><p id="9cb5" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">Welcome to <strong class="mz gv">Flutter 3.3</strong>! Only three months ago we announced Flutter 3, a massive milestone that included stable support for all platforms! The good news is that the momentum since this major release has not slowed down. Since the release of Flutter 3, Flutter has merged 5,687 pull requests.</p><p id="18b9" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">This release brings updates to Flutter web, desktop, text handling improvements in performance — and much more!</p><p id="487b" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">We are also introducing exciting updates to the <code class="cx nw nx ny nz b">go_router</code> package, DevTools, and VS Code extensions. Keep reading to learn more.</p><h1 id="3572" class="oa ob gu bf oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox bk">Framework</h1><h2 id="86d8" class="oy ob gu bf oc oz pa dy og pb pc ea ok ni pd pe pf nm pg ph pi nq pj pk pl pm bk">Global Selection</h2><p id="425a" class="pw-post-body-paragraph mx my gu mz b na pn nc nd ne po ng nh ni pp nk nl nm pq no np nq pr ns nt nu gn bk">Until now, Flutter web apps didn’t match the expected behavior when attempting to select text. Like Flutter apps, native web applications are composed of a tree of elements. In a traditional web app, you can select multiple web elements with a single sweeping gesture, something that couldn’t be easily done on a Flutter web app.</p><p id="06c7" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">Today that all changes! With the introduction of the <code class="cx nw nx ny nz b">SelectableArea</code> widget, any child of the <code class="cx nw nx ny nz b">SelectableArea</code> widget has selection enabled for free!</p><figure class="pv pw px py pz qa ps pt paragraph-image"><div role="button" tabindex="0" class="qb qc fj qd bh qe"><div class="ps pt pu"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*4Mac8uQL3ynXVIuD 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*4Mac8uQL3ynXVIuD 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*4Mac8uQL3ynXVIuD 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*4Mac8uQL3ynXVIuD 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*4Mac8uQL3ynXVIuD 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*4Mac8uQL3ynXVIuD 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*4Mac8uQL3ynXVIuD 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*4Mac8uQL3ynXVIuD 640w, https://miro.medium.com/v2/resize:fit:720/0*4Mac8uQL3ynXVIuD 720w, https://miro.medium.com/v2/resize:fit:750/0*4Mac8uQL3ynXVIuD 750w, https://miro.medium.com/v2/resize:fit:786/0*4Mac8uQL3ynXVIuD 786w, https://miro.medium.com/v2/resize:fit:828/0*4Mac8uQL3ynXVIuD 828w, https://miro.medium.com/v2/resize:fit:1100/0*4Mac8uQL3ynXVIuD 1100w, https://miro.medium.com/v2/resize:fit:1400/0*4Mac8uQL3ynXVIuD 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 me qf c" width="700" height="335" loading="lazy" role="presentation"/></picture></div></div></figure><p id="65fb" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">To take advantage of this powerful new feature, simply wrap your route body (such as the <code class="cx nw nx ny nz b">Scaffold</code>) with the <code class="cx nw nx ny nz b">SelectionArea</code> widget and let Flutter do the rest.</p><p id="f80c" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">For a more comprehensive deep dive into this awesome new feature, please visit the <code class="cx nw nx ny nz b"><a class="af qg" href="https://api.flutter.dev/flutter/material/SelectionArea-class.html" rel="noopener ugc nofollow" target="_blank">SelectableArea</a></code><a class="af qg" href="https://api.flutter.dev/flutter/material/SelectionArea-class.html" rel="noopener ugc nofollow" target="_blank"> API</a> page.</p><h2 id="7e82" class="oy ob gu bf oc oz pa dy og pb pc ea ok ni pd pe pf nm pg ph pi nq pj pk pl pm bk">Trackpad input</h2><p id="47a9" class="pw-post-body-paragraph mx my gu mz b na pn nc nd ne po ng nh ni pp nk nl nm pq no np nq pr ns nt nu gn bk">Flutter 3.3 provides improved support for trackpad input. This not only provides richer and smoother control, but also reduces misinterpretation in certain cases. For an example of this misinterpretation, check out the <a class="af qg" href="https://docs.flutter.dev/cookbook/effects/drag-a-widget" rel="noopener ugc nofollow" target="_blank">Drag a UI element</a> page in the <a class="af qg" href="https://docs.flutter.dev/cookbook" rel="noopener ugc nofollow" target="_blank">Flutter cookbook</a>. Scroll to the bottom of the page to get to the DartPad instance, and perform the following steps:</p><ol class=""><li id="3928" class="mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu qh qi qj bk">Size the window smaller so that the upper part presents a scrollbar</li><li id="974f" class="mx my gu mz b na qk nc nd ne ql ng nh ni qm nk nl nm qn no np nq qo ns nt nu qh qi qj bk">Hover over the upper part</li><li id="74ce" class="mx my gu mz b na qk nc nd ne ql ng nh ni qm nk nl nm qn no np nq qo ns nt nu qh qi qj bk">Use a trackpad to scroll</li><li id="1d58" class="mx my gu mz b na qk nc nd ne ql ng nh ni qm nk nl nm qn no np nq qo ns nt nu qh qi qj bk">Prior to installing Flutter 3.3, scrolling on a trackpad drags the item because Flutter was dispatching emulated general events</li><li id="afbb" class="mx my gu mz b na qk nc nd ne ql ng nh ni qm nk nl nm qn no np nq qo ns nt nu qh qi qj bk">After installing Flutter 3.3, scrolling on a trackpad correctly scrolls the list because Flutter is delivering the “scrolling” gesture, which isn’t recognized by the cards, but <em class="nv">is</em> recognized by the scroll view</li></ol><p id="e1e3" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">For more information, see the<a class="af qg" href="https://docs.google.com/document/d/1oRvebwjpsC3KlxN1gOYnEdxtNpQDYpPtUFAkmTUe-K8/edit?resourcekey=0-pt4_T7uggSTrsq2gWeGsYQ" rel="noopener ugc nofollow" target="_blank"> Flutter Trackpad Gesture</a> design doc, and the following PRs on GitHub:</p><ul class=""><li id="877d" class="mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu qp qi qj bk">PR 89944: <a class="af qg" href="https://github.com/flutter/flutter/pull/89944" rel="noopener ugc nofollow" target="_blank">Support trackpad gestures in framework</a></li><li id="92ea" class="mx my gu mz b na qk nc nd ne ql ng nh ni qm nk nl nm qn no np nq qo ns nt nu qp qi qj bk">PR 31591: <a class="af qg" href="https://github.com/flutter/engine/pull/31591" rel="noopener ugc nofollow" target="_blank">iPad trackpad gestures</a></li><li id="7077" class="mx my gu mz b na qk nc nd ne ql ng nh ni qm nk nl nm qn no np nq qo ns nt nu qp qi qj bk">PR 34060: <a class="af qg" href="https://github.com/flutter/engine/pull/34060" rel="noopener ugc nofollow" target="_blank">Re-land “ChromeOS/Android trackpad gestures”</a></li><li id="79fc" class="mx my gu mz b na qk nc nd ne ql ng nh ni qm nk nl nm qn no np nq qo ns nt nu qp qi qj bk">PR 31594: <a class="af qg" href="https://github.com/flutter/engine/pull/31594" rel="noopener ugc nofollow" target="_blank">Win32 trackpad gestures</a></li><li id="8f45" class="mx my gu mz b na qk nc nd ne ql ng nh ni qm nk nl nm qn no np nq qo ns nt nu qp qi qj bk">PR 31592: <a class="af qg" href="https://github.com/flutter/engine/pull/31592" rel="noopener ugc nofollow" target="_blank">Linux trackpad gestures</a></li><li id="b967" class="mx my gu mz b na qk nc nd ne ql ng nh ni qm nk nl nm qn no np nq qo ns nt nu qp qi qj bk">PR 31593: <a class="af qg" href="https://github.com/flutter/engine/pull/31593" rel="noopener ugc nofollow" target="_blank">Mac trackpad gesturesmacOS</a></li></ul><h2 id="1f42" class="oy ob gu bf oc oz pa dy og pb pc ea ok ni pd pe pf nm pg ph pi nq pj pk pl pm bk">Scribble</h2><p id="6c60" class="pw-post-body-paragraph mx my gu mz b na pn nc nd ne po ng nh ni pp nk nl nm pq no np nq pr ns nt nu gn bk">Thanks to the amazing contributions of community member <a class="af qg" href="https://github.com/fbcouch" rel="noopener ugc nofollow" target="_blank">fbcouch</a>, Flutter now supports <a class="af qg" href="https://support.apple.com/guide/ipad/enter-text-with-scribble-ipad355ab2a7/ipados" rel="noopener ugc nofollow" target="_blank">Scribble</a> handwriting input using the Apple Pencil on iPadOS. This feature is enabled by default on <code class="cx nw nx ny nz b">CupertinoTextField</code>, <code class="cx nw nx ny nz b">TextField</code>, and <code class="cx nw nx ny nz b">EditableText</code>. To enable this feature for your end users, simply upgrade to Flutter 3.3.</p><figure class="pv pw px py pz qa ps pt paragraph-image"><div role="button" tabindex="0" class="qb qc fj qd bh qe"><div class="ps pt qq"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*SlsnQUfdOTijdsyF 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*SlsnQUfdOTijdsyF 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*SlsnQUfdOTijdsyF 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*SlsnQUfdOTijdsyF 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*SlsnQUfdOTijdsyF 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*SlsnQUfdOTijdsyF 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*SlsnQUfdOTijdsyF 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*SlsnQUfdOTijdsyF 640w, https://miro.medium.com/v2/resize:fit:720/0*SlsnQUfdOTijdsyF 720w, https://miro.medium.com/v2/resize:fit:750/0*SlsnQUfdOTijdsyF 750w, https://miro.medium.com/v2/resize:fit:786/0*SlsnQUfdOTijdsyF 786w, https://miro.medium.com/v2/resize:fit:828/0*SlsnQUfdOTijdsyF 828w, https://miro.medium.com/v2/resize:fit:1100/0*SlsnQUfdOTijdsyF 1100w, https://miro.medium.com/v2/resize:fit:1400/0*SlsnQUfdOTijdsyF 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 me qf c" width="700" height="160" loading="lazy" role="presentation"/></picture></div></div></figure><h2 id="4e08" class="oy ob gu bf oc oz pa dy og pb pc ea ok ni pd pe pf nm pg ph pi nq pj pk pl pm bk">Text input</h2><p id="e532" class="pw-post-body-paragraph mx my gu mz b na pn nc nd ne po ng nh ni pp nk nl nm pq no np nq pr ns nt nu gn bk">To improve support for rich text editing, this release introduces the ability to receive granular text updates from the platform’s <code class="cx nw nx ny nz b">TextInputPlugin</code>. Previously, the <code class="cx nw nx ny nz b">TextInputClient</code> only delivered the new editing state with no delta between the old and new, <code class="cx nw nx ny nz b">TextEditingDeltas</code> and the <code class="cx nw nx ny nz b">DeltaTextInputClient</code> fill this information gap. Having access to these deltas allows you to build an input field with styled ranges that expand and contract as you type. To learn more, check out the <a class="af qg" href="https://flutter.github.io/samples/rich_text_editor.html" rel="noopener ugc nofollow" target="_blank">Rich Text Editor demo</a>.</p><h1 id="f6d8" class="oa ob gu bf oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox bk">Material Design 3</h1><p id="74d3" class="pw-post-body-paragraph mx my gu mz b na pn nc nd ne po ng nh ni pp nk nl nm pq no np nq pr ns nt nu gn bk">The Flutter team continues to migrate more Material Design 3 components to Flutter. This release includes updates to <code class="cx nw nx ny nz b"><a class="af qg" href="https://api.flutter.dev/flutter/material/IconButton-class.html" rel="noopener ugc nofollow" target="_blank">IconButton</a></code>, <code class="cx nw nx ny nz b"><a class="af qg" href="https://api.flutter.dev/flutter/material/Chip-class.html" rel="noopener ugc nofollow" target="_blank">Chips</a></code>, and large and medium variants for <code class="cx nw nx ny nz b"><a class="af qg" href="https://api.flutter.dev/flutter/material/AppBar-class.html" rel="noopener ugc nofollow" target="_blank">AppBar</a></code>.</p><p id="7b92" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">To monitor the progress on the Material Design 3 migration, check out <a class="af qg" href="https://github.com/flutter/flutter/issues/91605" rel="noopener ugc nofollow" target="_blank">Bring Material 3 to Flutter</a> on GitHub.</p><h2 id="9f96" class="oy ob gu bf oc oz pa dy og pb pc ea ok ni pd pe pf nm pg ph pi nq pj pk pl pm bk">IconButton</h2><figure class="pv pw px py pz qa ps pt paragraph-image"><div role="button" tabindex="0" class="qb qc fj qd bh qe"><div class="ps pt qr"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*AxLlKvPfaiODtzch 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*AxLlKvPfaiODtzch 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*AxLlKvPfaiODtzch 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*AxLlKvPfaiODtzch 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*AxLlKvPfaiODtzch 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*AxLlKvPfaiODtzch 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*AxLlKvPfaiODtzch 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*AxLlKvPfaiODtzch 640w, https://miro.medium.com/v2/resize:fit:720/0*AxLlKvPfaiODtzch 720w, https://miro.medium.com/v2/resize:fit:750/0*AxLlKvPfaiODtzch 750w, https://miro.medium.com/v2/resize:fit:786/0*AxLlKvPfaiODtzch 786w, https://miro.medium.com/v2/resize:fit:828/0*AxLlKvPfaiODtzch 828w, https://miro.medium.com/v2/resize:fit:1100/0*AxLlKvPfaiODtzch 1100w, https://miro.medium.com/v2/resize:fit:1400/0*AxLlKvPfaiODtzch 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 me qf c" width="700" height="189" loading="lazy" role="presentation"/></picture></div></div></figure><h2 id="4d79" class="oy ob gu bf oc oz pa dy og pb pc ea ok ni pd pe pf nm pg ph pi nq pj pk pl pm bk">Chip</h2><figure class="pv pw px py pz qa ps pt paragraph-image"><div role="button" tabindex="0" class="qb qc fj qd bh qe"><div class="ps pt qs"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*5fCsX84PRpjMtzx5 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*5fCsX84PRpjMtzx5 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*5fCsX84PRpjMtzx5 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*5fCsX84PRpjMtzx5 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*5fCsX84PRpjMtzx5 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*5fCsX84PRpjMtzx5 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*5fCsX84PRpjMtzx5 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*5fCsX84PRpjMtzx5 640w, https://miro.medium.com/v2/resize:fit:720/0*5fCsX84PRpjMtzx5 720w, https://miro.medium.com/v2/resize:fit:750/0*5fCsX84PRpjMtzx5 750w, https://miro.medium.com/v2/resize:fit:786/0*5fCsX84PRpjMtzx5 786w, https://miro.medium.com/v2/resize:fit:828/0*5fCsX84PRpjMtzx5 828w, https://miro.medium.com/v2/resize:fit:1100/0*5fCsX84PRpjMtzx5 1100w, https://miro.medium.com/v2/resize:fit:1400/0*5fCsX84PRpjMtzx5 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 me qf c" width="700" height="730" loading="lazy" role="presentation"/></picture></div></div></figure><h2 id="c1e1" class="oy ob gu bf oc oz pa dy og pb pc ea ok ni pd pe pf nm pg ph pi nq pj pk pl pm bk">Medium and large AppBar</h2><figure class="pv pw px py pz qa ps pt paragraph-image"><div class="ps pt qt"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*jVFZWFsCOuzeqzTb 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*jVFZWFsCOuzeqzTb 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*jVFZWFsCOuzeqzTb 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*jVFZWFsCOuzeqzTb 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*jVFZWFsCOuzeqzTb 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*jVFZWFsCOuzeqzTb 1100w, https://miro.medium.com/v2/resize:fit:1044/format:webp/0*jVFZWFsCOuzeqzTb 1044w" 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, 522px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/0*jVFZWFsCOuzeqzTb 640w, https://miro.medium.com/v2/resize:fit:720/0*jVFZWFsCOuzeqzTb 720w, https://miro.medium.com/v2/resize:fit:750/0*jVFZWFsCOuzeqzTb 750w, https://miro.medium.com/v2/resize:fit:786/0*jVFZWFsCOuzeqzTb 786w, https://miro.medium.com/v2/resize:fit:828/0*jVFZWFsCOuzeqzTb 828w, https://miro.medium.com/v2/resize:fit:1100/0*jVFZWFsCOuzeqzTb 1100w, https://miro.medium.com/v2/resize:fit:1044/0*jVFZWFsCOuzeqzTb 1044w" 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, 522px"/><img alt="" class="bh me qf c" width="522" height="291" loading="lazy" role="presentation"/></picture></div></figure><figure class="pv pw px py pz qa ps pt paragraph-image"><div class="ps pt qt"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*c4wovLXB8TpulHVU 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*c4wovLXB8TpulHVU 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*c4wovLXB8TpulHVU 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*c4wovLXB8TpulHVU 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*c4wovLXB8TpulHVU 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*c4wovLXB8TpulHVU 1100w, https://miro.medium.com/v2/resize:fit:1044/format:webp/0*c4wovLXB8TpulHVU 1044w" 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, 522px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/0*c4wovLXB8TpulHVU 640w, https://miro.medium.com/v2/resize:fit:720/0*c4wovLXB8TpulHVU 720w, https://miro.medium.com/v2/resize:fit:750/0*c4wovLXB8TpulHVU 750w, https://miro.medium.com/v2/resize:fit:786/0*c4wovLXB8TpulHVU 786w, https://miro.medium.com/v2/resize:fit:828/0*c4wovLXB8TpulHVU 828w, https://miro.medium.com/v2/resize:fit:1100/0*c4wovLXB8TpulHVU 1100w, https://miro.medium.com/v2/resize:fit:1044/0*c4wovLXB8TpulHVU 1044w" 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, 522px"/><img alt="" class="bh me qf c" width="522" height="291" loading="lazy" role="presentation"/></picture></div></figure><h1 id="03a6" class="oa ob gu bf oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox bk">Desktop</h1><h2 id="5edb" class="oy ob gu bf oc oz pa dy og pb pc ea ok ni pd pe pf nm pg ph pi nq pj pk pl pm bk">Windows</h2><p id="3a9f" class="pw-post-body-paragraph mx my gu mz b na pn nc nd ne po ng nh ni pp nk nl nm pq no np nq pr ns nt nu gn bk">Previously, the Windows desktop application’s version was set by a file specific to the Windows application. This behavior was inconsistent with the way other platforms set their versions.</p><p id="8250" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">Windows desktop application versions can now be set from your projects <code class="cx nw nx ny nz b">pubspec.yaml</code> file and build arguments. This makes it easier to enable auto updates for your end customers to get the latest and greatest when an application update is pushed.</p><p id="a99c" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">For more information on setting your applications version, follow the documentation on <a class="af qg" href="https://docs.flutter.dev/deployment/windows#updating-the-apps-version-number" rel="noopener ugc nofollow" target="_blank">docs.flutter.dev</a> and the <a class="af qg" href="https://docs.flutter.dev/development/platform-integration/windows/version-migration" rel="noopener ugc nofollow" target="_blank">migration guide</a>. Projects created before Flutter 3.3 need to be updated to get this feature.</p><h1 id="c39f" class="oa ob gu bf oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox bk">Packages</h1><h2 id="8fe7" class="oy ob gu bf oc oz pa dy og pb pc ea ok ni pd pe pf nm pg ph pi nq pj pk pl pm bk">go_router</h2><p id="6a19" class="pw-post-body-paragraph mx my gu mz b na pn nc nd ne po ng nh ni pp nk nl nm pq no np nq pr ns nt nu gn bk">When designing apps with complex navigation needs, things can get pretty hard to wrap your head around. To extend Flutter’s native navigation API, the team has published a new version of the <code class="cx nw nx ny nz b">go_router</code> package, making it simpler to design routing logic that works across mobile, desktop, and the web.</p><p id="8ec1" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">The <code class="cx nw nx ny nz b"><a class="af qg" href="https://pub.dev/packages/go_router" rel="noopener ugc nofollow" target="_blank">go router</a></code> package, maintained by the Flutter team, simplifies routing by providing a declarative, url-based API, making it easier to navigate and handle deep-links. The latest version (4.3) enables apps to redirect using asynchronous code, and includes other breaking changes described in the <a class="af qg" href="https://docs.google.com/document/d/10l22o4ml4Ss83UyzqUC8_xYOv_QjZEi80lJDNE4q7wM/edit?usp=sharing&amp;resourcekey=0-U-BXBQzNfkk4v241Ow-vZg" rel="noopener ugc nofollow" target="_blank">migration guide</a>.</p><p id="15f7" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">For more information, check out the <a class="af qg" href="https://docs.flutter.dev/development/ui/navigation" rel="noopener ugc nofollow" target="_blank">Navigation and routing</a> page on docs.flutter.dev.</p><h1 id="9e02" class="oa ob gu bf oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox bk">VS Code extension enhancements</h1><p id="66e0" class="pw-post-body-paragraph mx my gu mz b na pn nc nd ne po ng nh ni pp nk nl nm pq no np nq pr ns nt nu gn bk">The Visual Studio Code extension for Flutter has several updates including improvements for adding dependencies. You can now add multiple, comma-separated dependencies in one step using <strong class="mz gv">Dart: Add Dependency</strong>.</p><figure class="pv pw px py pz qa ps pt paragraph-image"><div class="ps pt qu"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*vFIZ4WL4UWSTrC27 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*vFIZ4WL4UWSTrC27 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*vFIZ4WL4UWSTrC27 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*vFIZ4WL4UWSTrC27 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*vFIZ4WL4UWSTrC27 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*vFIZ4WL4UWSTrC27 1100w, https://miro.medium.com/v2/resize:fit:1376/format:webp/0*vFIZ4WL4UWSTrC27 1376w" 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, 688px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/0*vFIZ4WL4UWSTrC27 640w, https://miro.medium.com/v2/resize:fit:720/0*vFIZ4WL4UWSTrC27 720w, https://miro.medium.com/v2/resize:fit:750/0*vFIZ4WL4UWSTrC27 750w, https://miro.medium.com/v2/resize:fit:786/0*vFIZ4WL4UWSTrC27 786w, https://miro.medium.com/v2/resize:fit:828/0*vFIZ4WL4UWSTrC27 828w, https://miro.medium.com/v2/resize:fit:1100/0*vFIZ4WL4UWSTrC27 1100w, https://miro.medium.com/v2/resize:fit:1376/0*vFIZ4WL4UWSTrC27 1376w" 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, 688px"/><img alt="" class="bh me qf c" width="688" height="280" loading="lazy" role="presentation"/></picture></div></figure><p id="3f2a" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">You can read about the Visual Studio Code extension enhancements made since the last Flutter stable release at:</p><ul class=""><li id="1dd7" class="mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu qp qi qj bk"><a class="af qg" href="https://groups.google.com/g/flutter-announce/c/u1iSDMtKMVg" rel="noopener ugc nofollow" target="_blank">VS Code extensions v3.46</a></li><li id="7a5a" class="mx my gu mz b na qk nc nd ne ql ng nh ni qm nk nl nm qn no np nq qo ns nt nu qp qi qj bk"><a class="af qg" href="https://groups.google.com/g/flutter-announce/c/x4m9o93-Dng" rel="noopener ugc nofollow" target="_blank">VS Code extensions v3.44</a></li><li id="31d4" class="mx my gu mz b na qk nc nd ne ql ng nh ni qm nk nl nm qn no np nq qo ns nt nu qp qi qj bk"><a class="af qg" href="https://groups.google.com/g/flutter-announce/c/45Wsk5pISx4" rel="noopener ugc nofollow" target="_blank">VS Code extensions v3.42</a></li></ul><h1 id="4112" class="oa ob gu bf oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox bk">Flutter DevTools updates</h1><p id="9148" class="pw-post-body-paragraph mx my gu mz b na pn nc nd ne po ng nh ni pp nk nl nm pq no np nq pr ns nt nu gn bk">DevTools comes with a number of updates since the last stable Flutter release, including UX and performance improvements to data display tables for faster, less jittery scrolling of large lists of events (<a class="af qg" href="https://github.com/flutter/devtools/pull/4175" rel="noopener ugc nofollow" target="_blank">#4175</a>).</p><p id="57bb" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">For the complete list of updates since Flutter 3.0, check out the individual announcements here:</p><ul class=""><li id="a04f" class="mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu qp qi qj bk"><a class="af qg" href="https://docs.flutter.dev/development/tools/devtools/release-notes/release-notes-2.16.0" rel="noopener ugc nofollow" target="_blank">Flutter DevTools 2.16.0 release notes</a></li><li id="c3a1" class="mx my gu mz b na qk nc nd ne ql ng nh ni qm nk nl nm qn no np nq qo ns nt nu qp qi qj bk"><a class="af qg" href="https://docs.flutter.dev/development/tools/devtools/release-notes/release-notes-2.15.0" rel="noopener ugc nofollow" target="_blank">Flutter DevTools 2.15.0 release notes</a></li><li id="66c4" class="mx my gu mz b na qk nc nd ne ql ng nh ni qm nk nl nm qn no np nq qo ns nt nu qp qi qj bk"><a class="af qg" href="https://docs.flutter.dev/development/tools/devtools/release-notes/release-notes-2.14.0" rel="noopener ugc nofollow" target="_blank">Flutter DevTools 2.14.0 release notes</a></li></ul><h1 id="9286" class="oa ob gu bf oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox bk">Performance</h1><h2 id="0ce9" class="oy ob gu bf oc oz pa dy og pb pc ea ok ni pd pe pf nm pg ph pi nq pj pk pl pm bk">Raster cache improvements</h2><p id="7adc" class="pw-post-body-paragraph mx my gu mz b na pn nc nd ne po ng nh ni pp nk nl nm pq no np nq pr ns nt nu gn bk">This release increases the performance of loading images from assets by eliminating copies and reducing Dart garbage collection (GC) pressure. Previously, when loading asset images, the <code class="cx nw nx ny nz b">ImageProvider</code> API required the compressed data to be copied multiple times. First, it was copied into the native heap when opening the asset and exposing it to Dart as a typed data array. Then, it was copied a second time when that typed data array was copied to the internal storage of a <code class="cx nw nx ny nz b">ui.ImmutableBuffer</code>.</p><p id="2c36" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">With <a class="af qg" href="https://github.com/flutter/engine/pull/32999" rel="noopener ugc nofollow" target="_blank">the addition</a> of <code class="cx nw nx ny nz b">ui.ImmutableBuffer.fromAsset</code>, compressed image bytes can be loaded directly into the structure used for decoding. This approach <a class="af qg" href="https://github.com/flutter/flutter/pull/103496" rel="noopener ugc nofollow" target="_blank">requires changes</a> to the byte loading pipeline of <code class="cx nw nx ny nz b">ImageProviders</code>. This process is also faster, because it bypasses some additional scheduling overhead required bythe previous method channel-based loader. In particular, image loading time improved by nearly 2x in our microbenchmarks.</p><figure class="pv pw px py pz qa ps pt paragraph-image"><div role="button" tabindex="0" class="qb qc fj qd bh qe"><div class="ps pt qv"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*dZTaQMQri0EI7HCw 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*dZTaQMQri0EI7HCw 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*dZTaQMQri0EI7HCw 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*dZTaQMQri0EI7HCw 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*dZTaQMQri0EI7HCw 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*dZTaQMQri0EI7HCw 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*dZTaQMQri0EI7HCw 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*dZTaQMQri0EI7HCw 640w, https://miro.medium.com/v2/resize:fit:720/0*dZTaQMQri0EI7HCw 720w, https://miro.medium.com/v2/resize:fit:750/0*dZTaQMQri0EI7HCw 750w, https://miro.medium.com/v2/resize:fit:786/0*dZTaQMQri0EI7HCw 786w, https://miro.medium.com/v2/resize:fit:828/0*dZTaQMQri0EI7HCw 828w, https://miro.medium.com/v2/resize:fit:1100/0*dZTaQMQri0EI7HCw 1100w, https://miro.medium.com/v2/resize:fit:1400/0*dZTaQMQri0EI7HCw 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 me qf c" width="700" height="548" loading="lazy" role="presentation"/></picture></div></div></figure><p id="3485" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">For more information and a migration guide, see <a class="af qg" href="https://docs.flutter.dev/release/breaking-changes/image-provider-load-buffer" rel="noopener ugc nofollow" target="_blank">Adding ImageProvider.loadBuffer</a> on docs.flutter.dev.</p><h1 id="511e" class="oa ob gu bf oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox bk">Stability</h1><h2 id="388d" class="oy ob gu bf oc oz pa dy og pb pc ea ok ni pd pe pf nm pg ph pi nq pj pk pl pm bk">iOS pointer compression disabled</h2><p id="f9a6" class="pw-post-body-paragraph mx my gu mz b na pn nc nd ne po ng nh ni pp nk nl nm pq no np nq pr ns nt nu gn bk">In the 2.10 stable release, we enabled Dart’s <a class="af qg" rel="noopener" href="/dartlang/dart-2-15-7e7a598e508a#0c15">pointer compression optimization</a> on iOS. However, <a class="af qg" href="https://github.com/Yeatse" rel="noopener ugc nofollow" target="_blank">Yeatse</a>, on GitHub, <a class="af qg" href="https://github.com/flutter/flutter/issues/105183" rel="noopener ugc nofollow" target="_blank">alerted us</a> to an unintended consequence of the optimization. Dart’s pointer compression works by reserving a large virtual memory region for Dart’s heap. Since the total virtual memory allocation allowed on iOS is less than on other platforms, this large reservation reduces the amount of memory available for use by other components that reserve their own memory, for example, Flutter plugins.</p><p id="1f2c" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">While disabling pointer compression increases the memory consumed by Dart objects, it also increases the memory <em class="nv">available</em> for non-Dart parts of a Flutter application, which is more desirable overall.</p><p id="20f6" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">Apple provides an entitlement that can increase the maximum allowed virtual memory allocation for an application, however this entitlement is only supported on newer iOS versions, and wouldn’t work on devices running versions of iOS that Flutter still supports. When we are able to use this entitlement everywhere, we intend to revisit this optimization.</p><h1 id="54c0" class="oa ob gu bf oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox bk">API improvements</h1><h2 id="d668" class="oy ob gu bf oc oz pa dy og pb pc ea ok ni pd pe pf nm pg ph pi nq pj pk pl pm bk">PlatformDispatcher.onError</h2><p id="902e" class="pw-post-body-paragraph mx my gu mz b na pn nc nd ne po ng nh ni pp nk nl nm pq no np nq pr ns nt nu gn bk">In previous releases, you had to manually configure a custom <code class="cx nw nx ny nz b">Zone</code> in order to catch all of an application’s exceptions and errors. However, custom <code class="cx nw nx ny nz b">Zone</code>s were detrimental to a number of optimizations in Dart’s core libraries, which slowed down application start-up time. <strong class="mz gv">In this release, instead of using a custom </strong><code class="cx nw nx ny nz b"><strong class="mz gv">Zone</strong></code><strong class="mz gv">, you should catch all errors and exceptions by setting the </strong><code class="cx nw nx ny nz b"><strong class="mz gv">PlatformDispatcher.onError</strong></code><strong class="mz gv"> callback.</strong> For more information, check out the updated <a class="af qg" href="https://docs.flutter.dev/testing/errors" rel="noopener ugc nofollow" target="_blank">Handling errors in Flutter</a> page on docs.flutter.dev.</p><h2 id="6033" class="oy ob gu bf oc oz pa dy og pb pc ea ok ni pd pe pf nm pg ph pi nq pj pk pl pm bk">FragmentProgram changes</h2><p id="80b6" class="pw-post-body-paragraph mx my gu mz b na pn nc nd ne po ng nh ni pp nk nl nm pq no np nq pr ns nt nu gn bk">Fragment shaders written in GLSL and listed under a <code class="cx nw nx ny nz b">shaders:</code> section in the Flutter manifest of an application’s <code class="cx nw nx ny nz b">pubspec.yaml</code> file will now be automatically compiled to the correct format understood by the Engine and bundled with the application as an asset. Thanks to this change, you will no longer have to manually compile shaders using third-party tools. Going forward, you should regard the Engine’s <code class="cx nw nx ny nz b">FragmentProgram</code> API as accepting only the output of Flutter’s build tooling. This isn’t yet the case, but this change is planned for a future release, as described in the <a class="af qg" href="http://flutter.dev/go/fragment-program-support" rel="noopener ugc nofollow" target="_blank">FragmentProgram API Support improvements</a> design doc.</p><p id="1d68" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">For an example of this change, see this <a class="af qg" href="https://github.com/zanderso/fragment_shader_example" rel="noopener ugc nofollow" target="_blank">Flutter shader example</a>.</p><h2 id="18d9" class="oy ob gu bf oc oz pa dy og pb pc ea ok ni pd pe pf nm pg ph pi nq pj pk pl pm bk">Fractional translation</h2><p id="0e68" class="pw-post-body-paragraph mx my gu mz b na pn nc nd ne po ng nh ni pp nk nl nm pq no np nq pr ns nt nu gn bk">Previously, the Flutter Engine would always align composited layers to exact pixel boundaries because it improved rendering performance on older (32-bit) model iPhones. Since adding desktop support, we’ve noticed that this led to observable snapping behavior, since screen device pixel ratios are commonly much lower. For example, on low DPR screens, tooltips could be seen visibly snapping when fading in. After determining that this pixel snapping was no longer necessary for performance on newer iPhone models, <a class="af qg" href="https://github.com/flutter/flutter/issues/103909" rel="noopener ugc nofollow" target="_blank">we’ve removed this pixel snapping</a> from the Flutter Engine to improve desktop fidelity. Additionally, we also found that removing this pixel snapping stabilized a number of our golden image tests, which would frequently change with small hairline rendering differences.</p><h1 id="73be" class="oa ob gu bf oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox bk">Changes to supported platforms</h1><h2 id="be70" class="oy ob gu bf oc oz pa dy og pb pc ea ok ni pd pe pf nm pg ph pi nq pj pk pl pm bk">32-bit iOS deprecation</h2><p id="79f3" class="pw-post-body-paragraph mx my gu mz b na pn nc nd ne po ng nh ni pp nk nl nm pq no np nq pr ns nt nu gn bk">As we announced earlier with the 3.0 stable release, due to decreased usage, that release was the <a class="af qg" href="http://flutter.dev/go/rfc-32-bit-ios-unsupported" rel="noopener ugc nofollow" target="_blank">last one to support 32-bit iOS devices and iOS versions 9 and 10</a>. This change affects the iPhone 4S, iPhone 5, iPhone 5C, and the 2nd, 3d, and 4th generation iPad devices. The 3.3 stable version of Flutter and all following stable releases no longer support 32-bit iOS devices and iOS versions 9 and 10. This means that apps built against Flutter 3.3 and later won’t run on those devices.</p><h2 id="19cd" class="oy ob gu bf oc oz pa dy og pb pc ea ok ni pd pe pf nm pg ph pi nq pj pk pl pm bk">Sunsetting macOS 10.11 and 10.12</h2><p id="8c17" class="pw-post-body-paragraph mx my gu mz b na pn nc nd ne po ng nh ni pp nk nl nm pq no np nq pr ns nt nu gn bk">In the Q4 2022 stable release, we expect to drop support for macOS versions 10.11 and 10.12. This means that apps built against stable Flutter SDKs after that point will no longer work on these versions, and the minimum macOS version supported by Flutter will increase to 10.13 High Sierra.</p><h2 id="04f3" class="oy ob gu bf oc oz pa dy og pb pc ea ok ni pd pe pf nm pg ph pi nq pj pk pl pm bk">Bitcode deprecation</h2><p id="ed3e" class="pw-post-body-paragraph mx my gu mz b na pn nc nd ne po ng nh ni pp nk nl nm pq no np nq pr ns nt nu gn bk">Bitcode <a class="af qg" href="https://developer.apple.com/documentation/xcode-release-notes/xcode-14-release-notes" rel="noopener ugc nofollow" target="_blank">will no longer be accepted for iOS app submission in the upcoming Xcode 14 release</a>, and projects with bitcode enabled will emit a build warning in this version of Xcode. In light of this, Flutter will drop support for bitcode in a future stable release.</p><p id="ea35" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">By default, Flutter apps don’t have bitcode enabled, and we don’t expect this to impact many developers. However, if you have enabled bitcode manually in your Xcode project, disable it as soon as you upgrade to Xcode 14. You can do so by opening <code class="cx nw nx ny nz b">ios/Runner.xcworkspace</code> and setting the build setting <strong class="mz gv">Enable Bitcode</strong> to <strong class="mz gv">No</strong>. Add-to-app developers should disable it in the host Xcode project.</p><figure class="pv pw px py pz qa ps pt paragraph-image"><div role="button" tabindex="0" class="qb qc fj qd bh qe"><div class="ps pt qw"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*4EQPd4ednGIAhMwl 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*4EQPd4ednGIAhMwl 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*4EQPd4ednGIAhMwl 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*4EQPd4ednGIAhMwl 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*4EQPd4ednGIAhMwl 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*4EQPd4ednGIAhMwl 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*4EQPd4ednGIAhMwl 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*4EQPd4ednGIAhMwl 640w, https://miro.medium.com/v2/resize:fit:720/0*4EQPd4ednGIAhMwl 720w, https://miro.medium.com/v2/resize:fit:750/0*4EQPd4ednGIAhMwl 750w, https://miro.medium.com/v2/resize:fit:786/0*4EQPd4ednGIAhMwl 786w, https://miro.medium.com/v2/resize:fit:828/0*4EQPd4ednGIAhMwl 828w, https://miro.medium.com/v2/resize:fit:1100/0*4EQPd4ednGIAhMwl 1100w, https://miro.medium.com/v2/resize:fit:1400/0*4EQPd4ednGIAhMwl 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 me qf c" width="700" height="332" loading="lazy" role="presentation"/></picture></div></div></figure><p id="88c9" class="pw-post-body-paragraph mx my gu mz b na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu gn bk">See <a class="af qg" href="https://help.apple.com/xcode/mac/11.0/index.html?localePath=en.lproj#/devde46df08a" rel="noopener ugc nofollow" target="_blank">Apple’s documentation</a> to learn more about bitcode distribution.</p><h1 id="7129" class="oa ob gu bf oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox bk">Summary</h1><p id="709b" class="pw-post-body-paragraph mx my gu mz b na pn nc nd ne po ng nh ni pp nk nl nm pq no np nq pr ns nt nu gn bk">As we always say, the Flutter team at Google is extremely grateful for the incredible work the community puts in to make Flutter the wonderful experience that it is! We look forward to continuing to iterate on the work that has been done, focusing on what matters most — all of you!</p></div></div></div></div></section></div></div></article></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="qx qy ab ja"><div class="qz ab"><a class="ra ay am ao" rel="noopener follow" href="/tag/flutter?source=post_page-----893c7b9af1ff--------------------------------"><div class="rb fj cx rc ge rd re bf b bg z bk rf">Flutter</div></a></div><div class="qz ab"><a class="ra ay am ao" rel="noopener follow" href="/tag/flutter-app-development?source=post_page-----893c7b9af1ff--------------------------------"><div class="rb fj cx rc ge rd re bf b bg z bk rf">Flutter App Development</div></a></div><div class="qz ab"><a class="ra ay am ao" rel="noopener follow" href="/tag/release-notes?source=post_page-----893c7b9af1ff--------------------------------"><div class="rb fj cx rc ge rd re bf b bg z bk rf">Release Notes</div></a></div><div class="qz ab"><a class="ra ay am ao" rel="noopener follow" href="/tag/releases?source=post_page-----893c7b9af1ff--------------------------------"><div class="rb fj cx rc ge rd re bf b bg z bk rf">Releases</div></a></div></div><div class="rg lr l"><div class="is"><div class="bm"><p class="bf b bg z du"><div><div class="bm" aria-hidden="false"><a class="af ag ah ai aj ak al am an ao ap aq ar iq" href="http://creativecommons.org/licenses/by/4.0/" rel="noopener follow" target="_blank">Some rights reserved</a></div></div></p></div><div class="bm"><p class="bf b bg z du"><span class="fk" style="margin-left:5px;vertical-align:text-bottom"><svg xmlns="http://www.w3.org/2000/svg" width="21" height="21"><path fill-rule="evenodd" d="M10.485 2q3.58 0 6.04 2.46Q19 6.93 19 10.5q0 3.582-2.43 5.965Q13.99 19 10.486 19q-3.446 0-5.98-2.505Q2.001 13.99 2 10.5c-.001-3.49.835-4.34 2.505-6.04Q6.964 2 10.485 2m.03 1.533q-2.9 0-4.903 2.034-2.08 2.124-2.08 4.933.001 2.824 2.065 4.887 2.064 2.065 4.918 2.064 2.837 0 4.948-2.07c1.336-1.28 2.004-2.91 2.004-4.87 0-1.93-.68-3.57-2.034-4.93-1.356-1.35-2.995-2.03-4.918-2.03zm2.277 4.857v3.476h-.97v4.128H9.18v-4.128h-.972V8.39a.53.53 0 0 1 .16-.387.53.53 0 0 1 .387-.16h3.49q.215 0 .38.16a.52.52 0 0 1 .167.387M9.316 6.205q0-1.2 1.184-1.2 1.185 0 1.184 1.2 0 1.184-1.184 1.183T9.316 6.205"></path></svg></span></p></div></div></div></div></div><div class="l"></div><footer class="rh ri rj rk rl ab q rm ik c"><div class="l ae"><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ab cp rn"><div class="ab q kv"><div class="ro l"><span class="l rp rq rr e d"><div class="ab q kv kw"><div class="pw-multi-vote-icon fj je kx ky kz"><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%2F893c7b9af1ff&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fwhats-new-in-flutter-3-3-893c7b9af1ff&amp;user=Kevin+Chisholm&amp;userId=7cb43f46877f&amp;source=---footer_actions--893c7b9af1ff---------------------clap_footer-----------"><div><div class="bm" aria-hidden="false"><div class="la ao lb lc ld le am lf lg lh kz"><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 li lj lk ll lm ln lo"><p class="bf b dv z du"><span class="lp">--</span></p></div></div></span><span class="l h g f rs rt"><div class="ab q kv kw"><div class="pw-multi-vote-icon fj je kx ky kz"><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%2F893c7b9af1ff&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fwhats-new-in-flutter-3-3-893c7b9af1ff&amp;user=Kevin+Chisholm&amp;userId=7cb43f46877f&amp;source=---footer_actions--893c7b9af1ff---------------------clap_footer-----------"><div><div class="bm" aria-hidden="false"><div class="la ao lb lc ld le am lf lg lh kz"><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 li lj lk ll lm ln lo"><p class="bf b dv z du"><span class="lp">--</span></p></div></div></span></div><div class="bq ab"><div><div class="bm" aria-hidden="false"><button class="ao la ls lt ab q fk lu lv" aria-label="responses"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" class="lr"><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 lq lr">14</span></p></button></div></div></div></div><div class="ab q"><div class="ru l ix"><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%2F893c7b9af1ff&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fwhats-new-in-flutter-3-3-893c7b9af1ff&amp;source=---footer_actions--893c7b9af1ff---------------------bookmark_footer-----------"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" fill="none" viewBox="0 0 25 25" class="du lx" 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="ru l ix"><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 mf an ao ap ex mg mh lv mi"><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="rv rw rx ry rz l"><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="sa bh r qx"></div><div class="sb l"><div class="ab sc sd se iz iy"><div class="sf sg sh si sj sk sl sm sn so ab cp"><div class="h k"><a href="https://medium.com/flutter?source=post_page---post_publication_info--893c7b9af1ff--------------------------------" rel="noopener follow"><div class="fj ab"><img alt="Flutter" class="sp ib ic cx" src="https://miro.medium.com/v2/resize:fill:96:96/1*5-aoK8IBmXve5whBQM90GA.png" width="48" height="48" loading="lazy"/><div class="sp l ic ib fs n fr sq"></div></div></a></div><div class="j i d"><a href="https://medium.com/flutter?source=post_page---post_publication_info--893c7b9af1ff--------------------------------" rel="noopener follow"><div class="fj ab"><img alt="Flutter" class="sp ss sr cx" src="https://miro.medium.com/v2/resize:fill:128:128/1*5-aoK8IBmXve5whBQM90GA.png" width="64" height="64" loading="lazy"/><div class="sp l sr ss fs n fr sq"></div></div></a></div><div class="j i d st ix"><div class="ab"></div></div></div><div class="ab co su"><div class="sv sw sx sy sz 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--893c7b9af1ff--------------------------------" rel="noopener follow"><h2 class="pw-author-name bf tb tc td te tf tg th ni pe pf nm ph pi nq pk pl bk"><span class="gn ta">Published in <!-- -->Flutter</span></h2></a><div class="qz ab ia"><div class="l ix"><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 iq" rel="noopener follow" href="/flutter/followers?source=post_page---post_publication_info--893c7b9af1ff--------------------------------">56K Followers</a></span></div><div class="bf b bg z du ab jd"><span class="ir 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 iq" rel="noopener follow" href="/flutter/prospera-using-flutter-to-bring-ai-to-the-frontline-of-sales-71377810fd26?source=post_page---post_publication_info--893c7b9af1ff--------------------------------">Last published <!-- -->1 day ago</a></div></div><div class="ti 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 qg 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 sc sd se iz iy"><div class="sf sg sh si sj sk sl sm sn so ab cp"><div class="h k"><a tabindex="0" rel="noopener follow" href="/@kevinchisholm?source=post_page---post_author_info--893c7b9af1ff--------------------------------"><div class="l fj"><img alt="Kevin Chisholm" class="l fd by ic ib cx" src="https://miro.medium.com/v2/resize:fill:96:96/1*HEfsynQuQpVrGR-qdGeSvg.jpeg" width="48" height="48" loading="lazy"/><div class="fr by l ic ib fs n ay sq"></div></div></a></div><div class="j i d"><a tabindex="0" rel="noopener follow" href="/@kevinchisholm?source=post_page---post_author_info--893c7b9af1ff--------------------------------"><div class="l fj"><img alt="Kevin Chisholm" class="l fd by sr ss cx" src="https://miro.medium.com/v2/resize:fill:128:128/1*HEfsynQuQpVrGR-qdGeSvg.jpeg" width="64" height="64" loading="lazy"/><div class="fr by l sr ss fs n ay sq"></div></div></a></div><div class="j i d st ix"><div class="ab"><span><button class="bf b bg z tj rb tk tl tm tn to ev ew tp tq tr fa fb fc fd bm fe ff">Follow</button></span></div></div></div><div class="ab co su"><div class="sv sw sx sy sz l"><a class="af ag ah aj ak al am an ao ap aq ar as at ab q" rel="noopener follow" href="/@kevinchisholm?source=post_page---post_author_info--893c7b9af1ff--------------------------------"><h2 class="pw-author-name bf tb tc td te tf tg th ni pe pf nm ph pi nq pk pl bk"><span class="gn ta">Written by <!-- -->Kevin Chisholm</span></h2></a><div class="qz ab ia"><div class="l ix"><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 iq" rel="noopener follow" href="/@kevinchisholm/followers?source=post_page---post_author_info--893c7b9af1ff--------------------------------">11.7K Followers</a></span></div><div class="bf b bg z du ab jd"><span class="ir 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 iq" rel="noopener follow" href="/@kevinchisholm/following?source=post_page---post_author_info--893c7b9af1ff--------------------------------">7 Following</a></div></div><div class="ti l"><p class="bf b bg z bk"><span class="gn">Kevin Chisholm is a Technical Program Manager for Dart and Flutter at Google.</span></p></div></div></div><div class="h k"><div class="ab"><span><button class="bf b bg z tj rb tk tl tm tn to ev ew tp tq tr fa fb fc fd bm fe ff">Follow</button></span></div></div></div></div></div></div><div class="ts tt tu tv tw l"><div class="sa bh r ts tt tx ty tz"></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ab q cp"><h2 class="bf tb od of og oh oj ok ol on oo op or os ot ov ow bk">Responses (<!-- -->14<!-- -->)</h2><div class="ab ua"><div><div class="bm" aria-hidden="false"><a class="ub uc" href="https://policy.medium.com/medium-rules-30e5502c4eb4?source=post_page---post_responses--893c7b9af1ff--------------------------------" 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="ud l"><button class="bf b bg z bk rb ue uf ug lx lu to ev ew ex uh ui uj fa uk ul um un uo fb fc fd bm fe ff">See all responses</button></div></div></div></div><div class="up uq ur us ut l bx"><div class="h k j"><div class="sa bh uu uv"></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="uw ab kv ja"><div class="ux uy 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-----893c7b9af1ff--------------------------------" rel="noopener follow"><p class="bf b dv z du">Help</p></a></div><div class="ux uy 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-----893c7b9af1ff--------------------------------" rel="noopener follow"><p class="bf b dv z du">Status</p></a></div><div class="ux uy 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-----893c7b9af1ff--------------------------------"><p class="bf b dv z du">About</p></a></div><div class="ux uy 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-----893c7b9af1ff--------------------------------"><p class="bf b dv z du">Careers</p></a></div><div class="ux uy l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="pressinquiries@medium.com?source=post_page-----893c7b9af1ff--------------------------------" rel="noopener follow"><p class="bf b dv z du">Press</p></a></div><div class="ux uy 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-----893c7b9af1ff--------------------------------" rel="noopener follow"><p class="bf b dv z du">Blog</p></a></div><div class="ux uy 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-----893c7b9af1ff--------------------------------" rel="noopener follow"><p class="bf b dv z du">Privacy</p></a></div><div class="ux uy 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-----893c7b9af1ff--------------------------------" rel="noopener follow"><p class="bf b dv z du">Terms</p></a></div><div class="ux uy 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-----893c7b9af1ff--------------------------------" rel="noopener follow"><p class="bf b dv z du">Text to speech</p></a></div><div class="ux 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-----893c7b9af1ff--------------------------------"><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-20241122-185319-7bcdc08639"</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-893c7b9af1ff","user-7cb43f46877f","collection-4da7dfd21a33"],"serverVariantState":"44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a","middlewareEnabled":true,"cacheStatus":"DYNAMIC","shouldUseCache":true,"vary":[],"lohpSummerUpsellEnabled":false,"publicationHierarchyEnabledWeb":false,"postBottomResponsesEnabled":false},"client":{"hydrated":false,"isUs":false,"isNativeMedium":false,"isSafariMobile":false,"isSafari":false,"isFirefox":false,"routingEntity":{"type":"DEFAULT","explicit":false},"viewerIsBot":false},"debug":{"requestId":"e170984e-7b5a-442a-9a88-7934257d051e","hybridDevServices":[],"originalSpanCarrier":{"traceparent":"00-a1c25ac1d304b92237acbd37c2ab5a58-60371ac9fae4cafd-01"}},"multiVote":{"clapsPerPost":{}},"navigation":{"branch":{"show":null,"hasRendered":null,"blockedByCTA":false},"hideGoogleOneTap":false,"hasRenderedAlternateUserBanner":null,"currentLocation":"https:\u002F\u002Fmedium.com\u002Fflutter\u002Fwhats-new-in-flutter-3-3-893c7b9af1ff","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-20241122-185319-7bcdc08639","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-20241122-185319-7bcdc08639","commit":"7bcdc08639c179dc5172558201a3fd3abc1b5db6"}},"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\":\"893c7b9af1ff\"})":{"__ref":"Post:893c7b9af1ff"}},"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,"editors":[{"__typename":"CollectionMastheadUserItem","user":{"__ref":"User:a6d788faa5e5"}},{"__typename":"CollectionMastheadUserItem","user":{"__ref":"User:26a19a14addb"}},{"__typename":"CollectionMastheadUserItem","user":{"__ref":"User:dfd5de850c70"}},{"__typename":"CollectionMastheadUserItem","user":{"__ref":"User:6b9d8506b756"}},{"__typename":"CollectionMastheadUserItem","user":{"__ref":"User:35da22255b65"}},{"__typename":"CollectionMastheadUserItem","user":{"__ref":"User:68e9dc5e47d5"}},{"__typename":"CollectionMastheadUserItem","user":{"__ref":"User:2df4e577749c"}},{"__typename":"CollectionMastheadUserItem","user":{"__ref":"User:4631513e40c0"}},{"__typename":"CollectionMastheadUserItem","user":{"__ref":"User:ae996dbdd76e"}},{"__typename":"CollectionMastheadUserItem","user":{"__ref":"User:aa31f520c7ec"}}],"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":56987,"latestPostsConnection({\"paging\":{\"limit\":1}})":{"__typename":"PostConnection","posts":[{"__ref":"Post:71377810fd26"}]},"viewerEdge":{"__ref":"CollectionViewerEdge:collectionId:4da7dfd21a33-viewerId:lo_29d6309264ab"},"twitterUsername":"flutterdev","facebookPageId":null,"logo":{"__ref":"ImageMetadata:1*KvnfbD1F5CzEsU9wSmRZyA.png"}},"User:a6d788faa5e5":{"__typename":"User","id":"a6d788faa5e5"},"User:26a19a14addb":{"__typename":"User","id":"26a19a14addb"},"User:dfd5de850c70":{"__typename":"User","id":"dfd5de850c70"},"User:6b9d8506b756":{"__typename":"User","id":"6b9d8506b756"},"User:35da22255b65":{"__typename":"User","id":"35da22255b65"},"User:68e9dc5e47d5":{"__typename":"User","id":"68e9dc5e47d5"},"User:2df4e577749c":{"__typename":"User","id":"2df4e577749c"},"User:4631513e40c0":{"__typename":"User","id":"4631513e40c0"},"User:ae996dbdd76e":{"__typename":"User","id":"ae996dbdd76e"},"User:aa31f520c7ec":{"__typename":"User","id":"aa31f520c7ec"},"ImageMetadata:1*5-aoK8IBmXve5whBQM90GA.png":{"__typename":"ImageMetadata","id":"1*5-aoK8IBmXve5whBQM90GA.png"},"User:3a7a2a067927":{"__typename":"User","id":"3a7a2a067927","customDomainState":null,"hasSubdomain":false,"username":"tvolkert"},"Post:71377810fd26":{"__typename":"Post","id":"71377810fd26","firstPublishedAt":1732210323271,"creator":{"__ref":"User:3a7a2a067927"},"collection":{"__ref":"Collection:4da7dfd21a33"},"isSeries":false,"mediumUrl":"https:\u002F\u002Fmedium.com\u002Fflutter\u002Fprospera-using-flutter-to-bring-ai-to-the-frontline-of-sales-71377810fd26","sequence":null,"uniqueSlug":"prospera-using-flutter-to-bring-ai-to-the-frontline-of-sales-71377810fd26"},"LinkedAccounts:7cb43f46877f":{"__typename":"LinkedAccounts","mastodon":null,"id":"7cb43f46877f"},"UserViewerEdge:userId:7cb43f46877f-viewerId:lo_29d6309264ab":{"__typename":"UserViewerEdge","id":"userId:7cb43f46877f-viewerId:lo_29d6309264ab","isFollowing":false,"isUser":false,"isMuting":false},"NewsletterV3:6cf3dc835eda":{"__typename":"NewsletterV3","id":"6cf3dc835eda","type":"NEWSLETTER_TYPE_AUTHOR","slug":"7cb43f46877f","name":"7cb43f46877f","collection":null,"user":{"__ref":"User:7cb43f46877f"}},"User:7cb43f46877f":{"__typename":"User","id":"7cb43f46877f","name":"Kevin Chisholm","username":"kevinchisholm","newsletterV3":{"__ref":"NewsletterV3:6cf3dc835eda"},"linkedAccounts":{"__ref":"LinkedAccounts:7cb43f46877f"},"isSuspended":false,"imageId":"1*HEfsynQuQpVrGR-qdGeSvg.jpeg","mediumMemberAt":0,"verifications":{"__typename":"VerifiedInfo","isBookAuthor":false},"socialStats":{"__typename":"SocialStats","followerCount":11711,"followingCount":5,"collectionFollowingCount":2},"customDomainState":null,"hasSubdomain":false,"bio":"Kevin Chisholm is a Technical Program Manager for Dart and Flutter at Google.","isPartnerProgramEnrolled":false,"viewerEdge":{"__ref":"UserViewerEdge:userId:7cb43f46877f-viewerId:lo_29d6309264ab"},"viewerIsUser":false,"postSubscribeMembershipUpsellShownAt":0,"membership":null,"allowNotes":true,"twitterScreenName":""},"Topic:55f1c20aba7a":{"__typename":"Topic","slug":"software-engineering","id":"55f1c20aba7a","name":"Software Engineering"},"Paragraph:4a849488844c_0":{"__typename":"Paragraph","id":"4a849488844c_0","name":"d2d4","type":"H3","href":null,"layout":null,"metadata":null,"text":"What’s new in Flutter 3.3","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_1":{"__typename":"Paragraph","id":"4a849488844c_1","name":"4afa","type":"P","href":null,"layout":null,"metadata":null,"text":"Exciting updates for text handling, performance improvements, and more!","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"EM","start":0,"end":71,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_2":{"__typename":"Paragraph","id":"4a849488844c_2","name":"9cb5","type":"P","href":null,"layout":null,"metadata":null,"text":"Welcome to Flutter 3.3! Only three months ago we announced Flutter 3, a massive milestone that included stable support for all platforms! The good news is that the momentum since this major release has not slowed down. Since the release of Flutter 3, Flutter has merged 5,687 pull requests.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":11,"end":22,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_3":{"__typename":"Paragraph","id":"4a849488844c_3","name":"18b9","type":"P","href":null,"layout":null,"metadata":null,"text":"This release brings updates to Flutter web, desktop, text handling improvements in performance — and much more!","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_4":{"__typename":"Paragraph","id":"4a849488844c_4","name":"487b","type":"P","href":null,"layout":null,"metadata":null,"text":"We are also introducing exciting updates to the go_router package, DevTools, and VS Code extensions. Keep reading to learn more.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":48,"end":57,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_5":{"__typename":"Paragraph","id":"4a849488844c_5","name":"3572","type":"H3","href":null,"layout":null,"metadata":null,"text":"Framework","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_6":{"__typename":"Paragraph","id":"4a849488844c_6","name":"86d8","type":"H4","href":null,"layout":null,"metadata":null,"text":"Global Selection","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_7":{"__typename":"Paragraph","id":"4a849488844c_7","name":"425a","type":"P","href":null,"layout":null,"metadata":null,"text":"Until now, Flutter web apps didn’t match the expected behavior when attempting to select text. Like Flutter apps, native web applications are composed of a tree of elements. In a traditional web app, you can select multiple web elements with a single sweeping gesture, something that couldn’t be easily done on a Flutter web app.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_8":{"__typename":"Paragraph","id":"4a849488844c_8","name":"06c7","type":"P","href":null,"layout":null,"metadata":null,"text":"Today that all changes! With the introduction of the SelectableArea widget, any child of the SelectableArea widget has selection enabled for free!","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":53,"end":67,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":93,"end":107,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*4Mac8uQL3ynXVIuD":{"__typename":"ImageMetadata","id":"0*4Mac8uQL3ynXVIuD","originalHeight":510,"originalWidth":1068,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:4a849488844c_9":{"__typename":"Paragraph","id":"4a849488844c_9","name":"8ccb","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*4Mac8uQL3ynXVIuD"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_10":{"__typename":"Paragraph","id":"4a849488844c_10","name":"65fb","type":"P","href":null,"layout":null,"metadata":null,"text":"To take advantage of this powerful new feature, simply wrap your route body (such as the Scaffold) with the SelectionArea widget and let Flutter do the rest.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":89,"end":97,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":108,"end":121,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_11":{"__typename":"Paragraph","id":"4a849488844c_11","name":"f80c","type":"P","href":null,"layout":null,"metadata":null,"text":"For a more comprehensive deep dive into this awesome new feature, please visit the SelectableArea API page.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":83,"end":97,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":83,"end":101,"href":"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fmaterial\u002FSelectionArea-class.html","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_12":{"__typename":"Paragraph","id":"4a849488844c_12","name":"7e82","type":"H4","href":null,"layout":null,"metadata":null,"text":"Trackpad input","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_13":{"__typename":"Paragraph","id":"4a849488844c_13","name":"47a9","type":"P","href":null,"layout":null,"metadata":null,"text":"Flutter 3.3 provides improved support for trackpad input. This not only provides richer and smoother control, but also reduces misinterpretation in certain cases. For an example of this misinterpretation, check out the Drag a UI element page in the Flutter cookbook. Scroll to the bottom of the page to get to the DartPad instance, and perform the following steps:","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":219,"end":236,"href":"https:\u002F\u002Fdocs.flutter.dev\u002Fcookbook\u002Feffects\u002Fdrag-a-widget","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":249,"end":265,"href":"https:\u002F\u002Fdocs.flutter.dev\u002Fcookbook","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_14":{"__typename":"Paragraph","id":"4a849488844c_14","name":"3928","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Size the window smaller so that the upper part presents a scrollbar","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_15":{"__typename":"Paragraph","id":"4a849488844c_15","name":"974f","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Hover over the upper part","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_16":{"__typename":"Paragraph","id":"4a849488844c_16","name":"74ce","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Use a trackpad to scroll","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_17":{"__typename":"Paragraph","id":"4a849488844c_17","name":"1d58","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Prior to installing Flutter 3.3, scrolling on a trackpad drags the item because Flutter was dispatching emulated general events","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_18":{"__typename":"Paragraph","id":"4a849488844c_18","name":"afbb","type":"OLI","href":null,"layout":null,"metadata":null,"text":"After installing Flutter 3.3, scrolling on a trackpad correctly scrolls the list because Flutter is delivering the “scrolling” gesture, which isn’t recognized by the cards, but is recognized by the scroll view","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"EM","start":177,"end":179,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_19":{"__typename":"Paragraph","id":"4a849488844c_19","name":"e1e3","type":"P","href":null,"layout":null,"metadata":null,"text":"For more information, see the Flutter Trackpad Gesture design doc, and the following PRs on GitHub:","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":29,"end":54,"href":"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1oRvebwjpsC3KlxN1gOYnEdxtNpQDYpPtUFAkmTUe-K8\u002Fedit?resourcekey=0-pt4_T7uggSTrsq2gWeGsYQ","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_20":{"__typename":"Paragraph","id":"4a849488844c_20","name":"877d","type":"ULI","href":null,"layout":null,"metadata":null,"text":"PR 89944: Support trackpad gestures in framework","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":10,"end":48,"href":"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fpull\u002F89944","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_21":{"__typename":"Paragraph","id":"4a849488844c_21","name":"92ea","type":"ULI","href":null,"layout":null,"metadata":null,"text":"PR 31591: iPad trackpad gestures","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":10,"end":32,"href":"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fengine\u002Fpull\u002F31591","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_22":{"__typename":"Paragraph","id":"4a849488844c_22","name":"7077","type":"ULI","href":null,"layout":null,"metadata":null,"text":"PR 34060: Re-land “ChromeOS\u002FAndroid trackpad gestures”","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":10,"end":54,"href":"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fengine\u002Fpull\u002F34060","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_23":{"__typename":"Paragraph","id":"4a849488844c_23","name":"79fc","type":"ULI","href":null,"layout":null,"metadata":null,"text":"PR 31594: Win32 trackpad gestures","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":10,"end":33,"href":"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fengine\u002Fpull\u002F31594","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_24":{"__typename":"Paragraph","id":"4a849488844c_24","name":"8f45","type":"ULI","href":null,"layout":null,"metadata":null,"text":"PR 31592: Linux trackpad gestures","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":10,"end":33,"href":"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fengine\u002Fpull\u002F31592","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_25":{"__typename":"Paragraph","id":"4a849488844c_25","name":"b967","type":"ULI","href":null,"layout":null,"metadata":null,"text":"PR 31593: Mac trackpad gesturesmacOS","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":10,"end":36,"href":"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fengine\u002Fpull\u002F31593","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_26":{"__typename":"Paragraph","id":"4a849488844c_26","name":"1f42","type":"H4","href":null,"layout":null,"metadata":null,"text":"Scribble","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_27":{"__typename":"Paragraph","id":"4a849488844c_27","name":"6c60","type":"P","href":null,"layout":null,"metadata":null,"text":"Thanks to the amazing contributions of community member fbcouch, Flutter now supports Scribble handwriting input using the Apple Pencil on iPadOS. This feature is enabled by default on CupertinoTextField, TextField, and EditableText. To enable this feature for your end users, simply upgrade to Flutter 3.3.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":185,"end":203,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":205,"end":214,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":220,"end":232,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":56,"end":63,"href":"https:\u002F\u002Fgithub.com\u002Ffbcouch","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":86,"end":94,"href":"https:\u002F\u002Fsupport.apple.com\u002Fguide\u002Fipad\u002Fenter-text-with-scribble-ipad355ab2a7\u002Fipados","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*SlsnQUfdOTijdsyF":{"__typename":"ImageMetadata","id":"0*SlsnQUfdOTijdsyF","originalHeight":342,"originalWidth":1500,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:4a849488844c_28":{"__typename":"Paragraph","id":"4a849488844c_28","name":"ee69","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*SlsnQUfdOTijdsyF"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_29":{"__typename":"Paragraph","id":"4a849488844c_29","name":"4e08","type":"H4","href":null,"layout":null,"metadata":null,"text":"Text input","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_30":{"__typename":"Paragraph","id":"4a849488844c_30","name":"e532","type":"P","href":null,"layout":null,"metadata":null,"text":"To improve support for rich text editing, this release introduces the ability to receive granular text updates from the platform’s TextInputPlugin. Previously, the TextInputClient only delivered the new editing state with no delta between the old and new, TextEditingDeltas and the DeltaTextInputClient fill this information gap. Having access to these deltas allows you to build an input field with styled ranges that expand and contract as you type. To learn more, check out the Rich Text Editor demo.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":131,"end":146,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":164,"end":179,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":256,"end":273,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":282,"end":302,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":481,"end":502,"href":"https:\u002F\u002Fflutter.github.io\u002Fsamples\u002Frich_text_editor.html","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_31":{"__typename":"Paragraph","id":"4a849488844c_31","name":"f6d8","type":"H3","href":null,"layout":null,"metadata":null,"text":"Material Design 3","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_32":{"__typename":"Paragraph","id":"4a849488844c_32","name":"74d3","type":"P","href":null,"layout":null,"metadata":null,"text":"The Flutter team continues to migrate more Material Design 3 components to Flutter. This release includes updates to IconButton, Chips, and large and medium variants for AppBar.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":117,"end":127,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":129,"end":134,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":170,"end":176,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":117,"end":127,"href":"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fmaterial\u002FIconButton-class.html","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":129,"end":134,"href":"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fmaterial\u002FChip-class.html","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":170,"end":176,"href":"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fmaterial\u002FAppBar-class.html","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_33":{"__typename":"Paragraph","id":"4a849488844c_33","name":"7b92","type":"P","href":null,"layout":null,"metadata":null,"text":"To monitor the progress on the Material Design 3 migration, check out Bring Material 3 to Flutter on GitHub.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":70,"end":97,"href":"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fissues\u002F91605","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_34":{"__typename":"Paragraph","id":"4a849488844c_34","name":"9f96","type":"H4","href":null,"layout":null,"metadata":null,"text":"IconButton","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*AxLlKvPfaiODtzch":{"__typename":"ImageMetadata","id":"0*AxLlKvPfaiODtzch","originalHeight":346,"originalWidth":1286,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:4a849488844c_35":{"__typename":"Paragraph","id":"4a849488844c_35","name":"6733","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*AxLlKvPfaiODtzch"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_36":{"__typename":"Paragraph","id":"4a849488844c_36","name":"4d79","type":"H4","href":null,"layout":null,"metadata":null,"text":"Chip","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*5fCsX84PRpjMtzx5":{"__typename":"ImageMetadata","id":"0*5fCsX84PRpjMtzx5","originalHeight":1234,"originalWidth":1184,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:4a849488844c_37":{"__typename":"Paragraph","id":"4a849488844c_37","name":"58cf","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*5fCsX84PRpjMtzx5"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_38":{"__typename":"Paragraph","id":"4a849488844c_38","name":"c1e1","type":"H4","href":null,"layout":null,"metadata":null,"text":"Medium and large AppBar","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*jVFZWFsCOuzeqzTb":{"__typename":"ImageMetadata","id":"0*jVFZWFsCOuzeqzTb","originalHeight":291,"originalWidth":522,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:4a849488844c_39":{"__typename":"Paragraph","id":"4a849488844c_39","name":"0db2","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*jVFZWFsCOuzeqzTb"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*c4wovLXB8TpulHVU":{"__typename":"ImageMetadata","id":"0*c4wovLXB8TpulHVU","originalHeight":291,"originalWidth":522,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:4a849488844c_40":{"__typename":"Paragraph","id":"4a849488844c_40","name":"c158","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*c4wovLXB8TpulHVU"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_41":{"__typename":"Paragraph","id":"4a849488844c_41","name":"03a6","type":"H3","href":null,"layout":null,"metadata":null,"text":"Desktop","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_42":{"__typename":"Paragraph","id":"4a849488844c_42","name":"5edb","type":"H4","href":null,"layout":null,"metadata":null,"text":"Windows","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_43":{"__typename":"Paragraph","id":"4a849488844c_43","name":"3a9f","type":"P","href":null,"layout":null,"metadata":null,"text":"Previously, the Windows desktop application’s version was set by a file specific to the Windows application. This behavior was inconsistent with the way other platforms set their versions.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_44":{"__typename":"Paragraph","id":"4a849488844c_44","name":"8250","type":"P","href":null,"layout":null,"metadata":null,"text":"Windows desktop application versions can now be set from your projects pubspec.yaml file and build arguments. This makes it easier to enable auto updates for your end customers to get the latest and greatest when an application update is pushed.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":71,"end":83,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_45":{"__typename":"Paragraph","id":"4a849488844c_45","name":"a99c","type":"P","href":null,"layout":null,"metadata":null,"text":"For more information on setting your applications version, follow the documentation on docs.flutter.dev and the migration guide. Projects created before Flutter 3.3 need to be updated to get this feature.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":87,"end":103,"href":"https:\u002F\u002Fdocs.flutter.dev\u002Fdeployment\u002Fwindows#updating-the-apps-version-number","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":112,"end":127,"href":"https:\u002F\u002Fdocs.flutter.dev\u002Fdevelopment\u002Fplatform-integration\u002Fwindows\u002Fversion-migration","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_46":{"__typename":"Paragraph","id":"4a849488844c_46","name":"c39f","type":"H3","href":null,"layout":null,"metadata":null,"text":"Packages","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_47":{"__typename":"Paragraph","id":"4a849488844c_47","name":"8fe7","type":"H4","href":null,"layout":null,"metadata":null,"text":"go_router","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_48":{"__typename":"Paragraph","id":"4a849488844c_48","name":"6a19","type":"P","href":null,"layout":null,"metadata":null,"text":"When designing apps with complex navigation needs, things can get pretty hard to wrap your head around. To extend Flutter’s native navigation API, the team has published a new version of the go_router package, making it simpler to design routing logic that works across mobile, desktop, and the web.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":191,"end":200,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_49":{"__typename":"Paragraph","id":"4a849488844c_49","name":"8ec1","type":"P","href":null,"layout":null,"metadata":null,"text":"The go router package, maintained by the Flutter team, simplifies routing by providing a declarative, url-based API, making it easier to navigate and handle deep-links. The latest version (4.3) enables apps to redirect using asynchronous code, and includes other breaking changes described in the migration guide.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":4,"end":13,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":4,"end":13,"href":"https:\u002F\u002Fpub.dev\u002Fpackages\u002Fgo_router","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":297,"end":312,"href":"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F10l22o4ml4Ss83UyzqUC8_xYOv_QjZEi80lJDNE4q7wM\u002Fedit?usp=sharing&resourcekey=0-U-BXBQzNfkk4v241Ow-vZg","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_50":{"__typename":"Paragraph","id":"4a849488844c_50","name":"15f7","type":"P","href":null,"layout":null,"metadata":null,"text":"For more information, check out the Navigation and routing page on docs.flutter.dev.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":36,"end":58,"href":"https:\u002F\u002Fdocs.flutter.dev\u002Fdevelopment\u002Fui\u002Fnavigation","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_51":{"__typename":"Paragraph","id":"4a849488844c_51","name":"9e02","type":"H3","href":null,"layout":null,"metadata":null,"text":"VS Code extension enhancements","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_52":{"__typename":"Paragraph","id":"4a849488844c_52","name":"66e0","type":"P","href":null,"layout":null,"metadata":null,"text":"The Visual Studio Code extension for Flutter has several updates including improvements for adding dependencies. You can now add multiple, comma-separated dependencies in one step using Dart: Add Dependency.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":186,"end":206,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*vFIZ4WL4UWSTrC27":{"__typename":"ImageMetadata","id":"0*vFIZ4WL4UWSTrC27","originalHeight":280,"originalWidth":688,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:4a849488844c_53":{"__typename":"Paragraph","id":"4a849488844c_53","name":"c378","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*vFIZ4WL4UWSTrC27"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_54":{"__typename":"Paragraph","id":"4a849488844c_54","name":"3f2a","type":"P","href":null,"layout":null,"metadata":null,"text":"You can read about the Visual Studio Code extension enhancements made since the last Flutter stable release at:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_55":{"__typename":"Paragraph","id":"4a849488844c_55","name":"1dd7","type":"ULI","href":null,"layout":null,"metadata":null,"text":"VS Code extensions v3.46","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":24,"href":"https:\u002F\u002Fgroups.google.com\u002Fg\u002Fflutter-announce\u002Fc\u002Fu1iSDMtKMVg","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_56":{"__typename":"Paragraph","id":"4a849488844c_56","name":"7a5a","type":"ULI","href":null,"layout":null,"metadata":null,"text":"VS Code extensions v3.44","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":24,"href":"https:\u002F\u002Fgroups.google.com\u002Fg\u002Fflutter-announce\u002Fc\u002Fx4m9o93-Dng","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_57":{"__typename":"Paragraph","id":"4a849488844c_57","name":"31d4","type":"ULI","href":null,"layout":null,"metadata":null,"text":"VS Code extensions v3.42","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":24,"href":"https:\u002F\u002Fgroups.google.com\u002Fg\u002Fflutter-announce\u002Fc\u002F45Wsk5pISx4","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_58":{"__typename":"Paragraph","id":"4a849488844c_58","name":"4112","type":"H3","href":null,"layout":null,"metadata":null,"text":"Flutter DevTools updates","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_59":{"__typename":"Paragraph","id":"4a849488844c_59","name":"9148","type":"P","href":null,"layout":null,"metadata":null,"text":"DevTools comes with a number of updates since the last stable Flutter release, including UX and performance improvements to data display tables for faster, less jittery scrolling of large lists of events (#4175).","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":205,"end":210,"href":"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fdevtools\u002Fpull\u002F4175","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_60":{"__typename":"Paragraph","id":"4a849488844c_60","name":"57bb","type":"P","href":null,"layout":null,"metadata":null,"text":"For the complete list of updates since Flutter 3.0, check out the individual announcements here:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_61":{"__typename":"Paragraph","id":"4a849488844c_61","name":"a04f","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Flutter DevTools 2.16.0 release notes","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":37,"href":"https:\u002F\u002Fdocs.flutter.dev\u002Fdevelopment\u002Ftools\u002Fdevtools\u002Frelease-notes\u002Frelease-notes-2.16.0","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_62":{"__typename":"Paragraph","id":"4a849488844c_62","name":"c3a1","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Flutter DevTools 2.15.0 release notes","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":37,"href":"https:\u002F\u002Fdocs.flutter.dev\u002Fdevelopment\u002Ftools\u002Fdevtools\u002Frelease-notes\u002Frelease-notes-2.15.0","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_63":{"__typename":"Paragraph","id":"4a849488844c_63","name":"66c4","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Flutter DevTools 2.14.0 release notes","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":37,"href":"https:\u002F\u002Fdocs.flutter.dev\u002Fdevelopment\u002Ftools\u002Fdevtools\u002Frelease-notes\u002Frelease-notes-2.14.0","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_64":{"__typename":"Paragraph","id":"4a849488844c_64","name":"9286","type":"H3","href":null,"layout":null,"metadata":null,"text":"Performance","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_65":{"__typename":"Paragraph","id":"4a849488844c_65","name":"0ce9","type":"H4","href":null,"layout":null,"metadata":null,"text":"Raster cache improvements","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_66":{"__typename":"Paragraph","id":"4a849488844c_66","name":"7adc","type":"P","href":null,"layout":null,"metadata":null,"text":"This release increases the performance of loading images from assets by eliminating copies and reducing Dart garbage collection (GC) pressure. Previously, when loading asset images, the ImageProvider API required the compressed data to be copied multiple times. First, it was copied into the native heap when opening the asset and exposing it to Dart as a typed data array. Then, it was copied a second time when that typed data array was copied to the internal storage of a ui.ImmutableBuffer.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":186,"end":199,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":475,"end":493,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_67":{"__typename":"Paragraph","id":"4a849488844c_67","name":"2c36","type":"P","href":null,"layout":null,"metadata":null,"text":"With the addition of ui.ImmutableBuffer.fromAsset, compressed image bytes can be loaded directly into the structure used for decoding. This approach requires changes to the byte loading pipeline of ImageProviders. This process is also faster, because it bypasses some additional scheduling overhead required bythe previous method channel-based loader. In particular, image loading time improved by nearly 2x in our microbenchmarks.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":21,"end":49,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":198,"end":212,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":5,"end":17,"href":"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fengine\u002Fpull\u002F32999","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":149,"end":165,"href":"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fpull\u002F103496","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*dZTaQMQri0EI7HCw":{"__typename":"ImageMetadata","id":"0*dZTaQMQri0EI7HCw","originalHeight":1146,"originalWidth":1465,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:4a849488844c_68":{"__typename":"Paragraph","id":"4a849488844c_68","name":"5544","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*dZTaQMQri0EI7HCw"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_69":{"__typename":"Paragraph","id":"4a849488844c_69","name":"3485","type":"P","href":null,"layout":null,"metadata":null,"text":"For more information and a migration guide, see Adding ImageProvider.loadBuffer on docs.flutter.dev.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":48,"end":79,"href":"https:\u002F\u002Fdocs.flutter.dev\u002Frelease\u002Fbreaking-changes\u002Fimage-provider-load-buffer","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_70":{"__typename":"Paragraph","id":"4a849488844c_70","name":"511e","type":"H3","href":null,"layout":null,"metadata":null,"text":"Stability","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_71":{"__typename":"Paragraph","id":"4a849488844c_71","name":"388d","type":"H4","href":null,"layout":null,"metadata":null,"text":"iOS pointer compression disabled","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_72":{"__typename":"Paragraph","id":"4a849488844c_72","name":"f9a6","type":"P","href":null,"layout":null,"metadata":null,"text":"In the 2.10 stable release, we enabled Dart’s pointer compression optimization on iOS. However, Yeatse, on GitHub, alerted us to an unintended consequence of the optimization. Dart’s pointer compression works by reserving a large virtual memory region for Dart’s heap. Since the total virtual memory allocation allowed on iOS is less than on other platforms, this large reservation reduces the amount of memory available for use by other components that reserve their own memory, for example, Flutter plugins.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":46,"end":78,"href":"https:\u002F\u002Fmedium.com\u002Fdartlang\u002Fdart-2-15-7e7a598e508a#0c15","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":96,"end":102,"href":"https:\u002F\u002Fgithub.com\u002FYeatse","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":115,"end":125,"href":"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fissues\u002F105183","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_73":{"__typename":"Paragraph","id":"4a849488844c_73","name":"1f2c","type":"P","href":null,"layout":null,"metadata":null,"text":"While disabling pointer compression increases the memory consumed by Dart objects, it also increases the memory available for non-Dart parts of a Flutter application, which is more desirable overall.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"EM","start":112,"end":121,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_74":{"__typename":"Paragraph","id":"4a849488844c_74","name":"20f6","type":"P","href":null,"layout":null,"metadata":null,"text":"Apple provides an entitlement that can increase the maximum allowed virtual memory allocation for an application, however this entitlement is only supported on newer iOS versions, and wouldn’t work on devices running versions of iOS that Flutter still supports. When we are able to use this entitlement everywhere, we intend to revisit this optimization.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_75":{"__typename":"Paragraph","id":"4a849488844c_75","name":"54c0","type":"H3","href":null,"layout":null,"metadata":null,"text":"API improvements","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_76":{"__typename":"Paragraph","id":"4a849488844c_76","name":"d668","type":"H4","href":null,"layout":null,"metadata":null,"text":"PlatformDispatcher.onError","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_77":{"__typename":"Paragraph","id":"4a849488844c_77","name":"902e","type":"P","href":null,"layout":null,"metadata":null,"text":"In previous releases, you had to manually configure a custom Zone in order to catch all of an application’s exceptions and errors. However, custom Zones were detrimental to a number of optimizations in Dart’s core libraries, which slowed down application start-up time. In this release, instead of using a custom Zone, you should catch all errors and exceptions by setting the PlatformDispatcher.onError callback. For more information, check out the updated Handling errors in Flutter page on docs.flutter.dev.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":61,"end":65,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":147,"end":151,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":313,"end":317,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":377,"end":403,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":458,"end":484,"href":"https:\u002F\u002Fdocs.flutter.dev\u002Ftesting\u002Ferrors","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":270,"end":413,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_78":{"__typename":"Paragraph","id":"4a849488844c_78","name":"6033","type":"H4","href":null,"layout":null,"metadata":null,"text":"FragmentProgram changes","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_79":{"__typename":"Paragraph","id":"4a849488844c_79","name":"80b6","type":"P","href":null,"layout":null,"metadata":null,"text":"Fragment shaders written in GLSL and listed under a shaders: section in the Flutter manifest of an application’s pubspec.yaml file will now be automatically compiled to the correct format understood by the Engine and bundled with the application as an asset. Thanks to this change, you will no longer have to manually compile shaders using third-party tools. Going forward, you should regard the Engine’s FragmentProgram API as accepting only the output of Flutter’s build tooling. This isn’t yet the case, but this change is planned for a future release, as described in the FragmentProgram API Support improvements design doc.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":52,"end":60,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":113,"end":125,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":405,"end":420,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":576,"end":616,"href":"http:\u002F\u002Fflutter.dev\u002Fgo\u002Ffragment-program-support","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_80":{"__typename":"Paragraph","id":"4a849488844c_80","name":"1d68","type":"P","href":null,"layout":null,"metadata":null,"text":"For an example of this change, see this Flutter shader example.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":40,"end":62,"href":"https:\u002F\u002Fgithub.com\u002Fzanderso\u002Ffragment_shader_example","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_81":{"__typename":"Paragraph","id":"4a849488844c_81","name":"18d9","type":"H4","href":null,"layout":null,"metadata":null,"text":"Fractional translation","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_82":{"__typename":"Paragraph","id":"4a849488844c_82","name":"0e68","type":"P","href":null,"layout":null,"metadata":null,"text":"Previously, the Flutter Engine would always align composited layers to exact pixel boundaries because it improved rendering performance on older (32-bit) model iPhones. Since adding desktop support, we’ve noticed that this led to observable snapping behavior, since screen device pixel ratios are commonly much lower. For example, on low DPR screens, tooltips could be seen visibly snapping when fading in. After determining that this pixel snapping was no longer necessary for performance on newer iPhone models, we’ve removed this pixel snapping from the Flutter Engine to improve desktop fidelity. Additionally, we also found that removing this pixel snapping stabilized a number of our golden image tests, which would frequently change with small hairline rendering differences.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":514,"end":547,"href":"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fissues\u002F103909","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_83":{"__typename":"Paragraph","id":"4a849488844c_83","name":"73be","type":"H3","href":null,"layout":null,"metadata":null,"text":"Changes to supported platforms","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_84":{"__typename":"Paragraph","id":"4a849488844c_84","name":"be70","type":"H4","href":null,"layout":null,"metadata":null,"text":"32-bit iOS deprecation","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_85":{"__typename":"Paragraph","id":"4a849488844c_85","name":"79f3","type":"P","href":null,"layout":null,"metadata":null,"text":"As we announced earlier with the 3.0 stable release, due to decreased usage, that release was the last one to support 32-bit iOS devices and iOS versions 9 and 10. This change affects the iPhone 4S, iPhone 5, iPhone 5C, and the 2nd, 3d, and 4th generation iPad devices. The 3.3 stable version of Flutter and all following stable releases no longer support 32-bit iOS devices and iOS versions 9 and 10. This means that apps built against Flutter 3.3 and later won’t run on those devices.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":98,"end":162,"href":"http:\u002F\u002Fflutter.dev\u002Fgo\u002Frfc-32-bit-ios-unsupported","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_86":{"__typename":"Paragraph","id":"4a849488844c_86","name":"19cd","type":"H4","href":null,"layout":null,"metadata":null,"text":"Sunsetting macOS 10.11 and 10.12","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_87":{"__typename":"Paragraph","id":"4a849488844c_87","name":"8c17","type":"P","href":null,"layout":null,"metadata":null,"text":"In the Q4 2022 stable release, we expect to drop support for macOS versions 10.11 and 10.12. This means that apps built against stable Flutter SDKs after that point will no longer work on these versions, and the minimum macOS version supported by Flutter will increase to 10.13 High Sierra.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_88":{"__typename":"Paragraph","id":"4a849488844c_88","name":"04f3","type":"H4","href":null,"layout":null,"metadata":null,"text":"Bitcode deprecation","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_89":{"__typename":"Paragraph","id":"4a849488844c_89","name":"ed3e","type":"P","href":null,"layout":null,"metadata":null,"text":"Bitcode will no longer be accepted for iOS app submission in the upcoming Xcode 14 release, and projects with bitcode enabled will emit a build warning in this version of Xcode. In light of this, Flutter will drop support for bitcode in a future stable release.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":8,"end":90,"href":"https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fxcode-release-notes\u002Fxcode-14-release-notes","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_90":{"__typename":"Paragraph","id":"4a849488844c_90","name":"ea35","type":"P","href":null,"layout":null,"metadata":null,"text":"By default, Flutter apps don’t have bitcode enabled, and we don’t expect this to impact many developers. However, if you have enabled bitcode manually in your Xcode project, disable it as soon as you upgrade to Xcode 14. You can do so by opening ios\u002FRunner.xcworkspace and setting the build setting Enable Bitcode to No. Add-to-app developers should disable it in the host Xcode project.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":246,"end":268,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":299,"end":313,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":317,"end":319,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*4EQPd4ednGIAhMwl":{"__typename":"ImageMetadata","id":"0*4EQPd4ednGIAhMwl","originalHeight":758,"originalWidth":1600,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:4a849488844c_91":{"__typename":"Paragraph","id":"4a849488844c_91","name":"73d2","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*4EQPd4ednGIAhMwl"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_92":{"__typename":"Paragraph","id":"4a849488844c_92","name":"88c9","type":"P","href":null,"layout":null,"metadata":null,"text":"See Apple’s documentation to learn more about bitcode distribution.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":4,"end":25,"href":"https:\u002F\u002Fhelp.apple.com\u002Fxcode\u002Fmac\u002F11.0\u002Findex.html?localePath=en.lproj#\u002Fdevde46df08a","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_93":{"__typename":"Paragraph","id":"4a849488844c_93","name":"7129","type":"H3","href":null,"layout":null,"metadata":null,"text":"Summary","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:4a849488844c_94":{"__typename":"Paragraph","id":"4a849488844c_94","name":"709b","type":"P","href":null,"layout":null,"metadata":null,"text":"As we always say, the Flutter team at Google is extremely grateful for the incredible work the community puts in to make Flutter the wonderful experience that it is! We look forward to continuing to iterate on the work that has been done, focusing on what matters most — all of you!","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"CollectionViewerEdge:collectionId:4da7dfd21a33-viewerId:lo_29d6309264ab":{"__typename":"CollectionViewerEdge","id":"collectionId:4da7dfd21a33-viewerId:lo_29d6309264ab","isEditor":false,"isMuting":false},"ImageMetadata:1*KvnfbD1F5CzEsU9wSmRZyA.png":{"__typename":"ImageMetadata","id":"1*KvnfbD1F5CzEsU9wSmRZyA.png","originalWidth":538,"originalHeight":141},"PostViewerEdge:postId:893c7b9af1ff-viewerId:lo_29d6309264ab":{"__typename":"PostViewerEdge","shouldIndexPostForExternalSearch":true,"id":"postId:893c7b9af1ff-viewerId:lo_29d6309264ab"},"Tag:flutter":{"__typename":"Tag","id":"flutter","displayTitle":"Flutter","normalizedTagSlug":"flutter"},"Tag:flutter-app-development":{"__typename":"Tag","id":"flutter-app-development","displayTitle":"Flutter App Development","normalizedTagSlug":"flutter-app-development"},"Tag:release-notes":{"__typename":"Tag","id":"release-notes","displayTitle":"Release Notes","normalizedTagSlug":"release-notes"},"Tag:releases":{"__typename":"Tag","id":"releases","displayTitle":"Releases","normalizedTagSlug":"releases"},"Post:893c7b9af1ff":{"__typename":"Post","id":"893c7b9af1ff","collection":{"__ref":"Collection:4da7dfd21a33"},"content({\"postMeteringOptions\":{}})":{"__typename":"PostContent","isLockedPreviewOnly":false,"bodyModel":{"__typename":"RichText","sections":[{"__typename":"Section","name":"2ee4","startIndex":0,"textLayout":null,"imageLayout":null,"backgroundImage":null,"videoLayout":null,"backgroundVideo":null}],"paragraphs":[{"__ref":"Paragraph:4a849488844c_0"},{"__ref":"Paragraph:4a849488844c_1"},{"__ref":"Paragraph:4a849488844c_2"},{"__ref":"Paragraph:4a849488844c_3"},{"__ref":"Paragraph:4a849488844c_4"},{"__ref":"Paragraph:4a849488844c_5"},{"__ref":"Paragraph:4a849488844c_6"},{"__ref":"Paragraph:4a849488844c_7"},{"__ref":"Paragraph:4a849488844c_8"},{"__ref":"Paragraph:4a849488844c_9"},{"__ref":"Paragraph:4a849488844c_10"},{"__ref":"Paragraph:4a849488844c_11"},{"__ref":"Paragraph:4a849488844c_12"},{"__ref":"Paragraph:4a849488844c_13"},{"__ref":"Paragraph:4a849488844c_14"},{"__ref":"Paragraph:4a849488844c_15"},{"__ref":"Paragraph:4a849488844c_16"},{"__ref":"Paragraph:4a849488844c_17"},{"__ref":"Paragraph:4a849488844c_18"},{"__ref":"Paragraph:4a849488844c_19"},{"__ref":"Paragraph:4a849488844c_20"},{"__ref":"Paragraph:4a849488844c_21"},{"__ref":"Paragraph:4a849488844c_22"},{"__ref":"Paragraph:4a849488844c_23"},{"__ref":"Paragraph:4a849488844c_24"},{"__ref":"Paragraph:4a849488844c_25"},{"__ref":"Paragraph:4a849488844c_26"},{"__ref":"Paragraph:4a849488844c_27"},{"__ref":"Paragraph:4a849488844c_28"},{"__ref":"Paragraph:4a849488844c_29"},{"__ref":"Paragraph:4a849488844c_30"},{"__ref":"Paragraph:4a849488844c_31"},{"__ref":"Paragraph:4a849488844c_32"},{"__ref":"Paragraph:4a849488844c_33"},{"__ref":"Paragraph:4a849488844c_34"},{"__ref":"Paragraph:4a849488844c_35"},{"__ref":"Paragraph:4a849488844c_36"},{"__ref":"Paragraph:4a849488844c_37"},{"__ref":"Paragraph:4a849488844c_38"},{"__ref":"Paragraph:4a849488844c_39"},{"__ref":"Paragraph:4a849488844c_40"},{"__ref":"Paragraph:4a849488844c_41"},{"__ref":"Paragraph:4a849488844c_42"},{"__ref":"Paragraph:4a849488844c_43"},{"__ref":"Paragraph:4a849488844c_44"},{"__ref":"Paragraph:4a849488844c_45"},{"__ref":"Paragraph:4a849488844c_46"},{"__ref":"Paragraph:4a849488844c_47"},{"__ref":"Paragraph:4a849488844c_48"},{"__ref":"Paragraph:4a849488844c_49"},{"__ref":"Paragraph:4a849488844c_50"},{"__ref":"Paragraph:4a849488844c_51"},{"__ref":"Paragraph:4a849488844c_52"},{"__ref":"Paragraph:4a849488844c_53"},{"__ref":"Paragraph:4a849488844c_54"},{"__ref":"Paragraph:4a849488844c_55"},{"__ref":"Paragraph:4a849488844c_56"},{"__ref":"Paragraph:4a849488844c_57"},{"__ref":"Paragraph:4a849488844c_58"},{"__ref":"Paragraph:4a849488844c_59"},{"__ref":"Paragraph:4a849488844c_60"},{"__ref":"Paragraph:4a849488844c_61"},{"__ref":"Paragraph:4a849488844c_62"},{"__ref":"Paragraph:4a849488844c_63"},{"__ref":"Paragraph:4a849488844c_64"},{"__ref":"Paragraph:4a849488844c_65"},{"__ref":"Paragraph:4a849488844c_66"},{"__ref":"Paragraph:4a849488844c_67"},{"__ref":"Paragraph:4a849488844c_68"},{"__ref":"Paragraph:4a849488844c_69"},{"__ref":"Paragraph:4a849488844c_70"},{"__ref":"Paragraph:4a849488844c_71"},{"__ref":"Paragraph:4a849488844c_72"},{"__ref":"Paragraph:4a849488844c_73"},{"__ref":"Paragraph:4a849488844c_74"},{"__ref":"Paragraph:4a849488844c_75"},{"__ref":"Paragraph:4a849488844c_76"},{"__ref":"Paragraph:4a849488844c_77"},{"__ref":"Paragraph:4a849488844c_78"},{"__ref":"Paragraph:4a849488844c_79"},{"__ref":"Paragraph:4a849488844c_80"},{"__ref":"Paragraph:4a849488844c_81"},{"__ref":"Paragraph:4a849488844c_82"},{"__ref":"Paragraph:4a849488844c_83"},{"__ref":"Paragraph:4a849488844c_84"},{"__ref":"Paragraph:4a849488844c_85"},{"__ref":"Paragraph:4a849488844c_86"},{"__ref":"Paragraph:4a849488844c_87"},{"__ref":"Paragraph:4a849488844c_88"},{"__ref":"Paragraph:4a849488844c_89"},{"__ref":"Paragraph:4a849488844c_90"},{"__ref":"Paragraph:4a849488844c_91"},{"__ref":"Paragraph:4a849488844c_92"},{"__ref":"Paragraph:4a849488844c_93"},{"__ref":"Paragraph:4a849488844c_94"}]},"validatedShareKey":"","shareKeyCreator":null},"creator":{"__ref":"User:7cb43f46877f"},"inResponseToEntityType":null,"isLocked":false,"isMarkedPaywallOnly":false,"lockedSource":"LOCKED_POST_SOURCE_NONE","mediumUrl":"https:\u002F\u002Fmedium.com\u002Fflutter\u002Fwhats-new-in-flutter-3-3-893c7b9af1ff","primaryTopic":{"__ref":"Topic:55f1c20aba7a"},"topics":[{"__typename":"Topic","slug":"software-engineering"},{"__typename":"Topic","slug":"programming"}],"isPublished":true,"latestPublishedVersion":"4a849488844c","visibility":"PUBLIC","postResponses":{"__typename":"PostResponses","count":14},"clapCount":4081,"allowResponses":true,"isLimitedState":false,"title":"What’s new in Flutter 3.3","isSeries":false,"sequence":null,"uniqueSlug":"whats-new-in-flutter-3-3-893c7b9af1ff","socialTitle":"","socialDek":"","canonicalUrl":"","metaDescription":"","latestPublishedAt":1661951658947,"readingTime":8.343396226415095,"previewContent":{"__typename":"PreviewContent","subtitle":"Exciting updates for text handling, performance improvements, and more!"},"previewImage":{"__ref":"ImageMetadata:0*4Mac8uQL3ynXVIuD"},"isShortform":false,"seoTitle":"","firstPublishedAt":1661884094293,"updatedAt":1697752129597,"shortformType":"SHORTFORM_TYPE_LINK","seoDescription":"","viewerEdge":{"__ref":"PostViewerEdge:postId:893c7b9af1ff-viewerId:lo_29d6309264ab"},"isSuspended":false,"license":"CC_40_BY","tags":[{"__ref":"Tag:flutter"},{"__ref":"Tag:flutter-app-development"},{"__ref":"Tag:release-notes"},{"__ref":"Tag:releases"}],"isNewsletter":false,"statusForCollection":"APPROVED","pendingCollection":null,"detectedLanguage":"en","wordCount":1893,"layerCake":3,"responsesLocked":false}}</script><script>window.__MIDDLEWARE_STATE__={"session":{"xsrf":""},"cache":{"cacheStatus":"MISS"}}</script><script src="https://cdn-client.medium.com/lite/static/js/manifest.b2314f6d.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.24534aeb.js"></script><script src="https://cdn-client.medium.com/lite/static/js/instrumentation.d9108df7.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/4810.6318add7.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/2707.b0942613.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/9977.5b3eb23a.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8599.1ab63137.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5250.9f9e01d2.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6349.b071a958.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.826a25fb.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/7079.67349d50.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/3735.afb7e926.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5642.a2d9f6a1.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6546.cd03f950.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6834.08de95de.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/7346.72622eb9.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2420.2a5e2d95.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/839.ca7937c2.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/7975.d195c6f1.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2106.21ff89d3.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/7394.3d049572.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2961.00a48598.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8204.c4082863.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/4391.59acaed3.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/PostPage.MainContent.c8a11795.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8414.6565ad5f.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.a0afad8a.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/PostResponsesContent.36c2ecf4.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:'8e729719caf14067',t:'MTczMjM3OTkxNC4wMDAwMDA='};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