CINXE.COM
<!doctype html><html lang="en"><head><title data-rh="true">What’s new in Flutter 3.24. Unleashing Flutter GPU, Multi-View… | 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="2024-08-07T18:34:26.571Z"/><meta data-rh="true" name="title" content="What’s new in Flutter 3.24. Unleashing Flutter GPU, Multi-View… | by Kevin Chisholm | Flutter | Medium"/><meta data-rh="true" property="og:title" content="What’s new in Flutter 3.24"/><meta data-rh="true" property="al:android:url" content="medium://p/6c040f87d1e4"/><meta data-rh="true" property="al:ios:url" content="medium://p/6c040f87d1e4"/><meta data-rh="true" property="al:android:app_name" content="Medium"/><meta data-rh="true" name="description" content="Welcome to the latest Flutter update! Flutter 3.24 is packed with exciting new features and enhancements to elevate your app development experience. This release highlights the preview of Flutter…"/><meta data-rh="true" property="og:description" content="Unleashing Flutter GPU, Multi-View Embedding, and More"/><meta data-rh="true" property="og:url" content="https://medium.com/flutter/whats-new-in-flutter-3-24-6c040f87d1e4"/><meta data-rh="true" property="al:web:url" content="https://medium.com/flutter/whats-new-in-flutter-3-24-6c040f87d1e4"/><meta data-rh="true" property="og:image" content="https://miro.medium.com/v2/da:true/resize:fit:600/0*bdcb6KGonosfPZ6m"/><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.24"/><meta data-rh="true" name="twitter:site" content="@flutterdev"/><meta data-rh="true" name="twitter:app:url:iphone" content="medium://p/6c040f87d1e4"/><meta data-rh="true" property="twitter:description" content="Unleashing Flutter GPU, Multi-View Embedding, and More"/><meta data-rh="true" name="twitter:image:src" content="https://miro.medium.com/v2/da:true/resize:fit:600/0*bdcb6KGonosfPZ6m"/><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="12 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-24-6c040f87d1e4"/><link data-rh="true" rel="alternate" href="android-app://com.medium.reader/https/medium.com/p/6c040f87d1e4"/><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*bdcb6KGonosfPZ6m"],"url":"https:\u002F\u002Fmedium.com\u002Fflutter\u002Fwhats-new-in-flutter-3-24-6c040f87d1e4","dateCreated":"2024-08-06T18:00:06.984Z","datePublished":"2024-08-06T18:00:06.984Z","dateModified":"2024-11-19T04:43:57.259Z","headline":"What’s new in Flutter 3.24 - Flutter - Medium","name":"What’s new in Flutter 3.24 - Flutter - Medium","description":"Welcome to the latest Flutter update! Flutter 3.24 is packed with exciting new features and enhancements to elevate your app development experience. This release highlights the preview of Flutter…","identifier":"6c040f87d1e4","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-24-6c040f87d1e4"}</script><style type="text/css" data-fela-rehydration="586" 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="586" 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="586" data-fela-type="RULE">.a{font-family:medium-content-sans-serif-font, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif}.b{font-weight:400}.c{background-color:rgba(255, 255, 255, 1)}.l{display:block}.m{position:sticky}.n{top:0}.o{z-index:500}.p{padding:0 24px}.q{align-items:center}.r{border-bottom:solid 1px #F2F2F2}.y{height:41px}.z{line-height:20px}.ab{display:flex}.ac{height:57px}.ae{flex:1 0 auto}.af{color:inherit}.ag{fill:inherit}.ah{font-size:inherit}.ai{border:inherit}.aj{font-family:inherit}.ak{letter-spacing:inherit}.al{font-weight:inherit}.am{padding:0}.an{margin:0}.ao{cursor:pointer}.ap:disabled{cursor:not-allowed}.aq:disabled{color:#6B6B6B}.ar:disabled{fill:#6B6B6B}.au{width:auto}.av path{fill:#242424}.aw{height:25px}.ax{margin-left:16px}.ay{border:none}.az{border-radius:20px}.ba{width:240px}.bb{background:#F9F9F9}.bc path{fill:#6B6B6B}.be{outline:none}.bf{font-family:sohne, "Helvetica Neue", Helvetica, Arial, sans-serif}.bg{font-size:14px}.bh{width:100%}.bi{padding:10px 20px 10px 0}.bj{background-color:transparent}.bk{color:#242424}.bl::placeholder{color:#6B6B6B}.bm{display:inline-block}.bn{margin-left:12px}.bo{margin-right:12px}.bp{border-radius:4px}.bq{margin-left:24px}.br{height:24px}.bx{background-color:#F9F9F9}.by{border-radius:50%}.bz{height:32px}.ca{width:32px}.cb{justify-content:center}.ch{max-width:680px}.ci{min-width:0}.cj{animation:k1 1.2s ease-in-out infinite}.ck{height:100vh}.cl{margin-bottom:16px}.cm{margin-top:48px}.cn{align-items:flex-start}.co{flex-direction:column}.cp{justify-content:space-between}.cq{margin-bottom:24px}.cw{width:80%}.cx{background-color:#F2F2F2}.dd{height:44px}.de{width:44px}.df{margin:auto 0}.dg{margin-bottom:4px}.dh{height:16px}.di{width:120px}.dj{width:80px}.dp{margin-bottom:8px}.dq{width:96%}.dr{width:98%}.ds{width:81%}.dt{margin-left:8px}.du{color:#6B6B6B}.dv{font-size:13px}.dw{height:100%}.ep{color:#FFFFFF}.eq{fill:#FFFFFF}.er{background:rgba(73, 139, 209, 1)}.es{border-color:rgba(73, 139, 209, 1)}.ew:disabled{cursor:inherit !important}.ex:disabled{opacity:0.3}.ey:disabled:hover{background:rgba(73, 139, 209, 1)}.ez:disabled:hover{border-color:rgba(73, 139, 209, 1)}.fa{border-radius:99em}.fb{border-width:1px}.fc{border-style:solid}.fd{box-sizing:border-box}.fe{text-decoration:none}.ff{text-align:center}.fi{margin-right:32px}.fj{position:relative}.fk{fill:#6B6B6B}.fn{background:transparent}.fo svg{margin-left:4px}.fp svg{fill:#6B6B6B}.fr{box-shadow:inset 0 0 0 1px rgba(0, 0, 0, 0.05)}.fs{position:absolute}.fz{margin:0 24px}.gd{background:rgba(255, 255, 255, 1)}.ge{border:1px solid #F2F2F2}.gf{box-shadow:0 1px 4px #F2F2F2}.gg{max-height:100vh}.gh{overflow-y:auto}.gi{left:0}.gj{top:calc(100vh + 100px)}.gk{bottom:calc(100vh + 100px)}.gl{width:10px}.gm{pointer-events:none}.gn{word-break:break-word}.go{word-wrap:break-word}.gp:after{display:block}.gq:after{content:""}.gr:after{clear:both}.gs{line-height:1.23}.gt{letter-spacing:0}.gu{font-style:normal}.gv{font-weight:700}.hq{margin-bottom:-0.27em}.hr{line-height:1.394}.im{align-items:baseline}.in{width:48px}.io{height:48px}.ip{border:2px solid rgba(255, 255, 255, 1)}.iq{z-index:0}.ir{box-shadow:none}.is{border:1px solid rgba(0, 0, 0, 0.05)}.it{margin-left:-12px}.iu{width:28px}.iv{height:28px}.iw{z-index:1}.ix{width:24px}.iy{margin-bottom:2px}.iz{flex-wrap:nowrap}.ja{font-size:16px}.jb{line-height:24px}.jd{margin:0 8px}.je{display:inline}.jf{color:rgba(73, 139, 209, 1)}.jg{fill:rgba(73, 139, 209, 1)}.jj{flex:0 0 auto}.jm{flex-wrap:wrap}.jp{white-space:pre-wrap}.jq{margin-right:4px}.jr{overflow:hidden}.js{max-height:20px}.jt{text-overflow:ellipsis}.ju{display:-webkit-box}.jv{-webkit-line-clamp:1}.jw{-webkit-box-orient:vertical}.jx{word-break:break-all}.jz{padding-left:8px}.ka{padding-right:8px}.lb> *{flex-shrink:0}.lc{overflow-x:scroll}.ld::-webkit-scrollbar{display:none}.le{scrollbar-width:none}.lf{-ms-overflow-style:none}.lg{width:74px}.lh{flex-direction:row}.li{z-index:2}.ll{-webkit-user-select:none}.lm{border:0}.ln{fill:rgba(117, 117, 117, 1)}.lq{outline:0}.lr{user-select:none}.ls> svg{pointer-events:none}.mb{cursor:progress}.mc{margin-left:4px}.md{margin-top:0px}.me{opacity:1}.mf{padding:4px 0}.mi{width:16px}.mk{display:inline-flex}.mq{max-width:100%}.mr{padding:8px 2px}.ms svg{color:#6B6B6B}.nj{margin-left:auto}.nk{margin-right:auto}.nl{max-width:1920px}.nr{clear:both}.nt{cursor:zoom-in}.nu{z-index:auto}.nw{height:auto}.nx{margin-top:10px}.ny{max-width:728px}.ob{line-height:1.58}.oc{letter-spacing:-0.004em}.od{font-family:source-serif-pro, Georgia, Cambria, "Times New Roman", Times, serif}.ow{margin-bottom:-0.46em}.ox{line-height:1.12}.oy{letter-spacing:-0.022em}.oz{font-weight:600}.ps{margin-bottom:-0.28em}.pt{line-height:1.18}.qh{margin-bottom:-0.31em}.qn{list-style-type:disc}.qo{margin-left:30px}.qp{padding-left:0px}.qq{text-decoration:underline}.qw{padding:2px 4px}.qx{font-size:75%}.qy> strong{font-family:inherit}.qz{font-family:source-code-pro, Menlo, Monaco, "Courier New", Courier, monospace}.ra{max-width:600px}.rb{max-width:655px}.rc{max-width:512px}.rd{max-width:1138px}.re{max-width:770px}.rf{max-width:1334px}.rg{max-width:1350px}.rh{max-width:739px}.ri{max-width:836px}.rj{max-width:1600px}.rk{max-width:749px}.rl{font-style:italic}.rm{max-width:318px}.rn{margin-bottom:26px}.ro{margin-top:6px}.rp{margin-top:8px}.rq{margin-right:8px}.rr{padding:8px 16px}.rs{border-radius:100px}.rt{transition:background 300ms ease}.rv{white-space:nowrap}.rw{border-top:none}.rx{margin-bottom:14px}.ry{height:52px}.rz{max-height:52px}.sa{box-sizing:content-box}.sb{position:static}.sd{max-width:155px}.sj{margin-right:20px}.sp{height:0px}.sq{margin-bottom:40px}.sr{margin-bottom:48px}.tf{border-radius:2px}.th{height:64px}.ti{width:64px}.tj{align-self:flex-end}.tk{flex:1 1 auto}.tq{padding-right:4px}.tr{font-weight:500}.ty{margin-top:16px}.tz{color:rgba(255, 255, 255, 1)}.ua{fill:rgba(255, 255, 255, 1)}.ub{background:rgba(25, 25, 25, 1)}.uc{border-color:rgba(25, 25, 25, 1)}.uf:disabled{opacity:0.1}.ug:disabled:hover{background:rgba(25, 25, 25, 1)}.uh:disabled:hover{border-color:rgba(25, 25, 25, 1)}.uq{gap:18px}.ur{fill:rgba(61, 61, 61, 1)}.ut{margin-top:32px}.uu{fill:#242424}.uv{background:0}.uw{border-color:#242424}.ux:disabled:hover{color:#242424}.uy:disabled:hover{fill:#242424}.uz:disabled:hover{border-color:#242424}.vk{border-bottom:solid 1px #E5E5E5}.vl{margin-top:72px}.vm{padding:24px 0}.vn{margin-bottom:0px}.vo{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)}.jc:hover{text-decoration:underline}.jh:hover:not(:disabled){color:rgba(68, 119, 175, 1)}.ji:hover:not(:disabled){fill:rgba(68, 119, 175, 1)}.lp:hover{fill:rgba(8, 8, 8, 1)}.mg:hover{fill:#000000}.mh:hover p{color:#000000}.mj:hover{color:#000000}.mt:hover svg{color:#000000}.ru:hover{background-color:#F2F2F2}.tg:hover{background-color:none}.ud:hover{background:#000000}.ue:hover{border-color:#242424}.us:hover{fill:rgba(25, 25, 25, 1)}.bd:focus-within path{fill:#242424}.lo:focus{fill:rgba(8, 8, 8, 1)}.mu:focus svg{color:#000000}.nv:focus{transform:scale(1.01)}.lt:active{border-style:none}</style><style type="text/css" data-fela-rehydration="586" 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}.hm{font-size:42px}.hn{margin-top:1.19em}.ho{line-height:52px}.hp{letter-spacing:-0.011em}.ie{font-size:22px}.if{margin-top:0.92em}.ig{line-height:28px}.il{align-items:center}.kn{border-top:solid 1px #F2F2F2}.ko{border-bottom:solid 1px #F2F2F2}.kp{margin:32px 0 0}.kq{padding:3px 8px}.kz> *{margin-right:24px}.la> :last-child{margin-right:0}.ma{margin-top:0px}.mp{margin:0}.nq{margin-top:56px}.os{font-size:20px}.ot{margin-top:2.14em}.ou{line-height:32px}.ov{letter-spacing:-0.003em}.po{font-size:24px}.pp{margin-top:1.95em}.pq{line-height:30px}.pr{letter-spacing:-0.016em}.qe{margin-top:1.72em}.qf{line-height:24px}.qg{letter-spacing:0}.qm{margin-top:0.94em}.qv{margin-top:1.14em}.si{display:inline-block}.so{margin-bottom:104px}.ss{flex-direction:row}.sv{margin-bottom:0}.sw{margin-right:20px}.tl{max-width:500px}.um{margin-bottom:88px}.up{margin-bottom:72px}.ve{width:min-width}.vj{padding-top:72px}</style><style type="text/css" data-fela-rehydration="586" data-fela-type="RULE" media="all and (max-width: 1079.98px)">.e{display:none}.lz{margin-top:0px}.nz{margin-left:auto}.oa{text-align:center}.sh{display:inline-block}</style><style type="text/css" data-fela-rehydration="586" data-fela-type="RULE" media="all and (max-width: 903.98px)">.f{display:none}.ly{margin-top:0px}.sg{display:inline-block}</style><style type="text/css" data-fela-rehydration="586" data-fela-type="RULE" media="all and (max-width: 727.98px)">.g{display:none}.lw{margin-top:0px}.lx{margin-right:0px}.sf{display:inline-block}</style><style type="text/css" data-fela-rehydration="586" 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{line-height:38px}.gz{letter-spacing:-0.014em}.hs{font-size:18px}.ht{margin-top:0.79em}.hu{line-height:24px}.ih{align-items:flex-start}.jk{flex-direction:column}.jn{margin-bottom:2px}.kb{margin:24px -24px 0}.kc{padding:0}.kr> *{margin-right:8px}.ks> :last-child{margin-right:24px}.lj{margin-left:0px}.lu{margin-top:0px}.lv{margin-right:0px}.ml{margin:0}.mv{border:1px solid #F2F2F2}.mw{border-radius:99em}.mx{padding:0px 16px 0px 12px}.my{height:38px}.mz{align-items:center}.nb svg{margin-right:8px}.nm{margin-top:40px}.oe{margin-top:1.56em}.of{line-height:28px}.og{letter-spacing:-0.003em}.pa{font-size:20px}.pb{margin-top:1.2em}.pc{letter-spacing:0}.pu{font-size:16px}.pv{margin-top:1.23em}.qi{margin-top:0.67em}.qr{margin-top:1.34em}.se{display:inline-block}.sk{margin-bottom:96px}.td{margin-bottom:20px}.te{margin-right:0}.tp{max-width:100%}.ts{font-size:24px}.tt{line-height:30px}.tu{letter-spacing:-0.016em}.ui{margin-bottom:64px}.va{width:100%}.vf{padding-top:48px}.na:hover{border-color:#E5E5E5}</style><style type="text/css" data-fela-rehydration="586" 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}.hi{font-size:42px}.hj{margin-top:1.19em}.hk{line-height:52px}.hl{letter-spacing:-0.011em}.ib{font-size:22px}.ic{margin-top:0.92em}.id{line-height:28px}.ik{align-items:center}.kj{border-top:solid 1px #F2F2F2}.kk{border-bottom:solid 1px #F2F2F2}.kl{margin:32px 0 0}.km{padding:3px 8px}.kx> *{margin-right:24px}.ky> :last-child{margin-right:0}.mo{margin:0}.np{margin-top:56px}.oo{font-size:20px}.op{margin-top:2.14em}.oq{line-height:32px}.or{letter-spacing:-0.003em}.pk{font-size:24px}.pl{margin-top:1.95em}.pm{line-height:30px}.pn{letter-spacing:-0.016em}.qb{margin-top:1.72em}.qc{line-height:24px}.qd{letter-spacing:0}.ql{margin-top:0.94em}.qu{margin-top:1.14em}.sn{margin-bottom:104px}.st{flex-direction:row}.sx{margin-bottom:0}.sy{margin-right:20px}.tm{max-width:500px}.ul{margin-bottom:88px}.uo{margin-bottom:72px}.vd{width:min-width}.vi{padding-top:72px}</style><style type="text/css" data-fela-rehydration="586" 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}.he{font-size:42px}.hf{margin-top:1.19em}.hg{line-height:52px}.hh{letter-spacing:-0.011em}.hy{font-size:22px}.hz{margin-top:0.92em}.ia{line-height:28px}.ij{align-items:center}.kf{border-top:solid 1px #F2F2F2}.kg{border-bottom:solid 1px #F2F2F2}.kh{margin:32px 0 0}.ki{padding:3px 8px}.kv> *{margin-right:24px}.kw> :last-child{margin-right:0}.mn{margin:0}.no{margin-top:56px}.ok{font-size:20px}.ol{margin-top:2.14em}.om{line-height:32px}.on{letter-spacing:-0.003em}.pg{font-size:24px}.ph{margin-top:1.95em}.pi{line-height:30px}.pj{letter-spacing:-0.016em}.py{margin-top:1.72em}.pz{line-height:24px}.qa{letter-spacing:0}.qk{margin-top:0.94em}.qt{margin-top:1.14em}.sm{margin-bottom:104px}.su{flex-direction:row}.sz{margin-bottom:0}.ta{margin-right:20px}.tn{max-width:500px}.uk{margin-bottom:88px}.un{margin-bottom:72px}.vc{width:min-width}.vh{padding-top:72px}</style><style type="text/css" data-fela-rehydration="586" 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}.ha{font-size:32px}.hb{margin-top:1.01em}.hc{line-height:38px}.hd{letter-spacing:-0.014em}.hv{font-size:18px}.hw{margin-top:0.79em}.hx{line-height:24px}.ii{align-items:flex-start}.jl{flex-direction:column}.jo{margin-bottom:2px}.kd{margin:24px 0 0}.ke{padding:0}.kt> *{margin-right:8px}.ku> :last-child{margin-right:8px}.lk{margin-left:0px}.mm{margin:0}.nc{border:1px solid #F2F2F2}.nd{border-radius:99em}.ne{padding:0px 16px 0px 12px}.nf{height:38px}.ng{align-items:center}.ni svg{margin-right:8px}.nn{margin-top:40px}.oh{margin-top:1.56em}.oi{line-height:28px}.oj{letter-spacing:-0.003em}.pd{font-size:20px}.pe{margin-top:1.2em}.pf{letter-spacing:0}.pw{font-size:16px}.px{margin-top:1.23em}.qj{margin-top:0.67em}.qs{margin-top:1.34em}.sl{margin-bottom:96px}.tb{margin-bottom:20px}.tc{margin-right:0}.to{max-width:100%}.tv{font-size:24px}.tw{line-height:30px}.tx{letter-spacing:-0.016em}.uj{margin-bottom:64px}.vb{width:100%}.vg{padding-top:48px}.nh:hover{border-color:#E5E5E5}</style><style type="text/css" data-fela-rehydration="586" data-fela-type="RULE" media="print">.sc{display:none}</style><style type="text/css" data-fela-rehydration="586" data-fela-type="RULE" media="(orientation: landscape) and (max-width: 903.98px)">.jy{max-height:none}</style><style type="text/css" data-fela-rehydration="586" data-fela-type="RULE" media="(prefers-reduced-motion: no-preference)">.ns{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%2F6c040f87d1e4&%7Efeature=LoOpenInAppButton&%7Echannel=ShowPostUnderCollection&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&redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fwhats-new-in-flutter-3-24-6c040f87d1e4&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&redirect=https%3A%2F%2Fmedium.com%2Fnew-story&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&redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fwhats-new-in-flutter-3-24-6c040f87d1e4&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="fb28" class="pw-post-title gs gt gu bf gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq bk" data-testid="storyTitle">What’s new in Flutter 3.24</h1></div><div><h2 id="11cf" class="pw-subtitle-paragraph hr gt gu bf b hs ht hu hv hw hx hy hz ia ib ic id ie if ig cq du">Unleashing Flutter GPU, Multi-View Embedding, and More</h2><div><div class="speechify-ignore ab cp"><div class="speechify-ignore bh l"><div class="ih ii ij ik il ab"><div><div class="ab im"><div><div class="bm" aria-hidden="false"><a rel="noopener follow" href="/@kevinchisholm?source=post_page---byline--6c040f87d1e4--------------------------------"><div class="l in io by ip iq"><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="ir by l dd de fs n is ft"></div></div></div></a></div></div><div class="it ab fj"><div><div class="bm" aria-hidden="false"><a href="https://medium.com/flutter?source=post_page---byline--6c040f87d1e4--------------------------------" rel="noopener follow"><div class="l iu iv by ip iw"><div class="l fj"><img alt="Flutter" class="l fd by br ix 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="ir by l br ix fs n is 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="iy ab q"><div class="ab q iz"><div class="ab q"><div><div class="bm" aria-hidden="false"><p class="bf b ja jb bk"><a class="af ag ah ai aj ak al am an ao ap aq ar jc" data-testid="authorName" rel="noopener follow" href="/@kevinchisholm?source=post_page---byline--6c040f87d1e4--------------------------------">Kevin Chisholm</a></p></div></div></div><span class="jd je" aria-hidden="true"><span class="bf b bg z du">·</span></span><p class="bf b ja jb du"><span><a class="jf jg ah ai aj ak al am an ao ap aq ar ex jh ji" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fsubscribe%2Fuser%2F7cb43f46877f&operation=register&redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fwhats-new-in-flutter-3-24-6c040f87d1e4&user=Kevin+Chisholm&userId=7cb43f46877f&source=post_page-7cb43f46877f--byline--6c040f87d1e4---------------------post_header-----------">Follow</a></span></p></div></div></span></div></div><div class="l jj"><span class="bf b bg z du"><div class="ab cn jk jl jm"><div class="jn jo ab"><div class="bf b bg z du ab jp"><span class="jq l jj">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 jc ab q" data-testid="publicationName" href="https://medium.com/flutter?source=post_page---byline--6c040f87d1e4--------------------------------" rel="noopener follow"><p class="bf b bg z jr js jt ju jv jw jx jy bk">Flutter</p></a></div></div></div><div class="h k"><span class="jd je" 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">12 min read</span><div class="jz ka 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 6, 2024</span></div></span></div></span></div></div></div><div class="ab cp kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq"><div class="h k w fg fh q"><div class="lg l"><div class="ab q lh li"><div class="pw-multi-vote-icon fj jq lj lk ll"><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%2F6c040f87d1e4&operation=register&redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fwhats-new-in-flutter-3-24-6c040f87d1e4&user=Kevin+Chisholm&userId=7cb43f46877f&source=---header_actions--6c040f87d1e4---------------------clap_footer-----------"><div><div class="bm" aria-hidden="false"><div class="lm ao ln lo lp lq am lr ls lt ll"><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 lu lv lw lx ly lz ma"><p class="bf b dv z du"><span class="mb">--</span></p></div></div></div><div><div class="bm" aria-hidden="false"><button class="ao lm me mf ab q fk mg mh" aria-label="responses"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" class="md"><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 mc md">27</span></p></button></div></div></div><div class="ab q kr ks kt ku kv kw kx ky kz la lb lc ld le lf"><div class="mi 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%2F6c040f87d1e4&operation=register&redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fwhats-new-in-flutter-3-24-6c040f87d1e4&source=---header_actions--6c040f87d1e4---------------------bookmark_footer-----------"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" fill="none" viewBox="0 0 25 25" class="du mj" 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 mk cn"><div class="l ae"><div class="ab cb"><div class="ml mm mn mo mp mq 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 mr an ao ap ex ms mt mh mu mv mw mx my s mz na nb nc nd ne nf u ng nh ni"><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 mr an ao ap ex ms mt mh mu mv mw mx my s mz na nb nc nd ne nf u ng nh ni"><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><figure class="nm nn no np nq nr nj nk paragraph-image"><div role="button" tabindex="0" class="ns nt fj nu bh nv"><div class="nj nk nl"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/1*EA-cAY6uwkYqYb725vnCIw.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*EA-cAY6uwkYqYb725vnCIw.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*EA-cAY6uwkYqYb725vnCIw.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*EA-cAY6uwkYqYb725vnCIw.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*EA-cAY6uwkYqYb725vnCIw.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*EA-cAY6uwkYqYb725vnCIw.png 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/1*EA-cAY6uwkYqYb725vnCIw.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/1*EA-cAY6uwkYqYb725vnCIw.png 640w, https://miro.medium.com/v2/resize:fit:720/1*EA-cAY6uwkYqYb725vnCIw.png 720w, https://miro.medium.com/v2/resize:fit:750/1*EA-cAY6uwkYqYb725vnCIw.png 750w, https://miro.medium.com/v2/resize:fit:786/1*EA-cAY6uwkYqYb725vnCIw.png 786w, https://miro.medium.com/v2/resize:fit:828/1*EA-cAY6uwkYqYb725vnCIw.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*EA-cAY6uwkYqYb725vnCIw.png 1100w, https://miro.medium.com/v2/resize:fit:1400/1*EA-cAY6uwkYqYb725vnCIw.png 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 mq nw c" width="700" height="394" loading="eager" role="presentation"/></picture></div></div><figcaption class="nx ff ny nj nk nz oa bf b bg z du">Flutter 3.24 on a blue background</figcaption></figure><p id="50f9" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">Welcome to the latest Flutter update! Flutter 3.24 is packed with exciting new features and enhancements to elevate your app development experience. This release highlights the preview of Flutter GPU, which enables advanced graphics and 3D scenes directly in Flutter. Web apps can now embed multiple Flutter views, enhancing your app’s versatility. And finally, we’ve added video ad monetization support to help you maximize revenue.</p><p id="54af" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">In the past few months, the Flutter community has been incredibly active, with 852 framework commits and 615 engine commits. We’re excited to welcome 49 new contributors who have helped make this release possible. Your dedication and passion are what drive Flutter forward.</p><p id="6906" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">So, dive in and discover all the new features and enhancements that the Flutter community has brought to this latest release!</p><h1 id="e149" class="ox oy gu bf oz pa pb hu pc pd pe hx pf pg ph pi pj pk pl pm pn po pp pq pr ps bk">Flutter Framework</h1><h2 id="a3cc" class="pt oy gu bf oz pu pv dy pc pw px ea pf ok py pz qa oo qb qc qd os qe qf qg qh bk">New Slivers</h2><p id="61b6" class="pw-post-body-paragraph ob oc gu od b hs qi of og hv qj oi oj ok qk om on oo ql oq or os qm ou ov ow gn bk">This release adds new slivers that can be composed together for dynamic app bar behaviors:</p><ul class=""><li id="e51e" class="ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow qn qo qp bk"><a class="af qq" href="http://api.flutter.dev/flutter/widgets/PinnedHeaderSliver-class.html" rel="noopener ugc nofollow" target="_blank">PinnedHeaderSliver</a></li><li id="d770" class="ob oc gu od b hs qr of og hv qs oi oj ok qt om on oo qu oq or os qv ou ov ow qn qo qp bk"><a class="af qq" href="http://api.flutter.dev/flutter/widgets/SliverResizingHeader-class.html" rel="noopener ugc nofollow" target="_blank">SliverResizingHeader</a></li></ul><p id="4196" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">You can use these new slivers to make headers that float, stay pinned, or resize as the user scrolls. These new slivers are similar to the existing <code class="cx qw qx qy qz b"><a class="af qq" href="https://api.flutter.dev/flutter/widgets/SliverPersistentHeader-class.html" rel="noopener ugc nofollow" target="_blank">SliverPersistentHeader</a></code> and <code class="cx qw qx qy qz b"><a class="af qq" href="http://sliverappbar" rel="noopener ugc nofollow" target="_blank">SliverAppBar</a></code> slivers, but have simpler APIs that can be combined for greater effect.</p><p id="3b73" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">These new slivers come with new sample code. For example, <code class="cx qw qx qy qz b">PinnedHeaderSliver</code>’s API documentation has an example that recreates effects like the iOS Settings app’s app bar:</p><figure class="nm nn no np nq nr nj nk paragraph-image"><div class="nj nk ra"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*bdcb6KGonosfPZ6m 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*bdcb6KGonosfPZ6m 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*bdcb6KGonosfPZ6m 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*bdcb6KGonosfPZ6m 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*bdcb6KGonosfPZ6m 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*bdcb6KGonosfPZ6m 1100w, https://miro.medium.com/v2/resize:fit:1200/format:webp/0*bdcb6KGonosfPZ6m 1200w" 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, 600px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/0*bdcb6KGonosfPZ6m 640w, https://miro.medium.com/v2/resize:fit:720/0*bdcb6KGonosfPZ6m 720w, https://miro.medium.com/v2/resize:fit:750/0*bdcb6KGonosfPZ6m 750w, https://miro.medium.com/v2/resize:fit:786/0*bdcb6KGonosfPZ6m 786w, https://miro.medium.com/v2/resize:fit:828/0*bdcb6KGonosfPZ6m 828w, https://miro.medium.com/v2/resize:fit:1100/0*bdcb6KGonosfPZ6m 1100w, https://miro.medium.com/v2/resize:fit:1200/0*bdcb6KGonosfPZ6m 1200w" 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, 600px"/><img alt="" class="bh mq nw c" width="600" height="663" loading="lazy" role="presentation"/></picture></div></figure><h2 id="e121" class="pt oy gu bf oz pu pv dy pc pw px ea pf ok py pz qa oo qb qc qd os qe qf qg qh bk">Updates in the Cupertino library</h2><p id="f686" class="pw-post-body-paragraph ob oc gu od b hs qi of og hv qj oi oj ok qk om on oo ql oq or os qm ou ov ow gn bk">In this release, we’ve improved the fidelity of <code class="cx qw qx qy qz b"><a class="af qq" href="https://api.flutter.dev/flutter/cupertino/CupertinoActionSheet-class.html" rel="noopener ugc nofollow" target="_blank">CupertinoActionSheet</a></code><strong class="od gv">. </strong>Sliding your finger across the action sheet’s buttons now provides haptic feedback. The buttons’ font size and weight now match their native counterparts.</p><figure class="nm nn no np nq nr nj nk paragraph-image"><div class="nj nk rb"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*_o_9V0RlITOZdU4v 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*_o_9V0RlITOZdU4v 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*_o_9V0RlITOZdU4v 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*_o_9V0RlITOZdU4v 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*_o_9V0RlITOZdU4v 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*_o_9V0RlITOZdU4v 1100w, https://miro.medium.com/v2/resize:fit:1310/format:webp/0*_o_9V0RlITOZdU4v 1310w" 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, 655px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/0*_o_9V0RlITOZdU4v 640w, https://miro.medium.com/v2/resize:fit:720/0*_o_9V0RlITOZdU4v 720w, https://miro.medium.com/v2/resize:fit:750/0*_o_9V0RlITOZdU4v 750w, https://miro.medium.com/v2/resize:fit:786/0*_o_9V0RlITOZdU4v 786w, https://miro.medium.com/v2/resize:fit:828/0*_o_9V0RlITOZdU4v 828w, https://miro.medium.com/v2/resize:fit:1100/0*_o_9V0RlITOZdU4v 1100w, https://miro.medium.com/v2/resize:fit:1310/0*_o_9V0RlITOZdU4v 1310w" 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, 655px"/><img alt="" class="bh mq nw c" width="655" height="1140" loading="lazy" role="presentation"/></picture></div></figure><p id="99e0" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">We’ve also added new focus properties to <code class="cx qw qx qy qz b"><a class="af qq" href="https://api.flutter.dev/flutter/cupertino/CupertinoButton-class.html" rel="noopener ugc nofollow" target="_blank">CupertinoButton</a></code>, and you can now customize the color of a disabled <code class="cx qw qx qy qz b"><a class="af qq" href="https://api.flutter.dev/flutter/cupertino/CupertinoTextField-class.html" rel="noopener ugc nofollow" target="_blank">CupertinoTextField</a></code>.</p><p id="88ed" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">A refresh of the Cupertino library is underway, expect more updates in future releases!</p><h2 id="cf9b" class="pt oy gu bf oz pu pv dy pc pw px ea pf ok py pz qa oo qb qc qd os qe qf qg qh bk">TreeView</h2><p id="9140" class="pw-post-body-paragraph ob oc gu od b hs qi of og hv qj oi oj ok qk om on oo ql oq or os qm ou ov ow gn bk">The <code class="cx qw qx qy qz b"><a class="af qq" href="https://pub.dev/packages/two_dimensional_scrollables" rel="noopener ugc nofollow" target="_blank">two_dimensional_scrollables</a></code> package released the <code class="cx qw qx qy qz b"><a class="af qq" href="https://pub.dev/documentation/two_dimensional_scrollables/latest/two_dimensional_scrollables/TreeView-class.html" rel="noopener ugc nofollow" target="_blank">TreeView</a></code> widget, alongside several companion classes for building performant scrolling trees that can scroll in all directions as the tree grows. The sample app included in the package was also updated with several new examples of using the <code class="cx qw qx qy qz b"><a class="af qq" href="https://pub.dev/documentation/two_dimensional_scrollables/latest/two_dimensional_scrollables/TableView-class.html" rel="noopener ugc nofollow" target="_blank">TableView</a></code> and <code class="cx qw qx qy qz b"><a class="af qq" href="https://pub.dev/documentation/two_dimensional_scrollables/latest/two_dimensional_scrollables/TreeView-class.html" rel="noopener ugc nofollow" target="_blank">TreeView</a></code> widgets.</p><figure class="nm nn no np nq nr nj nk paragraph-image"><div class="nj nk ra"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*wcmJCv-6owwsolRl 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*wcmJCv-6owwsolRl 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*wcmJCv-6owwsolRl 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*wcmJCv-6owwsolRl 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*wcmJCv-6owwsolRl 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*wcmJCv-6owwsolRl 1100w, https://miro.medium.com/v2/resize:fit:1200/format:webp/0*wcmJCv-6owwsolRl 1200w" 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, 600px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/0*wcmJCv-6owwsolRl 640w, https://miro.medium.com/v2/resize:fit:720/0*wcmJCv-6owwsolRl 720w, https://miro.medium.com/v2/resize:fit:750/0*wcmJCv-6owwsolRl 750w, https://miro.medium.com/v2/resize:fit:786/0*wcmJCv-6owwsolRl 786w, https://miro.medium.com/v2/resize:fit:828/0*wcmJCv-6owwsolRl 828w, https://miro.medium.com/v2/resize:fit:1100/0*wcmJCv-6owwsolRl 1100w, https://miro.medium.com/v2/resize:fit:1200/0*wcmJCv-6owwsolRl 1200w" 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, 600px"/><img alt="" class="bh mq nw c" width="600" height="427" loading="lazy" role="presentation"/></picture></div></figure><p id="02ce" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk"><code class="cx qw qx qy qz b"><a class="af qq" href="https://api.flutter.dev/flutter/widgets/TreeSliver-class.html" rel="noopener ugc nofollow" target="_blank">TreeSliver</a></code> was also added to the framework for building trees in one dimensional scrolling. The <code class="cx qw qx qy qz b">TreeView</code> and <code class="cx qw qx qy qz b">TreeSliver</code> APIs match, making it easy to switch between the one that is right for your use case.</p><h2 id="eeeb" class="pt oy gu bf oz pu pv dy pc pw px ea pf ok py pz qa oo qb qc qd os qe qf qg qh bk">CarouselView</h2><p id="16d2" class="pw-post-body-paragraph ob oc gu od b hs qi of og hv qj oi oj ok qk om on oo ql oq or os qm ou ov ow gn bk">This release included the <a class="af qq" href="https://m3.material.io/components/carousel/overview" rel="noopener ugc nofollow" target="_blank">Material Design carousel</a> widget: <code class="cx qw qx qy qz b">CarouselView</code>. The <code class="cx qw qx qy qz b">CarouselView</code> presents the “<a class="af qq" href="https://m3.material.io/components/carousel/specs#477de3a1-c9df-4742-baf3-bcd5eeb3764c" rel="noopener ugc nofollow" target="_blank">Uncontained</a>” layout: a scrollable list of items that scroll to the edge of the container, and the leading and the trailing items can dynamically change size when they are scrolling out of the view and scrolling in the view.</p><figure class="nm nn no np nq nr nj nk paragraph-image"><div class="nj nk rc"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/1*6ytqSvtR2TJzAE6LntHTGw.gif 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*6ytqSvtR2TJzAE6LntHTGw.gif 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*6ytqSvtR2TJzAE6LntHTGw.gif 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*6ytqSvtR2TJzAE6LntHTGw.gif 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*6ytqSvtR2TJzAE6LntHTGw.gif 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*6ytqSvtR2TJzAE6LntHTGw.gif 1100w, https://miro.medium.com/v2/resize:fit:1024/format:webp/1*6ytqSvtR2TJzAE6LntHTGw.gif 1024w" 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, 512px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/1*6ytqSvtR2TJzAE6LntHTGw.gif 640w, https://miro.medium.com/v2/resize:fit:720/1*6ytqSvtR2TJzAE6LntHTGw.gif 720w, https://miro.medium.com/v2/resize:fit:750/1*6ytqSvtR2TJzAE6LntHTGw.gif 750w, https://miro.medium.com/v2/resize:fit:786/1*6ytqSvtR2TJzAE6LntHTGw.gif 786w, https://miro.medium.com/v2/resize:fit:828/1*6ytqSvtR2TJzAE6LntHTGw.gif 828w, https://miro.medium.com/v2/resize:fit:1100/1*6ytqSvtR2TJzAE6LntHTGw.gif 1100w, https://miro.medium.com/v2/resize:fit:1024/1*6ytqSvtR2TJzAE6LntHTGw.gif 1024w" 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, 512px"/><img alt="Flutter CarouselView example" class="bh mq nw c" width="512" height="493" loading="lazy"/></picture></div></figure><h2 id="9dbb" class="pt oy gu bf oz pu pv dy pc pw px ea pf ok py pz qa oo qb qc qd os qe qf qg qh bk">More functionality available from widgets</h2><p id="dbc3" class="pw-post-body-paragraph ob oc gu od b hs qi of og hv qj oi oj ok qk om on oo ql oq or os qm ou ov ow gn bk">This release contains some of the work to relocate core widget logic, that isn’t design specific, out of the Material library and into the Widgets library for more general use. This includes:</p><ul class=""><li id="c608" class="ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow qn qo qp bk">The <code class="cx qw qx qy qz b"><a class="af qq" href="https://github.com/flutter/flutter/pull/148523" rel="noopener ugc nofollow" target="_blank">Feedback</a></code> widget, which provides easy access to haptic and audio feedback from the device in response to gestures like tap, long press, and more.</li><li id="43ee" class="ob oc gu od b hs qr of og hv qs oi oj ok qt om on oo qu oq or os qv ou ov ow qn qo qp bk"><code class="cx qw qx qy qz b"><a class="af qq" href="https://github.com/flutter/flutter/pull/148272" rel="noopener ugc nofollow" target="_blank">ToggleableStateMixin</a></code><a class="af qq" href="https://github.com/flutter/flutter/pull/148272" rel="noopener ugc nofollow" target="_blank"> and </a><code class="cx qw qx qy qz b"><a class="af qq" href="https://github.com/flutter/flutter/pull/148272" rel="noopener ugc nofollow" target="_blank">ToggleablePainter</a></code>, base classes for building toggle widgets like checkboxes, switches, and radio buttons.</li></ul><h2 id="e897" class="pt oy gu bf oz pu pv dy pc pw px ea pf ok py pz qa oo qb qc qd os qe qf qg qh bk">Enhanced enum features for AnimationStatus</h2><p id="be47" class="pw-post-body-paragraph ob oc gu od b hs qi of og hv qj oi oj ok qk om on oo ql oq or os qm ou ov ow gn bk">In a fantastic <a class="af qq" href="https://github.com/flutter/flutter/pull/147801" rel="noopener ugc nofollow" target="_blank">contribution</a> from community member <a class="af qq" href="https://github.com/nate-thegrate" rel="noopener ugc nofollow" target="_blank">@nate-thegrate</a>, enhanced enum features were added to <a class="af qq" href="https://api.flutter.dev/flutter/animation/AnimationStatus.html" rel="noopener ugc nofollow" target="_blank">AnimationStatus</a>, including getters:</p><ul class=""><li id="322f" class="ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow qn qo qp bk">isDismissed</li><li id="d8ec" class="ob oc gu od b hs qr of og hv qs oi oj ok qt om on oo qu oq or os qv ou ov ow qn qo qp bk">isCompleted</li><li id="73d1" class="ob oc gu od b hs qr of og hv qs oi oj ok qt om on oo qu oq or os qv ou ov ow qn qo qp bk">isRunning</li><li id="401b" class="ob oc gu od b hs qr of og hv qs oi oj ok qt om on oo qu oq or os qv ou ov ow qn qo qp bk">isForwardOrCompleted</li></ul><p id="9fea" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">Some of these getters already existed in <code class="cx qw qx qy qz b"><a class="af qq" href="https://api.flutter.dev/flutter/animation/Animation-class.html" rel="noopener ugc nofollow" target="_blank">Animation</a></code> subclasses, like <code class="cx qw qx qy qz b"><a class="af qq" href="https://api.flutter.dev/flutter/animation/AnimationController-class.html" rel="noopener ugc nofollow" target="_blank">AnimationController</a></code> and <code class="cx qw qx qy qz b"><a class="af qq" href="https://api.flutter.dev/flutter/animation/CurvedAnimation-class.html" rel="noopener ugc nofollow" target="_blank">CurvedAnimation</a></code>. Now all of these status getters are available in Animation subclasses in addition to AnimationStatus. Lastly, a <code class="cx qw qx qy qz b"><a class="af qq" href="https://api.flutter.dev/flutter/animation/AnimationController/toggle.html" rel="noopener ugc nofollow" target="_blank">toggle</a></code> method was added to AnimationController to switch the direction of the animation.</p><h2 id="209b" class="pt oy gu bf oz pu pv dy pc pw px ea pf ok py pz qa oo qb qc qd os qe qf qg qh bk">Updates in SelectionArea</h2><p id="f943" class="pw-post-body-paragraph ob oc gu od b hs qi of og hv qj oi oj ok qk om on oo ql oq or os qm ou ov ow gn bk">Flutter’s <code class="cx qw qx qy qz b"><a class="af qq" href="https://api.flutter.dev/flutter/material/SelectionArea-class.html" rel="noopener ugc nofollow" target="_blank">SelectionArea</a></code> now supports more native gestures associated with a triple click using a mouse, and double tapping on a touch device. By default, the <code class="cx qw qx qy qz b"><a class="af qq" href="https://api.flutter.dev/flutter/material/SelectionArea-class.html" rel="noopener ugc nofollow" target="_blank">SelectionArea</a></code> and <code class="cx qw qx qy qz b"><a class="af qq" href="https://api.flutter.dev/flutter/widgets/SelectableRegion-class.html" rel="noopener ugc nofollow" target="_blank">SelectableRegion</a></code> widgets use these new gestures.</p><p id="7409" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">Triple click</p><ul class=""><li id="03dd" class="ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow qn qo qp bk">Triple click + drag: Extends the selection in paragraph blocks.</li><li id="c08b" class="ob oc gu od b hs qr of og hv qs oi oj ok qt om on oo qu oq or os qv ou ov ow qn qo qp bk">Triple click: Selects the paragraph block at the clicked position.</li></ul><figure class="nm nn no np nq nr nj nk paragraph-image"><div role="button" tabindex="0" class="ns nt fj nu bh nv"><div class="nj nk rd"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*_GmbsIKfnwEAW6G8 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*_GmbsIKfnwEAW6G8 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*_GmbsIKfnwEAW6G8 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*_GmbsIKfnwEAW6G8 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*_GmbsIKfnwEAW6G8 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*_GmbsIKfnwEAW6G8 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*_GmbsIKfnwEAW6G8 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*_GmbsIKfnwEAW6G8 640w, https://miro.medium.com/v2/resize:fit:720/0*_GmbsIKfnwEAW6G8 720w, https://miro.medium.com/v2/resize:fit:750/0*_GmbsIKfnwEAW6G8 750w, https://miro.medium.com/v2/resize:fit:786/0*_GmbsIKfnwEAW6G8 786w, https://miro.medium.com/v2/resize:fit:828/0*_GmbsIKfnwEAW6G8 828w, https://miro.medium.com/v2/resize:fit:1100/0*_GmbsIKfnwEAW6G8 1100w, https://miro.medium.com/v2/resize:fit:1400/0*_GmbsIKfnwEAW6G8 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 mq nw c" width="700" height="151" loading="lazy" role="presentation"/></picture></div></div></figure><p id="ab4f" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">Double tap</p><ul class=""><li id="dec2" class="ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow qn qo qp bk">Double tap + drag: extends the selection in word blocks (supported on native Android/Fuchsia/iOS, and iOS web).</li><li id="280b" class="ob oc gu od b hs qr of og hv qs oi oj ok qt om on oo qu oq or os qv ou ov ow qn qo qp bk">Double tap: selects the word at the tapped position (supported on native Android/Fuchsia/iOS, and Android/Fuchsia web).</li></ul><figure class="nm nn no np nq nr nj nk paragraph-image"><div role="button" tabindex="0" class="ns nt fj nu bh nv"><div class="nj nk re"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*DwZgIybQr3FDFxXd 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*DwZgIybQr3FDFxXd 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*DwZgIybQr3FDFxXd 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*DwZgIybQr3FDFxXd 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*DwZgIybQr3FDFxXd 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*DwZgIybQr3FDFxXd 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*DwZgIybQr3FDFxXd 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*DwZgIybQr3FDFxXd 640w, https://miro.medium.com/v2/resize:fit:720/0*DwZgIybQr3FDFxXd 720w, https://miro.medium.com/v2/resize:fit:750/0*DwZgIybQr3FDFxXd 750w, https://miro.medium.com/v2/resize:fit:786/0*DwZgIybQr3FDFxXd 786w, https://miro.medium.com/v2/resize:fit:828/0*DwZgIybQr3FDFxXd 828w, https://miro.medium.com/v2/resize:fit:1100/0*DwZgIybQr3FDFxXd 1100w, https://miro.medium.com/v2/resize:fit:1400/0*DwZgIybQr3FDFxXd 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 mq nw c" width="700" height="208" loading="lazy" role="presentation"/></picture></div></div></figure><h1 id="8237" class="ox oy gu bf oz pa pb hu pc pd pe hx pf pg ph pi pj pk pl pm pn po pp pq pr ps bk">Engine</h1><h2 id="667a" class="pt oy gu bf oz pu pv dy pc pw px ea pf ok py pz qa oo qb qc qd os qe qf qg qh bk">Impeller</h2><p id="8aa7" class="pw-post-body-paragraph ob oc gu od b hs qi of og hv qj oi oj ok qk om on oo ql oq or os qm ou ov ow gn bk"><strong class="od gv">Improving Performance and Fidelity</strong></p><p id="c325" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">In anticipation of removing the Impeller opt-out on iOS in a stable release coming soon, the team has been hard at work on improvements to Impeller’s performance and fidelity. As one example, a long series of improvements to text rendering <a class="af qq" href="https://github.com/flutter/flutter/issues/138798" rel="noopener ugc nofollow" target="_blank">greatly increased the performance of emoji scrolling</a>, eliminating jank when scrolling a large collection of emojis, which was a fantastic stress test of Impeller’s text rendering capabilities.</p><p id="b84b" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">Additionally, by <a class="af qq" href="https://github.com/flutter/engine/pull/53042" rel="noopener ugc nofollow" target="_blank">solving a number of issues</a> we have also greatly improved the fidelity of Impeller’s text rendering in this release. In particular, text weight, spacing, and kerning now all match the fidelity of text with the legacy renderer.</p><figure class="nm nn no np nq nr nj nk paragraph-image"><div role="button" tabindex="0" class="ns nt fj nu bh nv"><div class="nj nk rf"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*gIu2Wm9mpuMGb1JY 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*gIu2Wm9mpuMGb1JY 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*gIu2Wm9mpuMGb1JY 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*gIu2Wm9mpuMGb1JY 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*gIu2Wm9mpuMGb1JY 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*gIu2Wm9mpuMGb1JY 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*gIu2Wm9mpuMGb1JY 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*gIu2Wm9mpuMGb1JY 640w, https://miro.medium.com/v2/resize:fit:720/0*gIu2Wm9mpuMGb1JY 720w, https://miro.medium.com/v2/resize:fit:750/0*gIu2Wm9mpuMGb1JY 750w, https://miro.medium.com/v2/resize:fit:786/0*gIu2Wm9mpuMGb1JY 786w, https://miro.medium.com/v2/resize:fit:828/0*gIu2Wm9mpuMGb1JY 828w, https://miro.medium.com/v2/resize:fit:1100/0*gIu2Wm9mpuMGb1JY 1100w, https://miro.medium.com/v2/resize:fit:1400/0*gIu2Wm9mpuMGb1JY 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 mq nw c" width="700" height="76" loading="lazy" role="presentation"/></picture></div></div><figcaption class="nx ff ny nj nk nz oa bf b bg z du">Before (Note gaps instead of proper kerning, and lighter than intended font weight.)</figcaption></figure><figure class="nm nn no np nq nr nj nk paragraph-image"><div role="button" tabindex="0" class="ns nt fj nu bh nv"><div class="nj nk rg"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*tt9hlqhTbrmj4ZCt 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*tt9hlqhTbrmj4ZCt 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*tt9hlqhTbrmj4ZCt 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*tt9hlqhTbrmj4ZCt 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*tt9hlqhTbrmj4ZCt 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*tt9hlqhTbrmj4ZCt 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*tt9hlqhTbrmj4ZCt 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*tt9hlqhTbrmj4ZCt 640w, https://miro.medium.com/v2/resize:fit:720/0*tt9hlqhTbrmj4ZCt 720w, https://miro.medium.com/v2/resize:fit:750/0*tt9hlqhTbrmj4ZCt 750w, https://miro.medium.com/v2/resize:fit:786/0*tt9hlqhTbrmj4ZCt 786w, https://miro.medium.com/v2/resize:fit:828/0*tt9hlqhTbrmj4ZCt 828w, https://miro.medium.com/v2/resize:fit:1100/0*tt9hlqhTbrmj4ZCt 1100w, https://miro.medium.com/v2/resize:fit:1400/0*tt9hlqhTbrmj4ZCt 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 mq nw c" width="700" height="74" loading="lazy" role="presentation"/></picture></div></div><figcaption class="nx ff ny nj nk nz oa bf b bg z du">After</figcaption></figure><figure class="nm nn no np nq nr nj nk paragraph-image"><div role="button" tabindex="0" class="ns nt fj nu bh nv"><div class="nj nk rh"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*eMboSxWLEJBS_EyL 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*eMboSxWLEJBS_EyL 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*eMboSxWLEJBS_EyL 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*eMboSxWLEJBS_EyL 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*eMboSxWLEJBS_EyL 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*eMboSxWLEJBS_EyL 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*eMboSxWLEJBS_EyL 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*eMboSxWLEJBS_EyL 640w, https://miro.medium.com/v2/resize:fit:720/0*eMboSxWLEJBS_EyL 720w, https://miro.medium.com/v2/resize:fit:750/0*eMboSxWLEJBS_EyL 750w, https://miro.medium.com/v2/resize:fit:786/0*eMboSxWLEJBS_EyL 786w, https://miro.medium.com/v2/resize:fit:828/0*eMboSxWLEJBS_EyL 828w, https://miro.medium.com/v2/resize:fit:1100/0*eMboSxWLEJBS_EyL 1100w, https://miro.medium.com/v2/resize:fit:1400/0*eMboSxWLEJBS_EyL 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 mq nw c" width="700" height="1516" loading="lazy" role="presentation"/></picture></div></div><figcaption class="nx ff ny nj nk nz oa bf b bg z du">Before (Note incorrect spacing, for example in “vergelijken”)</figcaption></figure><figure class="nm nn no np nq nr nj nk paragraph-image"><div role="button" tabindex="0" class="ns nt fj nu bh nv"><div class="nj nk rh"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*uxeGJuIKWu0dPW1d 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*uxeGJuIKWu0dPW1d 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*uxeGJuIKWu0dPW1d 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*uxeGJuIKWu0dPW1d 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*uxeGJuIKWu0dPW1d 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*uxeGJuIKWu0dPW1d 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*uxeGJuIKWu0dPW1d 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*uxeGJuIKWu0dPW1d 640w, https://miro.medium.com/v2/resize:fit:720/0*uxeGJuIKWu0dPW1d 720w, https://miro.medium.com/v2/resize:fit:750/0*uxeGJuIKWu0dPW1d 750w, https://miro.medium.com/v2/resize:fit:786/0*uxeGJuIKWu0dPW1d 786w, https://miro.medium.com/v2/resize:fit:828/0*uxeGJuIKWu0dPW1d 828w, https://miro.medium.com/v2/resize:fit:1100/0*uxeGJuIKWu0dPW1d 1100w, https://miro.medium.com/v2/resize:fit:1400/0*uxeGJuIKWu0dPW1d 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 mq nw c" width="700" height="1516" loading="lazy" role="presentation"/></picture></div></div><figcaption class="nx ff ny nj nk nz oa bf b bg z du">After</figcaption></figure><p id="8148" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk"><strong class="od gv">Android Preview</strong></p><p id="68bb" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">In this release, we are continuing to preview Impeller on Android. We have extended the preview period due to difficulties stemming from <a class="af qq" href="https://github.com/flutter/flutter/issues/146499#issuecomment-2082873125" rel="noopener ugc nofollow" target="_blank">a bug in Android 14</a> that affects APIs that Impeller uses for Platform Views. The bug has since been patched by the Android team, however many deployed devices will be running the unpatched Android version for the foreseeable future. Working around these issues implies an additional API migration and therefore an additional stable release cycle. Out of an abundance of caution and to ensure that Flutter apps work on the widest possible range of devices, we are holding off on making Impeller the default renderer until a stable release later this year.</p><p id="7880" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">As the Impeller preview on Android continues through the 3.24 stable cycle, we request that Flutter developers upgrade to the latest stable version, and file issues about any shortcomings noticed when Impeller is enabled. Feedback at this stage is invaluable to ensuring that Impeller is successful on Android and that we will be able to confidently make it the default renderer in a release later this year. The Android hardware ecosystem is much more diverse than the iOS ecosystem. For that reason, the most helpful feedback about Impeller should include detailed information about the specific device and Android version where issues occurred.</p><h2 id="e3c2" class="pt oy gu bf oz pu pv dy pc pw px ea pf ok py pz qa oo qb qc qd os qe qf qg qh bk">Improved defaults for downscaled images</h2><p id="4f2e" class="pw-post-body-paragraph ob oc gu od b hs qi of og hv qj oi oj ok qk om on oo ql oq or os qm ou ov ow gn bk">In this release, the default <code class="cx qw qx qy qz b">FilterQuality</code> for images has been changed from <code class="cx qw qx qy qz b">FilterQuality.low</code> to <code class="cx qw qx qy qz b">FilterQuality.medium</code>. When a large image is substantially larger than its destination rectangle, which is a common scenario, <code class="cx qw qx qy qz b">FilterQuality.low</code> causes an image to look more ‘pixelated’ and be slower to render than <code class="cx qw qx qy qz b">FilterQuality.medium</code>. Going forward the team is also exploring more suitable names for the various <code class="cx qw qx qy qz b">FilterQuality</code> levels.</p><h2 id="a10d" class="pt oy gu bf oz pu pv dy pc pw px ea pf ok py pz qa oo qb qc qd os qe qf qg qh bk">Flutter GPU preview</h2><p id="e162" class="pw-post-body-paragraph ob oc gu od b hs qi of og hv qj oi oj ok qk om on oo ql oq or os qm ou ov ow gn bk">Flutter has introduced a major update for rendering capabilities with the Flutter GPU, available on the main channel. This low-level graphics API allows developers to create custom renderers using Dart code and GLSL shaders without needing any native platform code.</p><p id="2129" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">Flutter GPU expands what you can render directly in Flutter, enabling advanced graphics and 3D scenes. It requires the Impeller rendering backend, currently supported on iOS, macOS, and Android. Although in early preview, Flutter GPU aims to eventually support all Flutter platforms.</p><p id="21ae" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">The API allows for full control over render pass attachments, the vertex stage, and data upload to the GPU. This flexibility is essential for creating sophisticated rendering solutions, from 2D character animations to complex 3D scenes.</p><p id="ad42" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">Developers can start using Flutter GPU by switching to the main channel and adding the flutter_gpu package to their projects. The upcoming months will see more functionality and stability improvements, with higher-level rendering libraries like flutter_scene simplifying the use of these advanced features.</p><p id="cf09" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">For a deeper dive into Flutter GPU and to see how you can leverage it in your projects, check out the detailed <a class="af qq" rel="noopener" href="/flutter/getting-started-with-flutter-gpu-f33d497b7c11">Flutter GPU blog post</a>. Whether you’re creating games or complex graphics, Flutter’s new GPU capabilities make it a robust choice for your product.</p><h1 id="82da" class="ox oy gu bf oz pa pb hu pc pd pe hx pf pg ph pi pj pk pl pm pn po pp pq pr ps bk">Web</h1><h1 id="fb07" class="ox oy gu bf oz pa pb hu pc pd pe hx pf pg ph pi pj pk pl pm pn po pp pq pr ps bk">Multi-view embedding</h1><p id="eaa1" class="pw-post-body-paragraph ob oc gu od b hs qi of og hv qj oi oj ok qk om on oo ql oq or os qm ou ov ow gn bk">Flutter web applications can now leverage multi-view embedding, allowing developers to render content into multiple HTML elements simultaneously. This feature, known as “embedded mode” or “multi-view,” offers flexibility for integrating Flutter views into existing web applications.</p><p id="48ef" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">In multi-view mode, a Flutter web application doesn’t render immediately upon launch. Instead, it waits until the host application adds the first “view” using the addView method. The host application can dynamically add or remove these views, and Flutter adjusts its widgets accordingly.</p><p id="1427" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">To enable multi-view mode, set <code class="cx qw qx qy qz b">multiViewEnabled: true</code> in the <code class="cx qw qx qy qz b">initializeEngine</code> method within the <code class="cx qw qx qy qz b">flutter_bootstrap.js</code> file. Views can then be managed from JavaScript, adding them to specified HTML elements and removing them as needed. Each view addition and removal triggers updates within Flutter, allowing for dynamic content rendering.</p><p id="b6bf" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">This feature is particularly useful for integrating Flutter into complex web applications where multiple, independent Flutter views are required. It also supports custom initialization data for each view, enabling personalized configurations and interactive experiences.</p><p id="9875" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">For a deeper dive into implementing multi-view embedding in your Flutter web applications, check out the <a class="af qq" href="https://docs.flutter.dev/platform-integration/web/embedding-flutter-web" rel="noopener ugc nofollow" target="_blank">detailed documentation</a>.</p><h1 id="7f9d" class="ox oy gu bf oz pa pb hu pc pd pe hx pf pg ph pi pj pk pl pm pn po pp pq pr ps bk">Monetization</h1><h1 id="96ad" class="ox oy gu bf oz pa pb hu pc pd pe hx pf pg ph pi pj pk pl pm pn po pp pq pr ps bk">Video ad monetization support</h1><p id="80cf" class="pw-post-body-paragraph ob oc gu od b hs qi of og hv qj oi oj ok qk om on oo ql oq or os qm ou ov ow gn bk">We have launched a new <a class="af qq" href="https://pub.dev/packages/interactive_media_ads" rel="noopener ugc nofollow" target="_blank">Interactive Media Ads (IMA) plugin</a> to support instream video ad monetization on Flutter mobile apps. The new IMA plugin provides new ad monetization opportunities for Flutter apps on top of the existing <a class="af qq" href="https://pub.dev/packages/google_mobile_ads" rel="noopener ugc nofollow" target="_blank">Google Mobile Ads (GMA) plugin</a> which primarily supports display ad formats.</p><p id="5343" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">Instream video ads are typically shown to a user in the video player before (preroll), during (midroll), or after (postroll) video content playback. Some instream video ads can be skippable as well.</p><figure class="nm nn no np nq nr nj nk paragraph-image"><div role="button" tabindex="0" class="ns nt fj nu bh nv"><div class="nj nk ri"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*_c0s8KMdLNyfxOMQ 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*_c0s8KMdLNyfxOMQ 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*_c0s8KMdLNyfxOMQ 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*_c0s8KMdLNyfxOMQ 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*_c0s8KMdLNyfxOMQ 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*_c0s8KMdLNyfxOMQ 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*_c0s8KMdLNyfxOMQ 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*_c0s8KMdLNyfxOMQ 640w, https://miro.medium.com/v2/resize:fit:720/0*_c0s8KMdLNyfxOMQ 720w, https://miro.medium.com/v2/resize:fit:750/0*_c0s8KMdLNyfxOMQ 750w, https://miro.medium.com/v2/resize:fit:786/0*_c0s8KMdLNyfxOMQ 786w, https://miro.medium.com/v2/resize:fit:828/0*_c0s8KMdLNyfxOMQ 828w, https://miro.medium.com/v2/resize:fit:1100/0*_c0s8KMdLNyfxOMQ 1100w, https://miro.medium.com/v2/resize:fit:1400/0*_c0s8KMdLNyfxOMQ 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 mq nw c" width="700" height="700" loading="lazy" role="presentation"/></picture></div></div></figure><p id="2f7d" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk"><strong class="od gv">Flutter IMA benefits</strong>:</p><ul class=""><li id="1378" class="ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow qn qo qp bk">Seamlessly monetize video player content on Flutter apps. For example, when an app user clicks <strong class="od gv">play</strong> on video content, you can now implement the Flutter IMA plugin to first show the user a 15 second ad before starting the video content.</li><li id="998e" class="ob oc gu od b hs qr of og hv qs oi oj ok qt om on oo qu oq or os qv ou ov ow qn qo qp bk">Tap into the same benefits of native IMA SDK including access to premium Google ad demand and industry standard compliance (such as <a class="af qq" href="https://iabtechlab.com/standards/vast/" rel="noopener ugc nofollow" target="_blank">IAB VAST</a>).</li></ul><p id="d30c" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">The initial launch version currently supports pre-roll video ads on Android and iOS platform. Support for midroll ads will be available soon. We encourage you to start exploring the new IMA plugin on your Flutter app video content. Please let us know if have any issues or concerns on <a class="af qq" href="https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+interactive_media_ads%22" rel="noopener ugc nofollow" target="_blank">GitHub</a>.</p><p id="ea00" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">Resources: <a class="af qq" href="https://pub.dev/packages/interactive_media_ads" rel="noopener ugc nofollow" target="_blank">Plugin guide</a>, <a class="af qq" href="https://pub.dev/packages/interactive_media_ads/example" rel="noopener ugc nofollow" target="_blank">Sample App</a>, <a class="af qq" href="https://github.com/flutter/packages/tree/main/packages/interactive_media_ads" rel="noopener ugc nofollow" target="_blank">Git Repository</a></p><h1 id="c57b" class="ox oy gu bf oz pa pb hu pc pd pe hx pf pg ph pi pj pk pl pm pn po pp pq pr ps bk">iOS</h1><h1 id="3d7f" class="ox oy gu bf oz pa pb hu pc pd pe hx pf pg ph pi pj pk pl pm pn po pp pq pr ps bk">Swift Package Manager initial support</h1><p id="9d9b" class="pw-post-body-paragraph ob oc gu od b hs qi of og hv qj oi oj ok qk om on oo ql oq or os qm ou ov ow gn bk">Today, Flutter uses CocoaPods to manage native iOS or macOS dependencies.</p><p id="5148" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">Flutter 3.24 adds early support for Swift Package Manager. This brings several benefits, including:</p><p id="ed56" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">1. <strong class="od gv">Access to the Swift package ecosystem</strong>. Flutter plugins will be able to leverage the growing ecosystem of <a class="af qq" href="https://swiftpackageindex.com/" rel="noopener ugc nofollow" target="_blank">Swift packages</a>! <br/>2. <strong class="od gv">Simplifies Flutter installation</strong>. Swift Package Manager is bundled with Xcode. In the future, you won’t need to install Ruby and CocoaPods to use Flutter for Apple’s platforms.</p><p id="5f62" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">We encourage plugin authors to<a class="af qq" href="https://docs.flutter.dev/packages-and-plugins/swift-package-manager/for-plugin-authors#how-to-add-swift-package-manager-support-to-an-existing-flutter-plugin" rel="noopener ugc nofollow" target="_blank"> try adding support for Swift Package Manager to your plugins</a>, and provide feedback on your experience.</p><p id="16c9" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">If you have feedback on Flutter’s support for Swift Package Manager, please <a class="af qq" href="https://github.com/flutter/flutter/issues/new/choose" rel="noopener ugc nofollow" target="_blank">file an issue</a>.</p><h1 id="958f" class="ox oy gu bf oz pa pb hu pc pd pe hx pf pg ph pi pj pk pl pm pn po pp pq pr ps bk">Ecosystem</h1><h1 id="10dd" class="ox oy gu bf oz pa pb hu pc pd pe hx pf pg ph pi pj pk pl pm pn po pp pq pr ps bk">Shared Preferences plugin updates</h1><p id="9aad" class="pw-post-body-paragraph ob oc gu od b hs qi of og hv qj oi oj ok qk om on oo ql oq or os qm ou ov ow gn bk">We’ve added two new APIs to the <a class="af qq" href="https://pub.dev/packages/shared_preferences" rel="noopener ugc nofollow" target="_blank">shared_preferences</a> plugin, SharedPreferencesAsync and SharedPreferencesWithCache. The most significant change is that the Android implementation uses Preferences DataStore instead of Shared Preferences.</p><p id="3226" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">SharedPreferencesAsync allows users to call directly to the platform to get the most up to date preferences saved on the device, at the cost of being async and a little slower than using the cached version. This is useful for preferences that can be updated by other systems or isolates, which would make a cache stale.</p><p id="d80b" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">SharedPreferencesWithCache is built on top of SharedPreferencesAsync and allows users to access a locally cached copy of the preferences synchronously. This is similar to the old API, but can now be instantiated multiple times with different parameters.</p><p id="0a10" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">These new APIs are intended to replace the current SharedPreferences API in the future. However, this is one of the most used plugins in the ecosystem, and we know it will take time for the ecosystem to switch to the new APIs.</p><h1 id="30bb" class="ox oy gu bf oz pa pb hu pc pd pe hx pf pg ph pi pj pk pl pm pn po pp pq pr ps bk">Flutter and Dart Package Ecosystem Summit Europe 2024</h1><figure class="nm nn no np nq nr nj nk paragraph-image"><div role="button" tabindex="0" class="ns nt fj nu bh nv"><div class="nj nk rj"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*fWo9ieYzQcJjwQBi 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*fWo9ieYzQcJjwQBi 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*fWo9ieYzQcJjwQBi 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*fWo9ieYzQcJjwQBi 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*fWo9ieYzQcJjwQBi 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*fWo9ieYzQcJjwQBi 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*fWo9ieYzQcJjwQBi 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*fWo9ieYzQcJjwQBi 640w, https://miro.medium.com/v2/resize:fit:720/0*fWo9ieYzQcJjwQBi 720w, https://miro.medium.com/v2/resize:fit:750/0*fWo9ieYzQcJjwQBi 750w, https://miro.medium.com/v2/resize:fit:786/0*fWo9ieYzQcJjwQBi 786w, https://miro.medium.com/v2/resize:fit:828/0*fWo9ieYzQcJjwQBi 828w, https://miro.medium.com/v2/resize:fit:1100/0*fWo9ieYzQcJjwQBi 1100w, https://miro.medium.com/v2/resize:fit:1400/0*fWo9ieYzQcJjwQBi 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 mq nw c" width="700" height="263" loading="lazy" role="presentation"/></picture></div></div></figure><p id="f44c" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">As part of Fluttercon Europe 2024, we held the first in-person Flutter and Dart Package Ecosystem Summit. This followed on from the first virtual summit we held in August 2023. See a summary of takeaways from the discussion sessions <a class="af qq" href="https://docs.google.com/document/d/e/2PACX-1vRFLdpIJYO5YPARcyUT1FYPzwkFb1hxh_agqnCXxsyirXocLZS5jobs3xFV5ZGpSQHLHZiBzqbJlXNV/pub" rel="noopener ugc nofollow" target="_blank">here</a>.</p><p id="5a1b" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">We’re excited to announce that the next summit will be at <a class="af qq" href="https://flutterconusa.dev/" rel="noopener ugc nofollow" target="_blank">Fluttercon USA</a> in New York City on 20th September 2024! If you’re a package author or contributor, and are attending Fluttercon USA 2024, <a class="af qq" href="https://rsvp.withgoogle.com/events/flutter-package-ecosystem-summit-usa-2024" rel="noopener ugc nofollow" target="_blank">register</a> to save your spot in the summit.</p><p id="ab37" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">The summit brought together package authors and maintainers for unconference-style sessions on the following topics:</p><ul class=""><li id="4d45" class="ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow qn qo qp bk">Session 1 — Past, Present and Future of Native Interop</li><li id="93f5" class="ob oc gu od b hs qr of og hv qs oi oj ok qt om on oo qu oq or os qv ou ov ow qn qo qp bk">Session 2 — Sustainable package maintenance models</li><li id="a81e" class="ob oc gu od b hs qr of og hv qs oi oj ok qt om on oo qu oq or os qv ou ov ow qn qo qp bk">Session 3 — Addressing package ecosystem fragmentation</li></ul><p id="7ddc" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">We believe the summit, especially when part of more general Flutter and Dart events, is a valuable platform for open discussion among the community, to surface critical challenges and brainstorming solutions. We’re looking forward to holding more of these summits going forward, in partnership with the community.</p><h1 id="4ebe" class="ox oy gu bf oz pa pb hu pc pd pe hx pf pg ph pi pj pk pl pm pn po pp pq pr ps bk">DevTools and IDEs</h1><p id="79bf" class="pw-post-body-paragraph ob oc gu od b hs qi of og hv qj oi oj ok qk om on oo ql oq or os qm ou ov ow gn bk">This release includes some exciting improvements to the Flutter DevTools tooling suite.</p><p id="9845" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">If you have ever wondered whether your Flutter app is building more Widgets than expected, a new feature in the <strong class="od gv">DevTools Performance</strong> tool that can help with that. Using the new<strong class="od gv"> Rebuild Stats</strong> feature, you can capture information about how many times a widget was built in your app or even in a specific Flutter frame.</p><figure class="nm nn no np nq nr nj nk paragraph-image"><div role="button" tabindex="0" class="ns nt fj nu bh nv"><div class="nj nk rk"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*7LXjXlFR9w-VR6xk 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*7LXjXlFR9w-VR6xk 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*7LXjXlFR9w-VR6xk 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*7LXjXlFR9w-VR6xk 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*7LXjXlFR9w-VR6xk 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*7LXjXlFR9w-VR6xk 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*7LXjXlFR9w-VR6xk 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*7LXjXlFR9w-VR6xk 640w, https://miro.medium.com/v2/resize:fit:720/0*7LXjXlFR9w-VR6xk 720w, https://miro.medium.com/v2/resize:fit:750/0*7LXjXlFR9w-VR6xk 750w, https://miro.medium.com/v2/resize:fit:786/0*7LXjXlFR9w-VR6xk 786w, https://miro.medium.com/v2/resize:fit:828/0*7LXjXlFR9w-VR6xk 828w, https://miro.medium.com/v2/resize:fit:1100/0*7LXjXlFR9w-VR6xk 1100w, https://miro.medium.com/v2/resize:fit:1400/0*7LXjXlFR9w-VR6xk 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 mq nw c" width="700" height="497" loading="lazy" role="presentation"/></picture></div></div></figure><p id="6a97" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk"><em class="rl">A screenshot of the DevTools Performance tool tracking rebuild stats.</em></p><p id="30dd" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">We’ve added polish and critical bug fixes to tools like the <strong class="od gv">Network profiler</strong> and the <strong class="od gv">Flutter Deep Links tool</strong>, and have made some general improvements to provide you with a better experience when you are using DevTools from within your IDE. Speaking of IDEs, did you know that you can use every DevTools tool directly inside your IDE?</p><figure class="nm nn no np nq nr nj nk paragraph-image"><div role="button" tabindex="0" class="ns nt fj nu bh nv"><div class="nj nk rj"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*tdpToIuTd-mBq-_R 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*tdpToIuTd-mBq-_R 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*tdpToIuTd-mBq-_R 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*tdpToIuTd-mBq-_R 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*tdpToIuTd-mBq-_R 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*tdpToIuTd-mBq-_R 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*tdpToIuTd-mBq-_R 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*tdpToIuTd-mBq-_R 640w, https://miro.medium.com/v2/resize:fit:720/0*tdpToIuTd-mBq-_R 720w, https://miro.medium.com/v2/resize:fit:750/0*tdpToIuTd-mBq-_R 750w, https://miro.medium.com/v2/resize:fit:786/0*tdpToIuTd-mBq-_R 786w, https://miro.medium.com/v2/resize:fit:828/0*tdpToIuTd-mBq-_R 828w, https://miro.medium.com/v2/resize:fit:1100/0*tdpToIuTd-mBq-_R 1100w, https://miro.medium.com/v2/resize:fit:1400/0*tdpToIuTd-mBq-_R 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 mq nw c" width="700" height="459" loading="lazy" role="presentation"/></picture></div></div></figure><p id="4931" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk"><em class="rl">DevTools screens open inside a VS Code window.</em></p><figure class="nm nn no np nq nr nj nk paragraph-image"><div role="button" tabindex="0" class="ns nt fj nu bh nv"><div class="nj nk rj"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*QvoXCNqqfsrMn1oC 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*QvoXCNqqfsrMn1oC 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*QvoXCNqqfsrMn1oC 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*QvoXCNqqfsrMn1oC 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*QvoXCNqqfsrMn1oC 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*QvoXCNqqfsrMn1oC 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*QvoXCNqqfsrMn1oC 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*QvoXCNqqfsrMn1oC 640w, https://miro.medium.com/v2/resize:fit:720/0*QvoXCNqqfsrMn1oC 720w, https://miro.medium.com/v2/resize:fit:750/0*QvoXCNqqfsrMn1oC 750w, https://miro.medium.com/v2/resize:fit:786/0*QvoXCNqqfsrMn1oC 786w, https://miro.medium.com/v2/resize:fit:828/0*QvoXCNqqfsrMn1oC 828w, https://miro.medium.com/v2/resize:fit:1100/0*QvoXCNqqfsrMn1oC 1100w, https://miro.medium.com/v2/resize:fit:1400/0*QvoXCNqqfsrMn1oC 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 mq nw c" width="700" height="490" loading="lazy" role="presentation"/></picture></div></div></figure><p id="6e60" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk"><em class="rl">DevTools screens open inside Android Studio tool windows.</em></p><p id="8541" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">This release includes improvements to the Flutter Sidebar in VS Code to give you easier access to the tools you are looking for. Upgrade to the latest versions of VS Code and the Flutter and Dart extensions to access the improved sidebar.</p><figure class="nm nn no np nq nr nj nk paragraph-image"><div class="nj nk rm"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*BzEybhMlV-SnSZZl 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*BzEybhMlV-SnSZZl 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*BzEybhMlV-SnSZZl 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*BzEybhMlV-SnSZZl 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*BzEybhMlV-SnSZZl 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*BzEybhMlV-SnSZZl 1100w, https://miro.medium.com/v2/resize:fit:636/format:webp/0*BzEybhMlV-SnSZZl 636w" 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, 318px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/0*BzEybhMlV-SnSZZl 640w, https://miro.medium.com/v2/resize:fit:720/0*BzEybhMlV-SnSZZl 720w, https://miro.medium.com/v2/resize:fit:750/0*BzEybhMlV-SnSZZl 750w, https://miro.medium.com/v2/resize:fit:786/0*BzEybhMlV-SnSZZl 786w, https://miro.medium.com/v2/resize:fit:828/0*BzEybhMlV-SnSZZl 828w, https://miro.medium.com/v2/resize:fit:1100/0*BzEybhMlV-SnSZZl 1100w, https://miro.medium.com/v2/resize:fit:636/0*BzEybhMlV-SnSZZl 636w" 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, 318px"/><img alt="" class="bh mq nw c" width="318" height="542" loading="lazy" role="presentation"/></picture></div></figure><p id="d299" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk"><em class="rl">The Flutter Sidebar is adaptive and scales to fit your workspace</em></p><p id="a14a" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">This release also includes some major improvements to the <a class="af qq" href="https://docs.flutter.dev/tools/devtools/extensions" rel="noopener ugc nofollow" target="_blank">DevTools Extensions</a> framework. You can now use DevTools extensions (tools provided by one of your package dependencies) when you are debugging a Dart or Flutter test, or even when you aren’t debugging anything, but are just writing code in your IDE. So, if you’ve wanted to use a tool (or build one!) for one of these user journeys, it is now possible.</p><p id="21f0" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">To learn more about all the updates included in Flutter 3.24 check out the release notes for DevTools <a class="af qq" href="https://docs.flutter.dev/tools/devtools/release-notes/release-notes-2.35.0" rel="noopener ugc nofollow" target="_blank">2.35.0</a>, <a class="af qq" href="https://docs.flutter.dev/tools/devtools/release-notes/release-notes-2.36.0" rel="noopener ugc nofollow" target="_blank">2.36.0</a>, and <a class="af qq" href="https://docs.flutter.dev/tools/devtools/release-notes/release-notes-2.37.2" rel="noopener ugc nofollow" target="_blank">2.37.2</a>.</p><h1 id="45cb" class="ox oy gu bf oz pa pb hu pc pd pe hx pf pg ph pi pj pk pl pm pn po pp pq pr ps bk">Breaking changes and deprecations</h1><p id="5667" class="pw-post-body-paragraph ob oc gu od b hs qi of og hv qj oi oj ok qk om on oo ql oq or os qm ou ov ow gn bk">Breaking changes in this release include changes to <a class="af qq" href="https://docs.flutter.dev/release/breaking-changes/navigator-and-page-api" rel="noopener ugc nofollow" target="_blank">Navigator’s pages API</a>, <a class="af qq" href="https://docs.flutter.dev/release/breaking-changes/popscope-with-result" rel="noopener ugc nofollow" target="_blank">generic types in PopScope</a>, <a class="af qq" href="https://docs.flutter.dev/platform-integration/web/renderers" rel="noopener ugc nofollow" target="_blank">Flutter web’s default renderer</a> and the introduction of some new deprecations. See the full list of migration guidance on the <a class="af qq" href="https://docs.flutter.dev/release/breaking-changes" rel="noopener ugc nofollow" target="_blank">breaking changes page</a>.</p><p id="92f8" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">As always, many thanks to the community for <a class="af qq" href="https://github.com/flutter/tests/blob/master/README.md" rel="noopener ugc nofollow" target="_blank">contributing tests</a> — these help us identify these breaking changes. To learn more, check out <a class="af qq" href="https://github.com/flutter/flutter/wiki/Tree-hygiene#handling-breaking-changes" rel="noopener ugc nofollow" target="_blank">Flutter’s breaking change policy</a>.</p><h1 id="0bad" class="ox oy gu bf oz pa pb hu pc pd pe hx pf pg ph pi pj pk pl pm pn po pp pq pr ps bk">Conclusion</h1><p id="4a28" class="pw-post-body-paragraph ob oc gu od b hs qi of og hv qj oi oj ok qk om on oo ql oq or os qm ou ov ow gn bk">At the heart of Flutter’s success is you — our amazing community. This release wouldn’t be possible without your countless contributions and unwavering passion. From the bottom of our hearts, thank you.</p><p id="69f2" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">To dive into the specifics of what has been achieved with this release, we invite you to view the <a class="af qq" href="https://docs.flutter.dev/release/release-notes/release-notes-3.24.0" rel="noopener ugc nofollow" target="_blank">release notes</a> and <a class="af qq" href="https://github.com/flutter/flutter/blob/main/CHANGELOG.md" rel="noopener ugc nofollow" target="_blank">change log</a> for a comprehensive list of additions in Flutter 3.24.</p><p id="3222" class="pw-post-body-paragraph ob oc gu od b hs oe of og hv oh oi oj ok ol om on oo op oq or os ot ou ov ow gn bk">Flutter 3.24, alongside Dart 3.5, is now available on the stable channel. Embarking on this latest journey with Flutter is as straightforward as running flutter upgrade. We can’t wait to see what you build!</p></div></div></div></div></section></div></div></article></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="rn ro ab jm"><div class="rp ab"><a class="rq ay am ao" rel="noopener follow" href="/tag/announcements?source=post_page-----6c040f87d1e4--------------------------------"><div class="rr fj cx rs ge rt ru bf b bg z bk rv">Announcements</div></a></div><div class="rp ab"><a class="rq ay am ao" rel="noopener follow" href="/tag/flutter?source=post_page-----6c040f87d1e4--------------------------------"><div class="rr fj cx rs ge rt ru bf b bg z bk rv">Flutter</div></a></div><div class="rp ab"><a class="rq ay am ao" rel="noopener follow" href="/tag/flutter-app-development?source=post_page-----6c040f87d1e4--------------------------------"><div class="rr fj cx rs ge rt ru bf b bg z bk rv">Flutter App Development</div></a></div><div class="rp ab"><a class="rq ay am ao" rel="noopener follow" href="/tag/release-notes?source=post_page-----6c040f87d1e4--------------------------------"><div class="rr fj cx rs ge rt ru bf b bg z bk rv">Release Notes</div></a></div><div class="rp ab"><a class="rq ay am ao" rel="noopener follow" href="/tag/flutter-development?source=post_page-----6c040f87d1e4--------------------------------"><div class="rr fj cx rs ge rt ru bf b bg z bk rv">Flutter Development</div></a></div></div></div></div><div class="l"></div><footer class="rw rx ry rz sa ab q sb iw c"><div class="l ae"><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ab cp sc"><div class="ab q lh"><div class="sd l"><span class="l se sf sg e d"><div class="ab q lh li"><div class="pw-multi-vote-icon fj jq lj lk ll"><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%2F6c040f87d1e4&operation=register&redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fwhats-new-in-flutter-3-24-6c040f87d1e4&user=Kevin+Chisholm&userId=7cb43f46877f&source=---footer_actions--6c040f87d1e4---------------------clap_footer-----------"><div><div class="bm" aria-hidden="false"><div class="lm ao ln lo lp lq am lr ls lt ll"><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 lu lv lw lx ly lz ma"><p class="bf b dv z du"><span class="mb">--</span></p></div></div></span><span class="l h g f sh si"><div class="ab q lh li"><div class="pw-multi-vote-icon fj jq lj lk ll"><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%2F6c040f87d1e4&operation=register&redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fwhats-new-in-flutter-3-24-6c040f87d1e4&user=Kevin+Chisholm&userId=7cb43f46877f&source=---footer_actions--6c040f87d1e4---------------------clap_footer-----------"><div><div class="bm" aria-hidden="false"><div class="lm ao ln lo lp lq am lr ls lt ll"><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 lu lv lw lx ly lz ma"><p class="bf b dv z du"><span class="mb">--</span></p></div></div></span></div><div class="bq ab"><div><div class="bm" aria-hidden="false"><button class="ao lm me mf ab q fk mg mh" aria-label="responses"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" class="md"><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 mc md">27</span></p></button></div></div></div></div><div class="ab q"><div class="sj l jj"><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%2F6c040f87d1e4&operation=register&redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fwhats-new-in-flutter-3-24-6c040f87d1e4&source=---footer_actions--6c040f87d1e4---------------------bookmark_footer-----------"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" fill="none" viewBox="0 0 25 25" class="du mj" 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="sj l jj"><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 mr an ao ap ex ms mt mh mu"><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="sk sl sm sn so l"><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="sp bh r sq"></div><div class="sr l"><div class="ab ss st su jl jk"><div class="sv sw sx sy sz ta tb tc td te ab cp"><div class="h k"><a href="https://medium.com/flutter?source=post_page---post_publication_info--6c040f87d1e4--------------------------------" rel="noopener follow"><div class="fj ab"><img alt="Flutter" class="tf in io cx" src="https://miro.medium.com/v2/resize:fill:96:96/1*5-aoK8IBmXve5whBQM90GA.png" width="48" height="48" loading="lazy"/><div class="tf l io in fs n fr tg"></div></div></a></div><div class="j i d"><a href="https://medium.com/flutter?source=post_page---post_publication_info--6c040f87d1e4--------------------------------" rel="noopener follow"><div class="fj ab"><img alt="Flutter" class="tf ti th cx" src="https://miro.medium.com/v2/resize:fill:128:128/1*5-aoK8IBmXve5whBQM90GA.png" width="64" height="64" loading="lazy"/><div class="tf l th ti fs n fr tg"></div></div></a></div><div class="j i d tj jj"><div class="ab"></div></div></div><div class="ab co tk"><div class="tl tm tn to tp 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--6c040f87d1e4--------------------------------" rel="noopener follow"><h2 class="pw-author-name bf tr ts tt tu tv tw tx ok pz qa oo qc qd os qf qg bk"><span class="gn tq">Published in <!-- -->Flutter</span></h2></a><div class="rp ab im"><div class="l jj"><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 jc" rel="noopener follow" href="/flutter/followers?source=post_page---post_publication_info--6c040f87d1e4--------------------------------">57K Followers</a></span></div><div class="bf b bg z du ab jp"><span class="jd 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 jc" rel="noopener follow" href="/flutter/prospera-using-flutter-to-bring-ai-to-the-frontline-of-sales-71377810fd26?source=post_page---post_publication_info--6c040f87d1e4--------------------------------">Last published <span>Nov 21, 2024</span></a></div></div><div class="ty l"><p class="bf b bg z bk">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 <a class="af ag ah ai aj ak al am an ao ap aq ar qq 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 ss st su jl jk"><div class="sv sw sx sy sz ta tb tc td te ab cp"><div class="h k"><a tabindex="0" rel="noopener follow" href="/@kevinchisholm?source=post_page---post_author_info--6c040f87d1e4--------------------------------"><div class="l fj"><img alt="Kevin Chisholm" class="l fd by io in 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 io in fs n ay tg"></div></div></a></div><div class="j i d"><a tabindex="0" rel="noopener follow" href="/@kevinchisholm?source=post_page---post_author_info--6c040f87d1e4--------------------------------"><div class="l fj"><img alt="Kevin Chisholm" class="l fd by th ti 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 th ti fs n ay tg"></div></div></a></div><div class="j i d tj jj"><div class="ab"><span><button class="bf b bg z tz rr ua ub uc ud ue ev ew uf ug uh fa fb fc fd bm fe ff">Follow</button></span></div></div></div><div class="ab co tk"><div class="tl tm tn to tp 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--6c040f87d1e4--------------------------------"><h2 class="pw-author-name bf tr ts tt tu tv tw tx ok pz qa oo qc qd os qf qg bk"><span class="gn tq">Written by <!-- -->Kevin Chisholm</span></h2></a><div class="rp ab im"><div class="l jj"><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 jc" rel="noopener follow" href="/@kevinchisholm/followers?source=post_page---post_author_info--6c040f87d1e4--------------------------------">11.7K Followers</a></span></div><div class="bf b bg z du ab jp"><span class="jd 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 jc" rel="noopener follow" href="/@kevinchisholm/following?source=post_page---post_author_info--6c040f87d1e4--------------------------------">7 Following</a></div></div><div class="ty 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 tz rr ua ub uc ud ue ev ew uf ug uh fa fb fc fd bm fe ff">Follow</button></span></div></div></div></div></div></div><div class="ui uj uk ul um l"><div class="sp bh r ui uj un uo up"></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ab q cp"><h2 class="bf tr pa hu pc pd hx pf pg pi pj pk pm pn po pq pr bk">Responses (<!-- -->27<!-- -->)</h2><div class="ab uq"><div><div class="bm" aria-hidden="false"><a class="ur us" href="https://policy.medium.com/medium-rules-30e5502c4eb4?source=post_page---post_responses--6c040f87d1e4--------------------------------" 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="ut l"><button class="bf b bg z bk rr uu uv uw mj mg ue ev ew ex ux uy uz fa va vb vc vd ve fb fc fd bm fe ff">See all responses</button></div></div></div></div><div class="vf vg vh vi vj l bx"><div class="h k j"><div class="sp bh vk vl"></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="vm ab lh jm"><div class="vn vo 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-----6c040f87d1e4--------------------------------" rel="noopener follow"><p class="bf b dv z du">Help</p></a></div><div class="vn vo 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-----6c040f87d1e4--------------------------------" rel="noopener follow"><p class="bf b dv z du">Status</p></a></div><div class="vn vo 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&source=post_page-----6c040f87d1e4--------------------------------"><p class="bf b dv z du">About</p></a></div><div class="vn vo 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-----6c040f87d1e4--------------------------------"><p class="bf b dv z du">Careers</p></a></div><div class="vn vo 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-----6c040f87d1e4--------------------------------" rel="noopener follow"><p class="bf b dv z du">Press</p></a></div><div class="vn vo 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-----6c040f87d1e4--------------------------------" rel="noopener follow"><p class="bf b dv z du">Blog</p></a></div><div class="vn vo 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-----6c040f87d1e4--------------------------------" rel="noopener follow"><p class="bf b dv z du">Privacy</p></a></div><div class="vn vo 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-----6c040f87d1e4--------------------------------" rel="noopener follow"><p class="bf b dv z du">Terms</p></a></div><div class="vn vo 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-----6c040f87d1e4--------------------------------" rel="noopener follow"><p class="bf b dv z du">Text to speech</p></a></div><div class="vn 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-----6c040f87d1e4--------------------------------"><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-20241129-135346-5cf0f044cd"</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-6c040f87d1e4","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":"b72d852d-cb8b-43d3-82fd-72a4b9e2a951","hybridDevServices":[],"originalSpanCarrier":{"traceparent":"00-f1bb4208baaef1ff20a052f70d5d70aa-3f58250ae7e6be8f-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-24-6c040f87d1e4","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-20241129-135346-5cf0f044cd","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-20241129-135346-5cf0f044cd","commit":"5cf0f044cde04a296c7f1e11fd4877d75fdab011"}},"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\":\"6c040f87d1e4\"})":{"__ref":"Post:6c040f87d1e4"}},"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":57039,"latestPostsConnection({\"paging\":{\"limit\":1}})":{"__typename":"PostConnection","posts":[{"__ref":"Post:71377810fd26"}]},"viewerEdge":{"__ref":"CollectionViewerEdge:collectionId:4da7dfd21a33-viewerId:lo_4f088812212c"},"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_4f088812212c":{"__typename":"UserViewerEdge","id":"userId:7cb43f46877f-viewerId:lo_4f088812212c","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":11714,"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_4f088812212c"},"viewerIsUser":false,"postSubscribeMembershipUpsellShownAt":0,"membership":null,"allowNotes":true,"twitterScreenName":""},"Paragraph:58eee6c18580_0":{"__typename":"Paragraph","id":"58eee6c18580_0","name":"fb28","type":"H3","href":null,"layout":null,"metadata":null,"text":"What’s new in Flutter 3.24","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_1":{"__typename":"Paragraph","id":"58eee6c18580_1","name":"11cf","type":"H4","href":null,"layout":null,"metadata":null,"text":"Unleashing Flutter GPU, Multi-View Embedding, and More","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*EA-cAY6uwkYqYb725vnCIw.png":{"__typename":"ImageMetadata","id":"1*EA-cAY6uwkYqYb725vnCIw.png","originalHeight":1080,"originalWidth":1920,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:58eee6c18580_2":{"__typename":"Paragraph","id":"58eee6c18580_2","name":"f655","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:1*EA-cAY6uwkYqYb725vnCIw.png"},"text":"Flutter 3.24 on a blue background","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_3":{"__typename":"Paragraph","id":"58eee6c18580_3","name":"50f9","type":"P","href":null,"layout":null,"metadata":null,"text":"Welcome to the latest Flutter update! Flutter 3.24 is packed with exciting new features and enhancements to elevate your app development experience. This release highlights the preview of Flutter GPU, which enables advanced graphics and 3D scenes directly in Flutter. Web apps can now embed multiple Flutter views, enhancing your app’s versatility. And finally, we’ve added video ad monetization support to help you maximize revenue.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_4":{"__typename":"Paragraph","id":"58eee6c18580_4","name":"54af","type":"P","href":null,"layout":null,"metadata":null,"text":"In the past few months, the Flutter community has been incredibly active, with 852 framework commits and 615 engine commits. We’re excited to welcome 49 new contributors who have helped make this release possible. Your dedication and passion are what drive Flutter forward.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_5":{"__typename":"Paragraph","id":"58eee6c18580_5","name":"6906","type":"P","href":null,"layout":null,"metadata":null,"text":"So, dive in and discover all the new features and enhancements that the Flutter community has brought to this latest release!","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_6":{"__typename":"Paragraph","id":"58eee6c18580_6","name":"e149","type":"H3","href":null,"layout":null,"metadata":null,"text":"Flutter Framework","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_7":{"__typename":"Paragraph","id":"58eee6c18580_7","name":"a3cc","type":"H4","href":null,"layout":null,"metadata":null,"text":"New Slivers","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_8":{"__typename":"Paragraph","id":"58eee6c18580_8","name":"61b6","type":"P","href":null,"layout":null,"metadata":null,"text":"This release adds new slivers that can be composed together for dynamic app bar behaviors:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_9":{"__typename":"Paragraph","id":"58eee6c18580_9","name":"e51e","type":"ULI","href":null,"layout":null,"metadata":null,"text":"PinnedHeaderSliver","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":18,"href":"http:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fwidgets\u002FPinnedHeaderSliver-class.html","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_10":{"__typename":"Paragraph","id":"58eee6c18580_10","name":"d770","type":"ULI","href":null,"layout":null,"metadata":null,"text":"SliverResizingHeader","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":20,"href":"http:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fwidgets\u002FSliverResizingHeader-class.html","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_11":{"__typename":"Paragraph","id":"58eee6c18580_11","name":"4196","type":"P","href":null,"layout":null,"metadata":null,"text":"You can use these new slivers to make headers that float, stay pinned, or resize as the user scrolls. These new slivers are similar to the existing SliverPersistentHeader and SliverAppBar slivers, but have simpler APIs that can be combined for greater effect.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":148,"end":170,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":175,"end":187,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":148,"end":170,"href":"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fwidgets\u002FSliverPersistentHeader-class.html","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":175,"end":187,"href":"http:\u002F\u002Fsliverappbar","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_12":{"__typename":"Paragraph","id":"58eee6c18580_12","name":"3b73","type":"P","href":null,"layout":null,"metadata":null,"text":"These new slivers come with new sample code. For example, PinnedHeaderSliver’s API documentation has an example that recreates effects like the iOS Settings app’s app bar:","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":58,"end":76,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*bdcb6KGonosfPZ6m":{"__typename":"ImageMetadata","id":"0*bdcb6KGonosfPZ6m","originalHeight":663,"originalWidth":600,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:58eee6c18580_13":{"__typename":"Paragraph","id":"58eee6c18580_13","name":"d4c8","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*bdcb6KGonosfPZ6m"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_14":{"__typename":"Paragraph","id":"58eee6c18580_14","name":"e121","type":"H4","href":null,"layout":null,"metadata":null,"text":"Updates in the Cupertino library","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_15":{"__typename":"Paragraph","id":"58eee6c18580_15","name":"f686","type":"P","href":null,"layout":null,"metadata":null,"text":"In this release, we’ve improved the fidelity of CupertinoActionSheet. Sliding your finger across the action sheet’s buttons now provides haptic feedback. The buttons’ font size and weight now match their native counterparts.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":48,"end":68,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":48,"end":68,"href":"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fcupertino\u002FCupertinoActionSheet-class.html","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":68,"end":70,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*_o_9V0RlITOZdU4v":{"__typename":"ImageMetadata","id":"0*_o_9V0RlITOZdU4v","originalHeight":1140,"originalWidth":655,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:58eee6c18580_16":{"__typename":"Paragraph","id":"58eee6c18580_16","name":"ae1f","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*_o_9V0RlITOZdU4v"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_17":{"__typename":"Paragraph","id":"58eee6c18580_17","name":"99e0","type":"P","href":null,"layout":null,"metadata":null,"text":"We’ve also added new focus properties to CupertinoButton, and you can now customize the color of a disabled CupertinoTextField.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":41,"end":56,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":108,"end":126,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":41,"end":56,"href":"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fcupertino\u002FCupertinoButton-class.html","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":108,"end":126,"href":"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fcupertino\u002FCupertinoTextField-class.html","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_18":{"__typename":"Paragraph","id":"58eee6c18580_18","name":"88ed","type":"P","href":null,"layout":null,"metadata":null,"text":"A refresh of the Cupertino library is underway, expect more updates in future releases!","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_19":{"__typename":"Paragraph","id":"58eee6c18580_19","name":"cf9b","type":"H4","href":null,"layout":null,"metadata":null,"text":"TreeView","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_20":{"__typename":"Paragraph","id":"58eee6c18580_20","name":"9140","type":"P","href":null,"layout":null,"metadata":null,"text":"The two_dimensional_scrollables package released the TreeView widget, alongside several companion classes for building performant scrolling trees that can scroll in all directions as the tree grows. The sample app included in the package was also updated with several new examples of using the TableView and TreeView widgets.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":4,"end":31,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":53,"end":61,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":294,"end":303,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":308,"end":316,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":4,"end":31,"href":"https:\u002F\u002Fpub.dev\u002Fpackages\u002Ftwo_dimensional_scrollables","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":53,"end":61,"href":"https:\u002F\u002Fpub.dev\u002Fdocumentation\u002Ftwo_dimensional_scrollables\u002Flatest\u002Ftwo_dimensional_scrollables\u002FTreeView-class.html","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":294,"end":303,"href":"https:\u002F\u002Fpub.dev\u002Fdocumentation\u002Ftwo_dimensional_scrollables\u002Flatest\u002Ftwo_dimensional_scrollables\u002FTableView-class.html","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":308,"end":316,"href":"https:\u002F\u002Fpub.dev\u002Fdocumentation\u002Ftwo_dimensional_scrollables\u002Flatest\u002Ftwo_dimensional_scrollables\u002FTreeView-class.html","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*wcmJCv-6owwsolRl":{"__typename":"ImageMetadata","id":"0*wcmJCv-6owwsolRl","originalHeight":427,"originalWidth":600,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:58eee6c18580_21":{"__typename":"Paragraph","id":"58eee6c18580_21","name":"2ae7","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*wcmJCv-6owwsolRl"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_22":{"__typename":"Paragraph","id":"58eee6c18580_22","name":"02ce","type":"P","href":null,"layout":null,"metadata":null,"text":"TreeSliver was also added to the framework for building trees in one dimensional scrolling. The TreeView and TreeSliver APIs match, making it easy to switch between the one that is right for your use case.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":0,"end":10,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":96,"end":104,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":109,"end":119,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":0,"end":10,"href":"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fwidgets\u002FTreeSliver-class.html","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_23":{"__typename":"Paragraph","id":"58eee6c18580_23","name":"eeeb","type":"H4","href":null,"layout":null,"metadata":null,"text":"CarouselView","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_24":{"__typename":"Paragraph","id":"58eee6c18580_24","name":"16d2","type":"P","href":null,"layout":null,"metadata":null,"text":"This release included the Material Design carousel widget: CarouselView. The CarouselView presents the “Uncontained” layout: a scrollable list of items that scroll to the edge of the container, and the leading and the trailing items can dynamically change size when they are scrolling out of the view and scrolling in the view.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":59,"end":71,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":77,"end":89,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":26,"end":50,"href":"https:\u002F\u002Fm3.material.io\u002Fcomponents\u002Fcarousel\u002Foverview","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":104,"end":115,"href":"https:\u002F\u002Fm3.material.io\u002Fcomponents\u002Fcarousel\u002Fspecs#477de3a1-c9df-4742-baf3-bcd5eeb3764c","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*6ytqSvtR2TJzAE6LntHTGw.gif":{"__typename":"ImageMetadata","id":"1*6ytqSvtR2TJzAE6LntHTGw.gif","originalHeight":493,"originalWidth":512,"focusPercentX":null,"focusPercentY":null,"alt":"Flutter CarouselView example"},"Paragraph:58eee6c18580_25":{"__typename":"Paragraph","id":"58eee6c18580_25","name":"122a","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:1*6ytqSvtR2TJzAE6LntHTGw.gif"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_26":{"__typename":"Paragraph","id":"58eee6c18580_26","name":"9dbb","type":"H4","href":null,"layout":null,"metadata":null,"text":"More functionality available from widgets","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_27":{"__typename":"Paragraph","id":"58eee6c18580_27","name":"dbc3","type":"P","href":null,"layout":null,"metadata":null,"text":"This release contains some of the work to relocate core widget logic, that isn’t design specific, out of the Material library and into the Widgets library for more general use. This includes:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_28":{"__typename":"Paragraph","id":"58eee6c18580_28","name":"c608","type":"ULI","href":null,"layout":null,"metadata":null,"text":"The Feedback widget, which provides easy access to haptic and audio feedback from the device in response to gestures like tap, long press, and more.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":4,"end":12,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":4,"end":12,"href":"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fpull\u002F148523","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_29":{"__typename":"Paragraph","id":"58eee6c18580_29","name":"43ee","type":"ULI","href":null,"layout":null,"metadata":null,"text":"ToggleableStateMixin and ToggleablePainter, base classes for building toggle widgets like checkboxes, switches, and radio buttons.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":0,"end":20,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":25,"end":42,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":0,"end":42,"href":"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fpull\u002F148272","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_30":{"__typename":"Paragraph","id":"58eee6c18580_30","name":"e897","type":"H4","href":null,"layout":null,"metadata":null,"text":"Enhanced enum features for AnimationStatus","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_31":{"__typename":"Paragraph","id":"58eee6c18580_31","name":"be47","type":"P","href":null,"layout":null,"metadata":null,"text":"In a fantastic contribution from community member @nate-thegrate, enhanced enum features were added to AnimationStatus, including getters:","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":15,"end":27,"href":"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fpull\u002F147801","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":50,"end":64,"href":"https:\u002F\u002Fgithub.com\u002Fnate-thegrate","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":103,"end":118,"href":"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fanimation\u002FAnimationStatus.html","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_32":{"__typename":"Paragraph","id":"58eee6c18580_32","name":"322f","type":"ULI","href":null,"layout":null,"metadata":null,"text":"isDismissed","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_33":{"__typename":"Paragraph","id":"58eee6c18580_33","name":"d8ec","type":"ULI","href":null,"layout":null,"metadata":null,"text":"isCompleted","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_34":{"__typename":"Paragraph","id":"58eee6c18580_34","name":"73d1","type":"ULI","href":null,"layout":null,"metadata":null,"text":"isRunning","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_35":{"__typename":"Paragraph","id":"58eee6c18580_35","name":"401b","type":"ULI","href":null,"layout":null,"metadata":null,"text":"isForwardOrCompleted","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_36":{"__typename":"Paragraph","id":"58eee6c18580_36","name":"9fea","type":"P","href":null,"layout":null,"metadata":null,"text":"Some of these getters already existed in Animation subclasses, like AnimationController and CurvedAnimation. Now all of these status getters are available in Animation subclasses in addition to AnimationStatus. Lastly, a toggle method was added to AnimationController to switch the direction of the animation.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":41,"end":50,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":68,"end":87,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":92,"end":107,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":221,"end":227,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":41,"end":50,"href":"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fanimation\u002FAnimation-class.html","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":68,"end":87,"href":"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fanimation\u002FAnimationController-class.html","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":92,"end":107,"href":"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fanimation\u002FCurvedAnimation-class.html","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":221,"end":227,"href":"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fanimation\u002FAnimationController\u002Ftoggle.html","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_37":{"__typename":"Paragraph","id":"58eee6c18580_37","name":"209b","type":"H4","href":null,"layout":null,"metadata":null,"text":"Updates in SelectionArea","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_38":{"__typename":"Paragraph","id":"58eee6c18580_38","name":"f943","type":"P","href":null,"layout":null,"metadata":null,"text":"Flutter’s SelectionArea now supports more native gestures associated with a triple click using a mouse, and double tapping on a touch device. By default, the SelectionArea and SelectableRegion widgets use these new gestures.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":10,"end":23,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":158,"end":171,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":176,"end":192,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":10,"end":23,"href":"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fmaterial\u002FSelectionArea-class.html","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":158,"end":171,"href":"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fmaterial\u002FSelectionArea-class.html","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":176,"end":192,"href":"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fwidgets\u002FSelectableRegion-class.html","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_39":{"__typename":"Paragraph","id":"58eee6c18580_39","name":"7409","type":"P","href":null,"layout":null,"metadata":null,"text":"Triple click","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_40":{"__typename":"Paragraph","id":"58eee6c18580_40","name":"03dd","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Triple click + drag: Extends the selection in paragraph blocks.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_41":{"__typename":"Paragraph","id":"58eee6c18580_41","name":"c08b","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Triple click: Selects the paragraph block at the clicked position.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*_GmbsIKfnwEAW6G8":{"__typename":"ImageMetadata","id":"0*_GmbsIKfnwEAW6G8","originalHeight":244,"originalWidth":1138,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:58eee6c18580_42":{"__typename":"Paragraph","id":"58eee6c18580_42","name":"0f4c","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*_GmbsIKfnwEAW6G8"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_43":{"__typename":"Paragraph","id":"58eee6c18580_43","name":"ab4f","type":"P","href":null,"layout":null,"metadata":null,"text":"Double tap","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_44":{"__typename":"Paragraph","id":"58eee6c18580_44","name":"dec2","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Double tap + drag: extends the selection in word blocks (supported on native Android\u002FFuchsia\u002FiOS, and iOS web).","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_45":{"__typename":"Paragraph","id":"58eee6c18580_45","name":"280b","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Double tap: selects the word at the tapped position (supported on native Android\u002FFuchsia\u002FiOS, and Android\u002FFuchsia web).","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*DwZgIybQr3FDFxXd":{"__typename":"ImageMetadata","id":"0*DwZgIybQr3FDFxXd","originalHeight":228,"originalWidth":770,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:58eee6c18580_46":{"__typename":"Paragraph","id":"58eee6c18580_46","name":"82f6","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*DwZgIybQr3FDFxXd"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_47":{"__typename":"Paragraph","id":"58eee6c18580_47","name":"8237","type":"H3","href":null,"layout":null,"metadata":null,"text":"Engine","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_48":{"__typename":"Paragraph","id":"58eee6c18580_48","name":"667a","type":"H4","href":null,"layout":null,"metadata":null,"text":"Impeller","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_49":{"__typename":"Paragraph","id":"58eee6c18580_49","name":"8aa7","type":"P","href":null,"layout":null,"metadata":null,"text":"Improving Performance and Fidelity","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":34,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_50":{"__typename":"Paragraph","id":"58eee6c18580_50","name":"c325","type":"P","href":null,"layout":null,"metadata":null,"text":"In anticipation of removing the Impeller opt-out on iOS in a stable release coming soon, the team has been hard at work on improvements to Impeller’s performance and fidelity. As one example, a long series of improvements to text rendering greatly increased the performance of emoji scrolling, eliminating jank when scrolling a large collection of emojis, which was a fantastic stress test of Impeller’s text rendering capabilities.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":240,"end":292,"href":"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fissues\u002F138798","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_51":{"__typename":"Paragraph","id":"58eee6c18580_51","name":"b84b","type":"P","href":null,"layout":null,"metadata":null,"text":"Additionally, by solving a number of issues we have also greatly improved the fidelity of Impeller’s text rendering in this release. In particular, text weight, spacing, and kerning now all match the fidelity of text with the legacy renderer.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":17,"end":43,"href":"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fengine\u002Fpull\u002F53042","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*gIu2Wm9mpuMGb1JY":{"__typename":"ImageMetadata","id":"0*gIu2Wm9mpuMGb1JY","originalHeight":144,"originalWidth":1334,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:58eee6c18580_52":{"__typename":"Paragraph","id":"58eee6c18580_52","name":"ff6a","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*gIu2Wm9mpuMGb1JY"},"text":"Before (Note gaps instead of proper kerning, and lighter than intended font weight.)","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*tt9hlqhTbrmj4ZCt":{"__typename":"ImageMetadata","id":"0*tt9hlqhTbrmj4ZCt","originalHeight":142,"originalWidth":1350,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:58eee6c18580_53":{"__typename":"Paragraph","id":"58eee6c18580_53","name":"ba7f","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*tt9hlqhTbrmj4ZCt"},"text":"After","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*eMboSxWLEJBS_EyL":{"__typename":"ImageMetadata","id":"0*eMboSxWLEJBS_EyL","originalHeight":1600,"originalWidth":739,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:58eee6c18580_54":{"__typename":"Paragraph","id":"58eee6c18580_54","name":"43ac","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*eMboSxWLEJBS_EyL"},"text":"Before (Note incorrect spacing, for example in “vergelijken”)","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*uxeGJuIKWu0dPW1d":{"__typename":"ImageMetadata","id":"0*uxeGJuIKWu0dPW1d","originalHeight":1600,"originalWidth":739,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:58eee6c18580_55":{"__typename":"Paragraph","id":"58eee6c18580_55","name":"f6c4","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*uxeGJuIKWu0dPW1d"},"text":"After","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_56":{"__typename":"Paragraph","id":"58eee6c18580_56","name":"8148","type":"P","href":null,"layout":null,"metadata":null,"text":"Android Preview","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":15,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_57":{"__typename":"Paragraph","id":"58eee6c18580_57","name":"68bb","type":"P","href":null,"layout":null,"metadata":null,"text":"In this release, we are continuing to preview Impeller on Android. We have extended the preview period due to difficulties stemming from a bug in Android 14 that affects APIs that Impeller uses for Platform Views. The bug has since been patched by the Android team, however many deployed devices will be running the unpatched Android version for the foreseeable future. Working around these issues implies an additional API migration and therefore an additional stable release cycle. Out of an abundance of caution and to ensure that Flutter apps work on the widest possible range of devices, we are holding off on making Impeller the default renderer until a stable release later this year.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":137,"end":156,"href":"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fissues\u002F146499#issuecomment-2082873125","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_58":{"__typename":"Paragraph","id":"58eee6c18580_58","name":"7880","type":"P","href":null,"layout":null,"metadata":null,"text":"As the Impeller preview on Android continues through the 3.24 stable cycle, we request that Flutter developers upgrade to the latest stable version, and file issues about any shortcomings noticed when Impeller is enabled. Feedback at this stage is invaluable to ensuring that Impeller is successful on Android and that we will be able to confidently make it the default renderer in a release later this year. The Android hardware ecosystem is much more diverse than the iOS ecosystem. For that reason, the most helpful feedback about Impeller should include detailed information about the specific device and Android version where issues occurred.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_59":{"__typename":"Paragraph","id":"58eee6c18580_59","name":"e3c2","type":"H4","href":null,"layout":null,"metadata":null,"text":"Improved defaults for downscaled images","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_60":{"__typename":"Paragraph","id":"58eee6c18580_60","name":"4f2e","type":"P","href":null,"layout":null,"metadata":null,"text":"In this release, the default FilterQuality for images has been changed from FilterQuality.low to FilterQuality.medium. When a large image is substantially larger than its destination rectangle, which is a common scenario, FilterQuality.low causes an image to look more ‘pixelated’ and be slower to render than FilterQuality.medium. Going forward the team is also exploring more suitable names for the various FilterQuality levels.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":29,"end":42,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":76,"end":93,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":97,"end":117,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":222,"end":239,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":310,"end":330,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":409,"end":422,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_61":{"__typename":"Paragraph","id":"58eee6c18580_61","name":"a10d","type":"H4","href":null,"layout":null,"metadata":null,"text":"Flutter GPU preview","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_62":{"__typename":"Paragraph","id":"58eee6c18580_62","name":"e162","type":"P","href":null,"layout":null,"metadata":null,"text":"Flutter has introduced a major update for rendering capabilities with the Flutter GPU, available on the main channel. This low-level graphics API allows developers to create custom renderers using Dart code and GLSL shaders without needing any native platform code.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_63":{"__typename":"Paragraph","id":"58eee6c18580_63","name":"2129","type":"P","href":null,"layout":null,"metadata":null,"text":"Flutter GPU expands what you can render directly in Flutter, enabling advanced graphics and 3D scenes. It requires the Impeller rendering backend, currently supported on iOS, macOS, and Android. Although in early preview, Flutter GPU aims to eventually support all Flutter platforms.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_64":{"__typename":"Paragraph","id":"58eee6c18580_64","name":"21ae","type":"P","href":null,"layout":null,"metadata":null,"text":"The API allows for full control over render pass attachments, the vertex stage, and data upload to the GPU. This flexibility is essential for creating sophisticated rendering solutions, from 2D character animations to complex 3D scenes.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_65":{"__typename":"Paragraph","id":"58eee6c18580_65","name":"ad42","type":"P","href":null,"layout":null,"metadata":null,"text":"Developers can start using Flutter GPU by switching to the main channel and adding the flutter_gpu package to their projects. The upcoming months will see more functionality and stability improvements, with higher-level rendering libraries like flutter_scene simplifying the use of these advanced features.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_66":{"__typename":"Paragraph","id":"58eee6c18580_66","name":"cf09","type":"P","href":null,"layout":null,"metadata":null,"text":"For a deeper dive into Flutter GPU and to see how you can leverage it in your projects, check out the detailed Flutter GPU blog post. Whether you’re creating games or complex graphics, Flutter’s new GPU capabilities make it a robust choice for your product.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":111,"end":132,"href":"https:\u002F\u002Fmedium.com\u002Fflutter\u002Fgetting-started-with-flutter-gpu-f33d497b7c11","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_67":{"__typename":"Paragraph","id":"58eee6c18580_67","name":"82da","type":"H3","href":null,"layout":null,"metadata":null,"text":"Web","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_68":{"__typename":"Paragraph","id":"58eee6c18580_68","name":"fb07","type":"H3","href":null,"layout":null,"metadata":null,"text":"Multi-view embedding","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_69":{"__typename":"Paragraph","id":"58eee6c18580_69","name":"eaa1","type":"P","href":null,"layout":null,"metadata":null,"text":"Flutter web applications can now leverage multi-view embedding, allowing developers to render content into multiple HTML elements simultaneously. This feature, known as “embedded mode” or “multi-view,” offers flexibility for integrating Flutter views into existing web applications.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_70":{"__typename":"Paragraph","id":"58eee6c18580_70","name":"48ef","type":"P","href":null,"layout":null,"metadata":null,"text":"In multi-view mode, a Flutter web application doesn’t render immediately upon launch. Instead, it waits until the host application adds the first “view” using the addView method. The host application can dynamically add or remove these views, and Flutter adjusts its widgets accordingly.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_71":{"__typename":"Paragraph","id":"58eee6c18580_71","name":"1427","type":"P","href":null,"layout":null,"metadata":null,"text":"To enable multi-view mode, set multiViewEnabled: true in the initializeEngine method within the flutter_bootstrap.js file. Views can then be managed from JavaScript, adding them to specified HTML elements and removing them as needed. Each view addition and removal triggers updates within Flutter, allowing for dynamic content rendering.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"CODE","start":31,"end":53,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":61,"end":77,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"CODE","start":96,"end":116,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_72":{"__typename":"Paragraph","id":"58eee6c18580_72","name":"b6bf","type":"P","href":null,"layout":null,"metadata":null,"text":"This feature is particularly useful for integrating Flutter into complex web applications where multiple, independent Flutter views are required. It also supports custom initialization data for each view, enabling personalized configurations and interactive experiences.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_73":{"__typename":"Paragraph","id":"58eee6c18580_73","name":"9875","type":"P","href":null,"layout":null,"metadata":null,"text":"For a deeper dive into implementing multi-view embedding in your Flutter web applications, check out the detailed documentation.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":105,"end":127,"href":"https:\u002F\u002Fdocs.flutter.dev\u002Fplatform-integration\u002Fweb\u002Fembedding-flutter-web","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_74":{"__typename":"Paragraph","id":"58eee6c18580_74","name":"7f9d","type":"H3","href":null,"layout":null,"metadata":null,"text":"Monetization","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_75":{"__typename":"Paragraph","id":"58eee6c18580_75","name":"96ad","type":"H3","href":null,"layout":null,"metadata":null,"text":"Video ad monetization support","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_76":{"__typename":"Paragraph","id":"58eee6c18580_76","name":"80cf","type":"P","href":null,"layout":null,"metadata":null,"text":"We have launched a new Interactive Media Ads (IMA) plugin to support instream video ad monetization on Flutter mobile apps. The new IMA plugin provides new ad monetization opportunities for Flutter apps on top of the existing Google Mobile Ads (GMA) plugin which primarily supports display ad formats.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":23,"end":57,"href":"https:\u002F\u002Fpub.dev\u002Fpackages\u002Finteractive_media_ads","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":226,"end":256,"href":"https:\u002F\u002Fpub.dev\u002Fpackages\u002Fgoogle_mobile_ads","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_77":{"__typename":"Paragraph","id":"58eee6c18580_77","name":"5343","type":"P","href":null,"layout":null,"metadata":null,"text":"Instream video ads are typically shown to a user in the video player before (preroll), during (midroll), or after (postroll) video content playback. Some instream video ads can be skippable as well.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*_c0s8KMdLNyfxOMQ":{"__typename":"ImageMetadata","id":"0*_c0s8KMdLNyfxOMQ","originalHeight":836,"originalWidth":836,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:58eee6c18580_78":{"__typename":"Paragraph","id":"58eee6c18580_78","name":"d315","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*_c0s8KMdLNyfxOMQ"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_79":{"__typename":"Paragraph","id":"58eee6c18580_79","name":"2f7d","type":"P","href":null,"layout":null,"metadata":null,"text":"Flutter IMA benefits:","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":20,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_80":{"__typename":"Paragraph","id":"58eee6c18580_80","name":"1378","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Seamlessly monetize video player content on Flutter apps. For example, when an app user clicks play on video content, you can now implement the Flutter IMA plugin to first show the user a 15 second ad before starting the video content.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":95,"end":99,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_81":{"__typename":"Paragraph","id":"58eee6c18580_81","name":"998e","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Tap into the same benefits of native IMA SDK including access to premium Google ad demand and industry standard compliance (such as IAB VAST).","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":132,"end":140,"href":"https:\u002F\u002Fiabtechlab.com\u002Fstandards\u002Fvast\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_82":{"__typename":"Paragraph","id":"58eee6c18580_82","name":"d30c","type":"P","href":null,"layout":null,"metadata":null,"text":"The initial launch version currently supports pre-roll video ads on Android and iOS platform. Support for midroll ads will be available soon. We encourage you to start exploring the new IMA plugin on your Flutter app video content. Please let us know if have any issues or concerns on GitHub.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":285,"end":291,"href":"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fissues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+interactive_media_ads%22","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_83":{"__typename":"Paragraph","id":"58eee6c18580_83","name":"ea00","type":"P","href":null,"layout":null,"metadata":null,"text":"Resources: Plugin guide, Sample App, Git Repository","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":11,"end":23,"href":"https:\u002F\u002Fpub.dev\u002Fpackages\u002Finteractive_media_ads","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":25,"end":35,"href":"https:\u002F\u002Fpub.dev\u002Fpackages\u002Finteractive_media_ads\u002Fexample","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":37,"end":51,"href":"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fpackages\u002Ftree\u002Fmain\u002Fpackages\u002Finteractive_media_ads","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_84":{"__typename":"Paragraph","id":"58eee6c18580_84","name":"c57b","type":"H3","href":null,"layout":null,"metadata":null,"text":"iOS","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_85":{"__typename":"Paragraph","id":"58eee6c18580_85","name":"3d7f","type":"H3","href":null,"layout":null,"metadata":null,"text":"Swift Package Manager initial support","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_86":{"__typename":"Paragraph","id":"58eee6c18580_86","name":"9d9b","type":"P","href":null,"layout":null,"metadata":null,"text":"Today, Flutter uses CocoaPods to manage native iOS or macOS dependencies.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_87":{"__typename":"Paragraph","id":"58eee6c18580_87","name":"5148","type":"P","href":null,"layout":null,"metadata":null,"text":"Flutter 3.24 adds early support for Swift Package Manager. This brings several benefits, including:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_88":{"__typename":"Paragraph","id":"58eee6c18580_88","name":"ed56","type":"P","href":null,"layout":null,"metadata":null,"text":"1. Access to the Swift package ecosystem. Flutter plugins will be able to leverage the growing ecosystem of Swift packages! \n2. Simplifies Flutter installation. Swift Package Manager is bundled with Xcode. In the future, you won’t need to install Ruby and CocoaPods to use Flutter for Apple’s platforms.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":108,"end":122,"href":"https:\u002F\u002Fswiftpackageindex.com\u002F","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":3,"end":40,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":128,"end":159,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_89":{"__typename":"Paragraph","id":"58eee6c18580_89","name":"5f62","type":"P","href":null,"layout":null,"metadata":null,"text":"We encourage plugin authors to try adding support for Swift Package Manager to your plugins, and provide feedback on your experience.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":30,"end":91,"href":"https:\u002F\u002Fdocs.flutter.dev\u002Fpackages-and-plugins\u002Fswift-package-manager\u002Ffor-plugin-authors#how-to-add-swift-package-manager-support-to-an-existing-flutter-plugin","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_90":{"__typename":"Paragraph","id":"58eee6c18580_90","name":"16c9","type":"P","href":null,"layout":null,"metadata":null,"text":"If you have feedback on Flutter’s support for Swift Package Manager, please file an issue.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":76,"end":89,"href":"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fissues\u002Fnew\u002Fchoose","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_91":{"__typename":"Paragraph","id":"58eee6c18580_91","name":"958f","type":"H3","href":null,"layout":null,"metadata":null,"text":"Ecosystem","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_92":{"__typename":"Paragraph","id":"58eee6c18580_92","name":"10dd","type":"H3","href":null,"layout":null,"metadata":null,"text":"Shared Preferences plugin updates","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_93":{"__typename":"Paragraph","id":"58eee6c18580_93","name":"9aad","type":"P","href":null,"layout":null,"metadata":null,"text":"We’ve added two new APIs to the shared_preferences plugin, SharedPreferencesAsync and SharedPreferencesWithCache. The most significant change is that the Android implementation uses Preferences DataStore instead of Shared Preferences.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":32,"end":50,"href":"https:\u002F\u002Fpub.dev\u002Fpackages\u002Fshared_preferences","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_94":{"__typename":"Paragraph","id":"58eee6c18580_94","name":"3226","type":"P","href":null,"layout":null,"metadata":null,"text":"SharedPreferencesAsync allows users to call directly to the platform to get the most up to date preferences saved on the device, at the cost of being async and a little slower than using the cached version. This is useful for preferences that can be updated by other systems or isolates, which would make a cache stale.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_95":{"__typename":"Paragraph","id":"58eee6c18580_95","name":"d80b","type":"P","href":null,"layout":null,"metadata":null,"text":"SharedPreferencesWithCache is built on top of SharedPreferencesAsync and allows users to access a locally cached copy of the preferences synchronously. This is similar to the old API, but can now be instantiated multiple times with different parameters.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_96":{"__typename":"Paragraph","id":"58eee6c18580_96","name":"0a10","type":"P","href":null,"layout":null,"metadata":null,"text":"These new APIs are intended to replace the current SharedPreferences API in the future. However, this is one of the most used plugins in the ecosystem, and we know it will take time for the ecosystem to switch to the new APIs.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_97":{"__typename":"Paragraph","id":"58eee6c18580_97","name":"30bb","type":"H3","href":null,"layout":null,"metadata":null,"text":"Flutter and Dart Package Ecosystem Summit Europe 2024","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*fWo9ieYzQcJjwQBi":{"__typename":"ImageMetadata","id":"0*fWo9ieYzQcJjwQBi","originalHeight":599,"originalWidth":1600,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:58eee6c18580_98":{"__typename":"Paragraph","id":"58eee6c18580_98","name":"8164","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*fWo9ieYzQcJjwQBi"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_99":{"__typename":"Paragraph","id":"58eee6c18580_99","name":"f44c","type":"P","href":null,"layout":null,"metadata":null,"text":"As part of Fluttercon Europe 2024, we held the first in-person Flutter and Dart Package Ecosystem Summit. This followed on from the first virtual summit we held in August 2023. See a summary of takeaways from the discussion sessions here.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":233,"end":237,"href":"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002Fe\u002F2PACX-1vRFLdpIJYO5YPARcyUT1FYPzwkFb1hxh_agqnCXxsyirXocLZS5jobs3xFV5ZGpSQHLHZiBzqbJlXNV\u002Fpub","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_100":{"__typename":"Paragraph","id":"58eee6c18580_100","name":"5a1b","type":"P","href":null,"layout":null,"metadata":null,"text":"We’re excited to announce that the next summit will be at Fluttercon USA in New York City on 20th September 2024! If you’re a package author or contributor, and are attending Fluttercon USA 2024, register to save your spot in the summit.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":58,"end":72,"href":"https:\u002F\u002Fflutterconusa.dev\u002F","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":196,"end":204,"href":"https:\u002F\u002Frsvp.withgoogle.com\u002Fevents\u002Fflutter-package-ecosystem-summit-usa-2024","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_101":{"__typename":"Paragraph","id":"58eee6c18580_101","name":"ab37","type":"P","href":null,"layout":null,"metadata":null,"text":"The summit brought together package authors and maintainers for unconference-style sessions on the following topics:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_102":{"__typename":"Paragraph","id":"58eee6c18580_102","name":"4d45","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Session 1 — Past, Present and Future of Native Interop","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_103":{"__typename":"Paragraph","id":"58eee6c18580_103","name":"93f5","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Session 2 — Sustainable package maintenance models","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_104":{"__typename":"Paragraph","id":"58eee6c18580_104","name":"a81e","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Session 3 — Addressing package ecosystem fragmentation","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_105":{"__typename":"Paragraph","id":"58eee6c18580_105","name":"7ddc","type":"P","href":null,"layout":null,"metadata":null,"text":"We believe the summit, especially when part of more general Flutter and Dart events, is a valuable platform for open discussion among the community, to surface critical challenges and brainstorming solutions. We’re looking forward to holding more of these summits going forward, in partnership with the community.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_106":{"__typename":"Paragraph","id":"58eee6c18580_106","name":"4ebe","type":"H3","href":null,"layout":null,"metadata":null,"text":"DevTools and IDEs","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_107":{"__typename":"Paragraph","id":"58eee6c18580_107","name":"79bf","type":"P","href":null,"layout":null,"metadata":null,"text":"This release includes some exciting improvements to the Flutter DevTools tooling suite.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_108":{"__typename":"Paragraph","id":"58eee6c18580_108","name":"9845","type":"P","href":null,"layout":null,"metadata":null,"text":"If you have ever wondered whether your Flutter app is building more Widgets than expected, a new feature in the DevTools Performance tool that can help with that. Using the new Rebuild Stats feature, you can capture information about how many times a widget was built in your app or even in a specific Flutter frame.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":112,"end":132,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":176,"end":190,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*7LXjXlFR9w-VR6xk":{"__typename":"ImageMetadata","id":"0*7LXjXlFR9w-VR6xk","originalHeight":531,"originalWidth":749,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:58eee6c18580_109":{"__typename":"Paragraph","id":"58eee6c18580_109","name":"5a94","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*7LXjXlFR9w-VR6xk"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_110":{"__typename":"Paragraph","id":"58eee6c18580_110","name":"6a97","type":"P","href":null,"layout":null,"metadata":null,"text":"A screenshot of the DevTools Performance tool tracking rebuild stats.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"EM","start":0,"end":69,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_111":{"__typename":"Paragraph","id":"58eee6c18580_111","name":"30dd","type":"P","href":null,"layout":null,"metadata":null,"text":"We’ve added polish and critical bug fixes to tools like the Network profiler and the Flutter Deep Links tool, and have made some general improvements to provide you with a better experience when you are using DevTools from within your IDE. Speaking of IDEs, did you know that you can use every DevTools tool directly inside your IDE?","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":60,"end":76,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":85,"end":108,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*tdpToIuTd-mBq-_R":{"__typename":"ImageMetadata","id":"0*tdpToIuTd-mBq-_R","originalHeight":1048,"originalWidth":1600,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:58eee6c18580_112":{"__typename":"Paragraph","id":"58eee6c18580_112","name":"c07e","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*tdpToIuTd-mBq-_R"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_113":{"__typename":"Paragraph","id":"58eee6c18580_113","name":"4931","type":"P","href":null,"layout":null,"metadata":null,"text":"DevTools screens open inside a VS Code window.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"EM","start":0,"end":46,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*QvoXCNqqfsrMn1oC":{"__typename":"ImageMetadata","id":"0*QvoXCNqqfsrMn1oC","originalHeight":1120,"originalWidth":1600,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:58eee6c18580_114":{"__typename":"Paragraph","id":"58eee6c18580_114","name":"5074","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*QvoXCNqqfsrMn1oC"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_115":{"__typename":"Paragraph","id":"58eee6c18580_115","name":"6e60","type":"P","href":null,"layout":null,"metadata":null,"text":"DevTools screens open inside Android Studio tool windows.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"EM","start":0,"end":57,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_116":{"__typename":"Paragraph","id":"58eee6c18580_116","name":"8541","type":"P","href":null,"layout":null,"metadata":null,"text":"This release includes improvements to the Flutter Sidebar in VS Code to give you easier access to the tools you are looking for. Upgrade to the latest versions of VS Code and the Flutter and Dart extensions to access the improved sidebar.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*BzEybhMlV-SnSZZl":{"__typename":"ImageMetadata","id":"0*BzEybhMlV-SnSZZl","originalHeight":542,"originalWidth":318,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:58eee6c18580_117":{"__typename":"Paragraph","id":"58eee6c18580_117","name":"d739","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*BzEybhMlV-SnSZZl"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_118":{"__typename":"Paragraph","id":"58eee6c18580_118","name":"d299","type":"P","href":null,"layout":null,"metadata":null,"text":"The Flutter Sidebar is adaptive and scales to fit your workspace","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"EM","start":0,"end":64,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_119":{"__typename":"Paragraph","id":"58eee6c18580_119","name":"a14a","type":"P","href":null,"layout":null,"metadata":null,"text":"This release also includes some major improvements to the DevTools Extensions framework. You can now use DevTools extensions (tools provided by one of your package dependencies) when you are debugging a Dart or Flutter test, or even when you aren’t debugging anything, but are just writing code in your IDE. So, if you’ve wanted to use a tool (or build one!) for one of these user journeys, it is now possible.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":58,"end":77,"href":"https:\u002F\u002Fdocs.flutter.dev\u002Ftools\u002Fdevtools\u002Fextensions","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_120":{"__typename":"Paragraph","id":"58eee6c18580_120","name":"21f0","type":"P","href":null,"layout":null,"metadata":null,"text":"To learn more about all the updates included in Flutter 3.24 check out the release notes for DevTools 2.35.0, 2.36.0, and 2.37.2.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":102,"end":108,"href":"https:\u002F\u002Fdocs.flutter.dev\u002Ftools\u002Fdevtools\u002Frelease-notes\u002Frelease-notes-2.35.0","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":110,"end":116,"href":"https:\u002F\u002Fdocs.flutter.dev\u002Ftools\u002Fdevtools\u002Frelease-notes\u002Frelease-notes-2.36.0","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":122,"end":128,"href":"https:\u002F\u002Fdocs.flutter.dev\u002Ftools\u002Fdevtools\u002Frelease-notes\u002Frelease-notes-2.37.2","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_121":{"__typename":"Paragraph","id":"58eee6c18580_121","name":"45cb","type":"H3","href":null,"layout":null,"metadata":null,"text":"Breaking changes and deprecations","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_122":{"__typename":"Paragraph","id":"58eee6c18580_122","name":"5667","type":"P","href":null,"layout":null,"metadata":null,"text":"Breaking changes in this release include changes to Navigator’s pages API, generic types in PopScope, Flutter web’s default renderer and the introduction of some new deprecations. See the full list of migration guidance on the breaking changes page.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":52,"end":73,"href":"https:\u002F\u002Fdocs.flutter.dev\u002Frelease\u002Fbreaking-changes\u002Fnavigator-and-page-api","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":75,"end":100,"href":"https:\u002F\u002Fdocs.flutter.dev\u002Frelease\u002Fbreaking-changes\u002Fpopscope-with-result","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":102,"end":132,"href":"https:\u002F\u002Fdocs.flutter.dev\u002Fplatform-integration\u002Fweb\u002Frenderers","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":227,"end":248,"href":"https:\u002F\u002Fdocs.flutter.dev\u002Frelease\u002Fbreaking-changes","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_123":{"__typename":"Paragraph","id":"58eee6c18580_123","name":"92f8","type":"P","href":null,"layout":null,"metadata":null,"text":"As always, many thanks to the community for contributing tests — these help us identify these breaking changes. To learn more, check out Flutter’s breaking change policy.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":44,"end":62,"href":"https:\u002F\u002Fgithub.com\u002Fflutter\u002Ftests\u002Fblob\u002Fmaster\u002FREADME.md","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":137,"end":169,"href":"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fwiki\u002FTree-hygiene#handling-breaking-changes","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_124":{"__typename":"Paragraph","id":"58eee6c18580_124","name":"0bad","type":"H3","href":null,"layout":null,"metadata":null,"text":"Conclusion","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_125":{"__typename":"Paragraph","id":"58eee6c18580_125","name":"4a28","type":"P","href":null,"layout":null,"metadata":null,"text":"At the heart of Flutter’s success is you — our amazing community. This release wouldn’t be possible without your countless contributions and unwavering passion. From the bottom of our hearts, thank you.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_126":{"__typename":"Paragraph","id":"58eee6c18580_126","name":"69f2","type":"P","href":null,"layout":null,"metadata":null,"text":"To dive into the specifics of what has been achieved with this release, we invite you to view the release notes and change log for a comprehensive list of additions in Flutter 3.24.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":98,"end":111,"href":"https:\u002F\u002Fdocs.flutter.dev\u002Frelease\u002Frelease-notes\u002Frelease-notes-3.24.0","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":116,"end":126,"href":"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fblob\u002Fmain\u002FCHANGELOG.md","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:58eee6c18580_127":{"__typename":"Paragraph","id":"58eee6c18580_127","name":"3222","type":"P","href":null,"layout":null,"metadata":null,"text":"Flutter 3.24, alongside Dart 3.5, is now available on the stable channel. Embarking on this latest journey with Flutter is as straightforward as running flutter upgrade. We can’t wait to see what you build!","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"CollectionViewerEdge:collectionId:4da7dfd21a33-viewerId:lo_4f088812212c":{"__typename":"CollectionViewerEdge","id":"collectionId:4da7dfd21a33-viewerId:lo_4f088812212c","isEditor":false,"isMuting":false},"ImageMetadata:1*KvnfbD1F5CzEsU9wSmRZyA.png":{"__typename":"ImageMetadata","id":"1*KvnfbD1F5CzEsU9wSmRZyA.png","originalWidth":538,"originalHeight":141},"PostViewerEdge:postId:6c040f87d1e4-viewerId:lo_4f088812212c":{"__typename":"PostViewerEdge","shouldIndexPostForExternalSearch":true,"id":"postId:6c040f87d1e4-viewerId:lo_4f088812212c"},"Tag:announcements":{"__typename":"Tag","id":"announcements","displayTitle":"Announcements","normalizedTagSlug":"announcements"},"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:flutter-development":{"__typename":"Tag","id":"flutter-development","displayTitle":"Flutter Development","normalizedTagSlug":"flutter-development"},"Post:6c040f87d1e4":{"__typename":"Post","id":"6c040f87d1e4","collection":{"__ref":"Collection:4da7dfd21a33"},"content({\"postMeteringOptions\":{}})":{"__typename":"PostContent","isLockedPreviewOnly":false,"bodyModel":{"__typename":"RichText","sections":[{"__typename":"Section","name":"5a74","startIndex":0,"textLayout":null,"imageLayout":null,"backgroundImage":null,"videoLayout":null,"backgroundVideo":null}],"paragraphs":[{"__ref":"Paragraph:58eee6c18580_0"},{"__ref":"Paragraph:58eee6c18580_1"},{"__ref":"Paragraph:58eee6c18580_2"},{"__ref":"Paragraph:58eee6c18580_3"},{"__ref":"Paragraph:58eee6c18580_4"},{"__ref":"Paragraph:58eee6c18580_5"},{"__ref":"Paragraph:58eee6c18580_6"},{"__ref":"Paragraph:58eee6c18580_7"},{"__ref":"Paragraph:58eee6c18580_8"},{"__ref":"Paragraph:58eee6c18580_9"},{"__ref":"Paragraph:58eee6c18580_10"},{"__ref":"Paragraph:58eee6c18580_11"},{"__ref":"Paragraph:58eee6c18580_12"},{"__ref":"Paragraph:58eee6c18580_13"},{"__ref":"Paragraph:58eee6c18580_14"},{"__ref":"Paragraph:58eee6c18580_15"},{"__ref":"Paragraph:58eee6c18580_16"},{"__ref":"Paragraph:58eee6c18580_17"},{"__ref":"Paragraph:58eee6c18580_18"},{"__ref":"Paragraph:58eee6c18580_19"},{"__ref":"Paragraph:58eee6c18580_20"},{"__ref":"Paragraph:58eee6c18580_21"},{"__ref":"Paragraph:58eee6c18580_22"},{"__ref":"Paragraph:58eee6c18580_23"},{"__ref":"Paragraph:58eee6c18580_24"},{"__ref":"Paragraph:58eee6c18580_25"},{"__ref":"Paragraph:58eee6c18580_26"},{"__ref":"Paragraph:58eee6c18580_27"},{"__ref":"Paragraph:58eee6c18580_28"},{"__ref":"Paragraph:58eee6c18580_29"},{"__ref":"Paragraph:58eee6c18580_30"},{"__ref":"Paragraph:58eee6c18580_31"},{"__ref":"Paragraph:58eee6c18580_32"},{"__ref":"Paragraph:58eee6c18580_33"},{"__ref":"Paragraph:58eee6c18580_34"},{"__ref":"Paragraph:58eee6c18580_35"},{"__ref":"Paragraph:58eee6c18580_36"},{"__ref":"Paragraph:58eee6c18580_37"},{"__ref":"Paragraph:58eee6c18580_38"},{"__ref":"Paragraph:58eee6c18580_39"},{"__ref":"Paragraph:58eee6c18580_40"},{"__ref":"Paragraph:58eee6c18580_41"},{"__ref":"Paragraph:58eee6c18580_42"},{"__ref":"Paragraph:58eee6c18580_43"},{"__ref":"Paragraph:58eee6c18580_44"},{"__ref":"Paragraph:58eee6c18580_45"},{"__ref":"Paragraph:58eee6c18580_46"},{"__ref":"Paragraph:58eee6c18580_47"},{"__ref":"Paragraph:58eee6c18580_48"},{"__ref":"Paragraph:58eee6c18580_49"},{"__ref":"Paragraph:58eee6c18580_50"},{"__ref":"Paragraph:58eee6c18580_51"},{"__ref":"Paragraph:58eee6c18580_52"},{"__ref":"Paragraph:58eee6c18580_53"},{"__ref":"Paragraph:58eee6c18580_54"},{"__ref":"Paragraph:58eee6c18580_55"},{"__ref":"Paragraph:58eee6c18580_56"},{"__ref":"Paragraph:58eee6c18580_57"},{"__ref":"Paragraph:58eee6c18580_58"},{"__ref":"Paragraph:58eee6c18580_59"},{"__ref":"Paragraph:58eee6c18580_60"},{"__ref":"Paragraph:58eee6c18580_61"},{"__ref":"Paragraph:58eee6c18580_62"},{"__ref":"Paragraph:58eee6c18580_63"},{"__ref":"Paragraph:58eee6c18580_64"},{"__ref":"Paragraph:58eee6c18580_65"},{"__ref":"Paragraph:58eee6c18580_66"},{"__ref":"Paragraph:58eee6c18580_67"},{"__ref":"Paragraph:58eee6c18580_68"},{"__ref":"Paragraph:58eee6c18580_69"},{"__ref":"Paragraph:58eee6c18580_70"},{"__ref":"Paragraph:58eee6c18580_71"},{"__ref":"Paragraph:58eee6c18580_72"},{"__ref":"Paragraph:58eee6c18580_73"},{"__ref":"Paragraph:58eee6c18580_74"},{"__ref":"Paragraph:58eee6c18580_75"},{"__ref":"Paragraph:58eee6c18580_76"},{"__ref":"Paragraph:58eee6c18580_77"},{"__ref":"Paragraph:58eee6c18580_78"},{"__ref":"Paragraph:58eee6c18580_79"},{"__ref":"Paragraph:58eee6c18580_80"},{"__ref":"Paragraph:58eee6c18580_81"},{"__ref":"Paragraph:58eee6c18580_82"},{"__ref":"Paragraph:58eee6c18580_83"},{"__ref":"Paragraph:58eee6c18580_84"},{"__ref":"Paragraph:58eee6c18580_85"},{"__ref":"Paragraph:58eee6c18580_86"},{"__ref":"Paragraph:58eee6c18580_87"},{"__ref":"Paragraph:58eee6c18580_88"},{"__ref":"Paragraph:58eee6c18580_89"},{"__ref":"Paragraph:58eee6c18580_90"},{"__ref":"Paragraph:58eee6c18580_91"},{"__ref":"Paragraph:58eee6c18580_92"},{"__ref":"Paragraph:58eee6c18580_93"},{"__ref":"Paragraph:58eee6c18580_94"},{"__ref":"Paragraph:58eee6c18580_95"},{"__ref":"Paragraph:58eee6c18580_96"},{"__ref":"Paragraph:58eee6c18580_97"},{"__ref":"Paragraph:58eee6c18580_98"},{"__ref":"Paragraph:58eee6c18580_99"},{"__ref":"Paragraph:58eee6c18580_100"},{"__ref":"Paragraph:58eee6c18580_101"},{"__ref":"Paragraph:58eee6c18580_102"},{"__ref":"Paragraph:58eee6c18580_103"},{"__ref":"Paragraph:58eee6c18580_104"},{"__ref":"Paragraph:58eee6c18580_105"},{"__ref":"Paragraph:58eee6c18580_106"},{"__ref":"Paragraph:58eee6c18580_107"},{"__ref":"Paragraph:58eee6c18580_108"},{"__ref":"Paragraph:58eee6c18580_109"},{"__ref":"Paragraph:58eee6c18580_110"},{"__ref":"Paragraph:58eee6c18580_111"},{"__ref":"Paragraph:58eee6c18580_112"},{"__ref":"Paragraph:58eee6c18580_113"},{"__ref":"Paragraph:58eee6c18580_114"},{"__ref":"Paragraph:58eee6c18580_115"},{"__ref":"Paragraph:58eee6c18580_116"},{"__ref":"Paragraph:58eee6c18580_117"},{"__ref":"Paragraph:58eee6c18580_118"},{"__ref":"Paragraph:58eee6c18580_119"},{"__ref":"Paragraph:58eee6c18580_120"},{"__ref":"Paragraph:58eee6c18580_121"},{"__ref":"Paragraph:58eee6c18580_122"},{"__ref":"Paragraph:58eee6c18580_123"},{"__ref":"Paragraph:58eee6c18580_124"},{"__ref":"Paragraph:58eee6c18580_125"},{"__ref":"Paragraph:58eee6c18580_126"},{"__ref":"Paragraph:58eee6c18580_127"}]},"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-24-6c040f87d1e4","primaryTopic":null,"topics":[{"__typename":"Topic","slug":"android-development"},{"__typename":"Topic","slug":"ios-development"},{"__typename":"Topic","slug":"programming"}],"isPublished":true,"latestPublishedVersion":"58eee6c18580","visibility":"PUBLIC","postResponses":{"__typename":"PostResponses","count":27},"clapCount":3812,"allowResponses":true,"isLimitedState":false,"title":"What’s new in Flutter 3.24","isSeries":false,"sequence":null,"uniqueSlug":"whats-new-in-flutter-3-24-6c040f87d1e4","socialTitle":"","socialDek":"","canonicalUrl":"","metaDescription":"","latestPublishedAt":1723055666571,"readingTime":11.464150943396225,"previewContent":{"__typename":"PreviewContent","subtitle":"Unleashing Flutter GPU, Multi-View Embedding, and More"},"previewImage":{"__ref":"ImageMetadata:0*bdcb6KGonosfPZ6m"},"isShortform":false,"seoTitle":"","firstPublishedAt":1722967206984,"updatedAt":1731991437259,"shortformType":"SHORTFORM_TYPE_LINK","seoDescription":"","viewerEdge":{"__ref":"PostViewerEdge:postId:6c040f87d1e4-viewerId:lo_4f088812212c"},"isSuspended":false,"license":"ALL_RIGHTS_RESERVED","tags":[{"__ref":"Tag:announcements"},{"__ref":"Tag:flutter"},{"__ref":"Tag:flutter-app-development"},{"__ref":"Tag:release-notes"},{"__ref":"Tag:flutter-development"}],"isNewsletter":false,"statusForCollection":"APPROVED","pendingCollection":null,"detectedLanguage":"en","wordCount":2614,"layerCake":1,"responsesLocked":false}}</script><script>window.__MIDDLEWARE_STATE__={"session":{"xsrf":""},"cache":{"cacheStatus":"HIT"}}</script><script src="https://cdn-client.medium.com/lite/static/js/manifest.bbe4ab66.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.bbe47cad.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/5787.e66a3a4d.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/7549.2176f21f.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6589.7c500280.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.0a97706a.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/7394.bf599bc5.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.902ad94b.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:'8eadd3d83ed540bb',t:'MTczMzAwMTA2MS4wMDAwMDA='};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>