CINXE.COM
<!doctype html><html lang="en"><head><script type="text/javascript" src="/_static/js/bundle-playback.js?v=HxkREWBo" charset="utf-8"></script> <script type="text/javascript" src="/_static/js/wombat.js?v=txqj7nKC" charset="utf-8"></script> <script>window.RufflePlayer=window.RufflePlayer||{};window.RufflePlayer.config={"autoplay":"on","unmuteOverlay":"hidden"};</script> <script type="text/javascript" src="/_static/js/ruffle/ruffle.js"></script> <script type="text/javascript"> __wm.init("https://web.archive.org/web"); __wm.wombat("https://medium.com/flutter/announcing-flutter-1-22-44f146009e5f","20210217042021","https://web.archive.org/","web","/_static/", "1613535621"); </script> <link rel="stylesheet" type="text/css" href="/_static/css/banner-styles.css?v=S1zqJCYt" /> <link rel="stylesheet" type="text/css" href="/_static/css/iconochive.css?v=3PDvdIFv" /> <!-- End Wayback Rewrite JS Include --> <script defer src="https://web.archive.org/web/20210217042021js_/https://cdn.optimizely.com/js/16180790160.js"></script><title data-rh="true">Announcing Flutter 1.22 with iOS 14 support | Flutter</title><meta data-rh="true" charset="utf-8"/><meta data-rh="true" name="viewport" content="width=device-width,minimum-scale=1,initial-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="2020-10-05T17:44:37.232Z"/><meta data-rh="true" name="title" content="Announcing Flutter 1.22 with iOS 14 support | Flutter"/><meta data-rh="true" property="og:title" content="Announcing Flutter 1.22"/><meta data-rh="true" property="twitter:title" content="Announcing Flutter 1.22"/><meta data-rh="true" name="twitter:site" content="@flutterdev"/><meta data-rh="true" name="twitter:app:url:iphone" content="medium://p/44f146009e5f"/><meta data-rh="true" property="al:android:url" content="medium://p/44f146009e5f"/><meta data-rh="true" property="al:ios:url" content="medium://p/44f146009e5f"/><meta data-rh="true" property="al:android:app_name" content="Medium"/><meta data-rh="true" name="description" content="We’re delighted to introduce our latest release of Flutter, with extensive support for iOS 14 and Android 11, new navigation, localization and Material support."/><meta data-rh="true" property="og:description" content="Supporting iOS 14 and Android 11, new i18n and l10n support, Google Maps and WebView plugins ready for production, a new App Size tool and…"/><meta data-rh="true" property="twitter:description" content="Supporting iOS 14 and Android 11, new i18n and l10n support, Google Maps and WebView plugins ready for production, a new App Size tool and…"/><meta data-rh="true" property="og:url" content="https://web.archive.org/web/20210217042021/https://medium.com/flutter/announcing-flutter-1-22-44f146009e5f"/><meta data-rh="true" property="al:web:url" content="https://medium.com/flutter/announcing-flutter-1-22-44f146009e5f"/><meta data-rh="true" property="og:image" content="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/500/0*luz0EiazQQqsAEC4"/><meta data-rh="true" name="twitter:image:src" content="https://miro.medium.com/max/500/0*luz0EiazQQqsAEC4"/><meta data-rh="true" name="twitter:card" content="summary_large_image"/><meta data-rh="true" property="article:author" content="https://medium.com/@csells_18027"/><meta data-rh="true" name="author" content="Chris Sells"/><meta data-rh="true" name="robots" content="index,follow,max-image-preview:large"/><meta data-rh="true" name="referrer" content="unsafe-url"/><meta data-rh="true" name="twitter:label1" value="Reading time"/><meta data-rh="true" name="twitter:data1" value="17 min read"/><meta data-rh="true" name="parsely-post-id" content="44f146009e5f"/><link data-rh="true" rel="search" type="application/opensearchdescription+xml" title="Medium" href="/web/20210217042021/https://medium.com/osd.xml"/><link data-rh="true" rel="apple-touch-icon" sizes="152x152" href="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/152/152/1*sHhtYhaCe2Uc3IU0IgKwIQ.png"/><link data-rh="true" rel="apple-touch-icon" sizes="120x120" href="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/120/120/1*sHhtYhaCe2Uc3IU0IgKwIQ.png"/><link data-rh="true" rel="apple-touch-icon" sizes="76x76" href="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/76/76/1*sHhtYhaCe2Uc3IU0IgKwIQ.png"/><link data-rh="true" rel="apple-touch-icon" sizes="60x60" href="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/60/60/1*sHhtYhaCe2Uc3IU0IgKwIQ.png"/><link data-rh="true" rel="mask-icon" href="https://web.archive.org/web/20210217042021im_/https://cdn-static-1.medium.com/_/fp/icons/Medium-Avatar-500x500.svg" color="#171717"/><link data-rh="true" id="glyph_preload_link" rel="preload" as="style" type="text/css" href="https://web.archive.org/web/20210217042021/https://glyph.medium.com/css/unbound.css"/><link data-rh="true" id="glyph_link" rel="stylesheet" type="text/css" href="https://web.archive.org/web/20210217042021cs_/https://glyph.medium.com/css/unbound.css"/><link data-rh="true" rel="author" href="https://medium.com/@csells_18027"/><link data-rh="true" rel="canonical" href="https://web.archive.org/web/20210217042021/https://medium.com/flutter/announcing-flutter-1-22-44f146009e5f"/><link data-rh="true" rel="alternate" href="https://web.archive.org/web/20210217042021/android-app://com.medium.reader/https/medium.com/p/44f146009e5f"/><link data-rh="true" rel="icon" href="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/1*m-R_BkNf1Qjr1YbyOIJY2w.png"/><script data-rh="true" type="application/ld+json">{"@context":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttp:\u002F\u002Fschema.org","@type":"NewsArticle","image":["https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmiro.medium.com\u002Fmax\u002F1200\u002F0*luz0EiazQQqsAEC4"],"url":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmedium.com\u002Fflutter\u002Fannouncing-flutter-1-22-44f146009e5f","dateCreated":"2020-10-01T14:57:04.818Z","datePublished":"2020-10-01T14:57:04.818Z","dateModified":"2020-10-05T17:44:43.462Z","headline":"Announcing Flutter 1.22 with iOS 14 support | Flutter","name":"Announcing Flutter 1.22 with iOS 14 support | Flutter","description":"We’re delighted to introduce our latest release of Flutter, with extensive support for iOS 14 and Android 11, new navigation, localization and Material support.","identifier":"44f146009e5f","keywords":["Lite:true","Tag:Flutter","Tag:iOS","Tag:Android","Tag:Announcements","Tag:Mobile App Development","Publication:flutter","Elevated:false","LockedPostSource:LOCKED_POST_SOURCE_NONE","LayerCake:0"],"author":{"@type":"Person","name":"Chris Sells","url":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmedium.com\u002F@csells_18027"},"creator":["Chris Sells"],"publisher":{"@type":"Organization","name":"Flutter","url":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmedium.com\u002Fflutter","logo":{"@type":"ImageObject","width":228,"height":60,"url":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmiro.medium.com\u002Fmax\u002F456\u002F1*KvnfbD1F5CzEsU9wSmRZyA.png"}},"mainEntityOfPage":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmedium.com\u002Fflutter\u002Fannouncing-flutter-1-22-44f146009e5f"}</script><script data-rh="true">(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','https://web.archive.org/web/20210217042021/https://www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-24232453-2', 'auto'); ga('send', 'pageview');</script><link rel="preload" href="https://web.archive.org/web/20210217042021/https://cdn.optimizely.com/js/16180790160.js" as="script"><style type="text/css" data-fela-rehydration="579" data-fela-type="STATIC">html{box-sizing:border-box}*, *: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}</style><style type="text/css" data-fela-rehydration="579" data-fela-type="RULE">.a{font-family:medium-content-sans-serif-font, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif}.b{font-weight:400}.c{background-color:rgba(255, 255, 255, 1)}.l{height:100vh}.m{width:100vw}.n{display:flex}.o{align-items:center}.p{justify-content:center}.q{height:25px}.r{fill:rgba(41, 41, 41, 1)}.s{display:block}.t{position:absolute}.u{top:0}.v{left:0}.w{right:0}.x{z-index:500}.y{box-shadow:0 4px 12px 0 rgba(0, 0, 0, 0.05)}.ah{max-width:1192px}.ai{min-width:0}.aj{width:100%}.ak{height:65px}.an{flex:1 0 auto}.ao{fill:rgba(25, 25, 25, 1)}.ap{flex:0 0 auto}.aq{visibility:hidden}.ar{margin-left:16px}.as{color:rgba(73, 139, 209, 1)}.at{fill:rgba(73, 139, 209, 1)}.au{font-size:inherit}.av{border:inherit}.aw{font-family:inherit}.ax{letter-spacing:inherit}.ay{font-weight:inherit}.az{padding:0}.ba{margin:0}.be:disabled{cursor:default}.bf:disabled{color:rgba(163, 208, 162, 0.5)}.bg:disabled{fill:rgba(163, 208, 162, 0.5)}.bh{border-top:none}.bi{background-color:rgba(1, 87, 155, 1)}.bk{height:54px}.bl{overflow:hidden}.bm{margin-right:40px}.bn{height:36px}.bo{width:138px}.bp{overflow:auto}.bq{flex:0 1 auto}.br{list-style-type:none}.bs{line-height:40px}.bt{white-space:nowrap}.bu{overflow-x:auto}.bv{align-items:flex-start}.bw{margin-top:20px}.bx{padding-top:20px}.by{height:80px}.bz{height:20px}.ca{margin-right:15px}.cb{margin-left:15px}.cc:first-child{margin-left:0}.cd{min-width:1px}.ce{background-color:rgba(167, 196, 231, 1)}.cf{font-family:sohne, "Helvetica Neue", Helvetica, Arial, sans-serif}.cg{font-size:13px}.ch{line-height:20px}.ci{color:rgba(227, 242, 255, 1)}.cj{text-transform:uppercase}.ck{letter-spacing:1px}.cl{color:inherit}.cm{fill:inherit}.cp:disabled{color:rgba(188, 211, 241, 1)}.cq:disabled{fill:rgba(188, 211, 241, 1)}.cr{margin-bottom:0px}.cs{margin-top:0px}.ct{height:119px}.cw{padding-left:24px}.cx{padding-right:24px}.cy{margin-left:auto}.cz{margin-right:auto}.da{max-width:728px}.db{box-sizing:border-box}.dc{top:calc(100vh + 100px)}.dd{bottom:calc(100vh + 100px)}.de{width:10px}.df{pointer-events:none}.dg{word-break:break-word}.dh{word-wrap:break-word}.di:after{display:block}.dj:after{content:""}.dk:after{clear:both}.dl{max-width:680px}.dm{line-height:1.23}.dn{letter-spacing:0}.do{font-style:normal}.dp{font-family:fell, Georgia, Cambria, "Times New Roman", Times, serif}.ek{margin-bottom:-0.27em}.el{color:rgba(41, 41, 41, 1)}.em{line-height:1.394}.fc{margin-bottom:-0.42em}.fd{color:rgba(117, 117, 117, 1)}.fe{margin-top:32px}.ff{justify-content:space-between}.fj{border-radius:50%}.fk{height:48px}.fl{width:48px}.fm{margin-left:12px}.fn{font-size:14px}.fo{margin-bottom:2px}.fq{max-height:20px}.fr{text-overflow:ellipsis}.fs{display:-webkit-box}.ft{-webkit-line-clamp:1}.fu{-webkit-box-orient:vertical}.fx:disabled{color:rgba(117, 117, 117, 1)}.fy:disabled{fill:rgba(117, 117, 117, 1)}.fz{margin-left:8px}.ga{color:rgba(255, 255, 255, 1)}.gb{padding:0px 8px 1px}.gc{fill:rgba(255, 255, 255, 1)}.gd{background:rgba(73, 139, 209, 1)}.ge{border-color:rgba(73, 139, 209, 1)}.gh:disabled{cursor:inherit}.gi:disabled{opacity:0.3}.gj:disabled:hover{background:rgba(73, 139, 209, 1)}.gk:disabled:hover{border-color:rgba(73, 139, 209, 1)}.gl{border-radius:4px}.gm{border-width:1px}.gn{border-style:solid}.go{display:inline-block}.gp{text-decoration:none}.gq{align-items:flex-end}.gy{padding-right:6px}.hb{fill:rgba(117, 117, 117, 1)}.hc{margin-right:8px}.hd{margin-right:-6px}.he{line-height:1.58}.hf{letter-spacing:-0.004em}.hg{font-family:charter, Georgia, Cambria, "Times New Roman", Times, serif}.hz{margin-bottom:-0.46em}.ia{text-decoration:underline}.ib{line-height:1.12}.ic{letter-spacing:-0.022em}.id{font-weight:500}.iw{margin-bottom:-0.28em}.jc{list-style-type:disc}.jd{margin-left:30px}.je{padding-left:0px}.jk{background-color:rgba(242, 242, 242, 1)}.jl{padding:2px 4px}.jm{font-size:75%}.jn> strong{font-family:inherit}.jo{font-family:Menlo, Monaco, "Courier New", Courier, monospace}.jp{max-width:864px}.jv{clear:both}.jx{cursor:zoom-in}.jy{position:relative}.jz{z-index:auto}.kb{opacity:0}.kc{transition:opacity 100ms 400ms}.kd{height:100%}.ke{will-change:transform}.kf{transform:translateZ(0)}.kg{margin:auto}.kh{padding-bottom:83.56481481481482%}.ki{height:0}.kj{filter:blur(20px)}.kk{transform:scale(1.1)}.kl{visibility:visible}.ku{max-width:1600px}.kv{padding-bottom:5px}.kw{padding-top:5px}.kx{padding-bottom:85.0625%}.ky{margin-top:10px}.kz{text-align:center}.lc{padding-bottom:73.3125%}.ld{max-width:1190px}.le{padding-bottom:101.76470588235294%}.lf{max-width:910px}.lg{background:rgba(255, 255, 255, 1)}.lh{border-width:2px}.li{border-color:rgba(255, 255, 255, 1)}.lj{float:left}.lk{margin-left:-150px}.ll{margin-right:30px}.lm{width:75%}.ln{padding-bottom:10px}.ls{margin-bottom:16px}.lt{padding-bottom:150.32967032967034%}.lu{max-width:1220px}.lv{padding-bottom:23.114754098360656%}.lw{max-width:600px}.lx{padding-bottom:71.83333333333333%}.ly{max-width:500px}.lz{padding-bottom:207%}.ma{font-style:italic}.mb{padding-bottom:39.1875%}.mc{padding-bottom:NaN%}.md{max-width:720px}.me{padding-bottom:205.55555555555554%}.mf{max-width:700px}.mg{padding-bottom:52.57142857142857%}.mh{max-width:943px}.mi{padding-bottom:123.54188759278898%}.mj{max-width:1322px}.mk{padding-bottom:62.934947049924354%}.ml{font-weight:700}.mm{max-width:781px}.mn{padding-bottom:92.06145966709346%}.mo{max-width:994px}.mp{padding-bottom:110.261569416499%}.mq{max-width:1041px}.mr{padding-bottom:105.8597502401537%}.ms{padding-bottom:56.8125%}.mt{padding-bottom:86.5%}.mu{box-shadow:inset 3px 0 0 0 rgba(41, 41, 41, 1)}.mv{padding-left:23px}.mw{margin-left:-20px}.mx{will-change:opacity}.my{position:fixed}.mz{width:188px}.na{left:50%}.nb{transform:translateX(406px)}.nc{top:calc(65px + 54px + 14px)}.nf{top:159px}.nh{width:131px}.ni{flex-direction:column}.nj{font-size:16px}.nk{padding-bottom:28px}.nl{border-bottom:1px solid rgba(230, 230, 230, 1)}.nm{padding-bottom:20px}.nn{padding-top:2px}.no{max-height:120px}.np{-webkit-line-clamp:6}.nq{padding:7px 16px 9px}.nr{flex-direction:row}.ns{padding-top:28px}.nt{margin-bottom:19px}.nu{margin-left:-3px}.oa{outline:0}.ob{border:0}.oc{user-select:none}.od{cursor:pointer}.oe> svg{pointer-events:none}.og{-webkit-user-select:none}.oq button{text-align:left}.or{opacity:0.4}.os{cursor:not-allowed}.ot{padding-right:9px}.pc{margin-top:40px}.pd{flex-wrap:wrap}.pe{margin-top:25px}.pf{margin-bottom:8px}.pg{line-height:22px}.ph{border-radius:3px}.pi{padding:5px 10px}.pj{background:rgba(242, 242, 242, 1)}.pk{max-width:155px}.po{top:1px}.qc{margin-left:-1px}.qd{margin-left:-4px}.ql{padding-right:8px}.qm{padding-top:32px}.qn{border-top:1px solid rgba(230, 230, 230, 1)}.qo{margin-bottom:25px}.qq{margin-bottom:32px}.qr{min-height:80px}.qw{width:80px}.qx{padding-left:102px}.qz{line-height:18px}.ra{letter-spacing:0.077em}.rb{margin-bottom:6px}.rc{font-size:22px}.rd{line-height:28px}.re{padding:4px 12px 6px}.rf{max-width:555px}.rg{max-width:450px}.rh{line-height:24px}.ri{display:none}.rk{max-width:550px}.rl{padding-top:24px}.rm{margin-top:5px}.rn{height:40px}.ro{width:40px}.rp{font-size:12px}.rq{line-height:16px}.rr{letter-spacing:0.083em}.rs{padding-top:8px}.rt{margin-bottom:40px}.ru{margin-top:24px}.rv{padding-bottom:16px}.rw{margin-bottom:24px}.ti{flex-grow:0}.tj{padding-bottom:24px}.tn{padding-bottom:8px}.ua{padding-bottom:100%}.ul{padding:60px 0}.um{background-color:rgba(0, 0, 0, 0.9)}.uo{padding-bottom:48px}.up{border-bottom:1px solid rgba(255, 255, 255, 0.54)}.uq{margin:0 -12px}.ur{margin:0 12px}.us{flex:1 1 0}.uv:disabled{color:rgba(255, 255, 255, 0.7)}.uw:disabled{fill:rgba(255, 255, 255, 0.7)}.ux{font-size:20px}.uy{color:rgba(255, 255, 255, 0.98)}.uz{color:rgba(255, 255, 255, 0.7)}.va{height:22px}.vb{width:200px}.vh{margin-right:16px}.bb:hover{cursor:pointer}.bc:hover{color:rgba(68, 119, 175, 1)}.bd:hover{fill:rgba(68, 119, 175, 1)}.cn:hover{color:rgba(237, 249, 255, 1)}.co:hover{fill:rgba(237, 249, 255, 1)}.fw:hover{text-decoration:underline}.gf:hover{background:rgba(68, 119, 175, 1)}.gg:hover{border-color:rgba(68, 119, 175, 1)}.gz:hover{color:rgba(25, 25, 25, 1)}.ha:hover{fill:rgba(25, 25, 25, 1)}.oi:hover{fill:rgba(117, 117, 117, 1)}.ut:hover{color:rgba(255, 255, 255, 0.99)}.uu:hover{fill:rgba(255, 255, 255, 0.99)}.ka:focus{transform:scale(1.01)}.oh:focus{fill:rgba(117, 117, 117, 1)}.of:active{border-style:none}</style><style type="text/css" data-fela-rehydration="579" data-fela-type="RULE" media="all and (min-width: 1080px)">.d{display:none}.ag{margin:0 64px}.eg{font-size:48px}.eh{margin-top:0.55em}.ei{line-height:60px}.ej{letter-spacing:-0.011em}.ez{font-size:22px}.fa{margin-top:0.92em}.fb{line-height:28px}.gx{margin-left:30px}.hv{font-size:21px}.hw{margin-top:2em}.hx{line-height:32px}.hy{letter-spacing:-0.003em}.is{font-size:30px}.it{margin-top:1.95em}.iu{line-height:36px}.iv{letter-spacing:0}.jb{margin-top:0.86em}.jj{margin-top:1.05em}.ju{margin-top:56px}.kt{max-width:1192px}.nz{margin-right:5px}.op{margin-top:5px}.pb{padding-left:6px}.pq{display:inline-block}.pv{margin-left:7px}.pw{margin-top:8px}.qb{width:25px}.qj{padding-left:7px}.qk{top:3px}.sn{width:calc(100% + 32px)}.so{margin-left:-16px}.sp{margin-right:-16px}.te{padding-left:16px}.tf{padding-right:16px}.tg{flex-basis:25%}.th{max-width:25%}.tw{font-size:16px}.tx{line-height:20px}.uj{min-width:70px}.uk{min-height:70px}</style><style type="text/css" data-fela-rehydration="579" data-fela-type="RULE" media="all and (max-width: 1079.98px)">.e{display:none}.gw{margin-left:30px}.la{margin-left:auto}.lb{text-align:center}.lo{float:none}.lp{margin-left:0}.lq{margin-right:0}.lr{width:100%}.ny{margin-right:5px}.oo{margin-top:5px}.pa{padding-left:6px}.pp{display:inline-block}.pt{margin-left:7px}.pu{margin-top:8px}.qa{width:25px}.qh{padding-left:7px}.qi{top:3px}</style><style type="text/css" data-fela-rehydration="579" data-fela-type="RULE" media="all and (max-width: 903.98px)">.f{display:none}.gv{margin-left:30px}.nx{margin-right:5px}.on{margin-top:5px}.oy{padding-left:6px}.oz{top:3px}.pn{display:inline-block}.pr{margin-left:7px}.ps{margin-top:8px}.pz{width:15px}.qg{padding-left:3px}.tm{margin-right:16px}</style><style type="text/css" data-fela-rehydration="579" data-fela-type="RULE" media="all and (max-width: 727.98px)">.g{display:none}.al{height:56px}.am{display:flex}.bj{display:block}.cu{margin-bottom:0px}.cv{height:110px}.fh{margin-top:32px}.fi{flex-direction:column-reverse}.gt{margin-bottom:30px}.gu{margin-left:0px}.nw{margin-left:8px}.ol{margin-top:2px}.om{margin-right:8px}.ow{padding-left:6px}.ox{top:3px}.pm{display:inline-block}.py{width:15px}.qf{padding-left:3px}.qp{padding-top:0}.qs{margin-bottom:24px}.qt{align-items:center}.qu{width:102px}.qv{position:relative}.qy{padding-left:0}.rj{margin-top:24px}.rx{padding-bottom:12px}.ry{margin-top:16px}.tl{margin-right:16px}.ty{margin-left:16px}.tz{margin-right:0px}.un{padding:32px 0}.vc{width:140px}.vd{margin-bottom:16px}.ve{margin-top:30px}.vf{width:100%}.vg{flex-direction:row}</style><style type="text/css" data-fela-rehydration="579" data-fela-type="RULE" media="all and (max-width: 551.98px)">.h{display:none}.ab{margin:0 24px}.dq{font-size:34px}.dr{margin-top:0.56em}.ds{line-height:42px}.dt{letter-spacing:-0.016em}.en{font-size:18px}.eo{margin-top:0.79em}.ep{line-height:24px}.fg{margin-top:32px}.fp{margin-bottom:0px}.gr{margin-bottom:30px}.gs{margin-left:0px}.hh{margin-top:1.56em}.hi{line-height:28px}.hj{letter-spacing:-0.003em}.ie{font-size:22px}.if{margin-top:1.2em}.ig{letter-spacing:0}.ix{margin-top:0.67em}.jf{margin-top:1.34em}.jq{margin-top:40px}.km{margin:0}.kn{max-width:100%}.nv{margin-left:8px}.oj{margin-top:2px}.ok{margin-right:8px}.ou{padding-left:6px}.ov{top:3px}.pl{display:inline-block}.px{width:15px}.qe{padding-left:3px}.rz{font-size:20px}.sb{width:calc(100% + 24px)}.sc{margin-left:-12px}.sd{margin-right:-12px}.sq{padding-left:12px}.sr{padding-right:12px}.ss{flex-basis:100%}.tk{margin-right:16px}.to{font-size:16px}.tp{line-height:20px}.ub{min-width:48px}.uc{min-height:48px}</style><style type="text/css" data-fela-rehydration="579" data-fela-type="RULE" media="all and (min-width: 904px) and (max-width: 1079.98px)">.i{display:none}.af{margin:0 64px}.ec{font-size:48px}.ed{margin-top:0.55em}.ee{line-height:60px}.ef{letter-spacing:-0.011em}.ew{font-size:22px}.ex{margin-top:0.92em}.ey{line-height:28px}.hr{font-size:21px}.hs{margin-top:2em}.ht{line-height:32px}.hu{letter-spacing:-0.003em}.io{font-size:30px}.ip{margin-top:1.95em}.iq{line-height:36px}.ir{letter-spacing:0}.ja{margin-top:0.86em}.ji{margin-top:1.05em}.jt{margin-top:56px}.ks{max-width:1192px}.sk{width:calc(100% + 32px)}.sl{margin-left:-16px}.sm{margin-right:-16px}.ta{padding-left:16px}.tb{padding-right:16px}.tc{flex-basis:25%}.td{max-width:25%}.tu{font-size:16px}.tv{line-height:20px}.uh{min-width:70px}.ui{min-height:70px}</style><style type="text/css" data-fela-rehydration="579" data-fela-type="RULE" media="all and (min-width: 728px) and (max-width: 903.98px)">.j{display:none}.ae{margin:0 48px}.dy{font-size:48px}.dz{margin-top:0.55em}.ea{line-height:60px}.eb{letter-spacing:-0.011em}.et{font-size:22px}.eu{margin-top:0.92em}.ev{line-height:28px}.hn{font-size:21px}.ho{margin-top:2em}.hp{line-height:32px}.hq{letter-spacing:-0.003em}.ik{font-size:30px}.il{margin-top:1.95em}.im{line-height:36px}.in{letter-spacing:0}.iz{margin-top:0.86em}.jh{margin-top:1.05em}.js{margin-top:56px}.kq{margin:0}.kr{max-width:100%}.sh{width:calc(100% + 28px)}.si{margin-left:-14px}.sj{margin-right:-14px}.sw{padding-left:14px}.sx{padding-right:14px}.sy{flex-basis:50%}.sz{max-width:50%}.ts{font-size:16px}.tt{line-height:20px}.uf{min-width:48px}.ug{min-height:48px}</style><style type="text/css" data-fela-rehydration="579" data-fela-type="RULE" media="all and (min-width: 552px) and (max-width: 727.98px)">.k{display:none}.ac{margin:0 24px}.du{font-size:34px}.dv{margin-top:0.56em}.dw{line-height:42px}.dx{letter-spacing:-0.016em}.eq{font-size:18px}.er{margin-top:0.79em}.es{line-height:24px}.hk{margin-top:1.56em}.hl{line-height:28px}.hm{letter-spacing:-0.003em}.ih{font-size:22px}.ii{margin-top:1.2em}.ij{letter-spacing:0}.iy{margin-top:0.67em}.jg{margin-top:1.34em}.jr{margin-top:40px}.ko{margin:0}.kp{max-width:100%}.sa{font-size:20px}.se{width:calc(100% + 24px)}.sf{margin-left:-12px}.sg{margin-right:-12px}.st{padding-left:12px}.su{padding-right:12px}.sv{flex-basis:100%}.tq{font-size:16px}.tr{line-height:20px}.ud{min-width:48px}.ue{min-height:48px}</style><style type="text/css" data-fela-rehydration="579" data-fela-type="RULE" media="print">.z{display:none}</style><style type="text/css" data-fela-rehydration="579" data-fela-type="RULE" media="(orientation: landscape) and (max-width: 903.98px)">.fv{max-height:none}</style><style type="text/css" data-fela-rehydration="579" data-fela-type="RULE" media="(prefers-reduced-motion: no-preference)">.jw{transition:transform 300ms cubic-bezier(0.2, 0, 0.2, 1)}.nd{transition:opacity 200ms}</style><style type="text/css" data-fela-rehydration="579" data-fela-type="RULE" media="all and (max-width: 1230px)">.ne{display:none}</style><style type="text/css" data-fela-rehydration="579" data-fela-type="RULE" media="all and (max-width: 1198px)">.ng{display:none}</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><script>if (window.self !== window.top) window.location = "about:blank"</script></div><script>window.PARSELY = window.PARSELY || {autotrack: false}</script><div class="s"><nav class="s t u v w c x y z"><div><div class="s c"><div class="n p"><div class="ab ac ae af ag ah ai aj"><div class="ak n o al am"><div class="n o an x"><a rel="noopener" href="/web/20210217042021/https://medium.com/?source=post_page-----44f146009e5f--------------------------------"><svg viewbox="0 0 1043.63 592.71" class="q ao"><g data-name="Layer 2"><g data-name="Layer 1"><path d="M588.67 296.36c0 163.67-131.78 296.35-294.33 296.35S0 460 0 296.36 131.78 0 294.34 0s294.33 132.69 294.33 296.36M911.56 296.36c0 154.06-65.89 279-147.17 279s-147.17-124.94-147.17-279 65.88-279 147.16-279 147.17 124.9 147.17 279M1043.63 296.36c0 138-23.17 249.94-51.76 249.94s-51.75-111.91-51.75-249.94 23.17-249.94 51.75-249.94 51.76 111.9 51.76 249.94"></path></g></g></svg></a></div><div class="s ap x"><div class="n o"><div class="n o g"><div class="aq" id="lo-post-page-navbar-sign-in-link"><div class="ar s"><span><a href="https://web.archive.org/web/20210217042021/https://medium.com/m/signin?operation=login&redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fannouncing-flutter-1-22-44f146009e5f&source=post_page-----44f146009e5f---------------------nav_reg-----------" class="as at au av aw ax ay az ba bb bc bd be bf bg" rel="noopener">Sign in</a></span></div></div></div></div></div></div></div></div></div><div class="bh s bi bj"><div class="n p"><div class="ab ac ae af ag ah ai aj"><div class="bk bl n o"><div class="bm s ap"><a href="/web/20210217042021/https://medium.com/flutter?source=post_page-----44f146009e5f--------------------------------" rel="noopener"><div class="bn bo s"><img alt="Flutter" class="" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/276/1*KvnfbD1F5CzEsU9wSmRZyA.png" width="138" height="36"/></div></a></div><div class="bp s bq"><ul class="br ba bs bt bu n bv g bw bx by"><li class="n o bz ca cb cc"><span class="cf b cg ch ci cj ck"><a href="https://web.archive.org/web/20210217042021/https://medium.com/flutter/tagged/announcements?source=post_page-----44f146009e5f--------------------------------" class="cl cm au av aw ax ay az ba bb cn co be cp cq" rel="noopener">Announcements</a></span></li><li class="n o bz ca cb cc"><span class="cf b cg ch ci cj ck"><a href="https://web.archive.org/web/20210217042021/https://medium.com/flutter/tagged/performance?source=post_page-----44f146009e5f--------------------------------" class="cl cm au av aw ax ay az ba bb cn co be cp cq" rel="noopener">Performance</a></span></li><li class="n o bz ca cb cc"><span class="cf b cg ch ci cj ck"><a href="https://web.archive.org/web/20210217042021/https://medium.com/flutter/tagged/material-design?source=post_page-----44f146009e5f--------------------------------" class="cl cm au av aw ax ay az ba bb cn co be cp cq" rel="noopener">Material Design</a></span></li><li class="n o bz ca cb cc"><span class="cf b cg ch ci cj ck"><a href="https://web.archive.org/web/20210217042021/https://medium.com/flutter/tagged/web-development?source=post_page-----44f146009e5f--------------------------------" class="cl cm au av aw ax ay az ba bb cn co be cp cq" rel="noopener">Web Development</a></span></li><span class="bz cd ce"></span><li class="n o bz ca cb cc"><span class="cf b cg ch ci cj ck"><a href="https://web.archive.org/web/20210217042021/https://flutter.dev/?source=post_page-----44f146009e5f--------------------------------" class="cl cm au av aw ax ay az ba bb cn co be cp cq" rel="noopener nofollow">flutter.dev</a></span></li></ul></div></div></div></div></div></div></nav><div class="cr cs ct s cu cv"></div><article><section class="cw cx cy cz aj da db s"></section><span class="s"></span><div><div class="t v dc dd de df"></div><section class="dg dh di dj dk"><div class="n p"><div class="ab ac ae af ag dl ai aj"><div class=""><h1 id="3f9d" class="dm dn do dp b dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el">Announcing Flutter 1.22</h1></div><div class=""><h2 id="22a8" class="em dn do cf b en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd">Supporting iOS 14 and Android 11, new i18n and l10n support, Google Maps and WebView plugins ready for production, a new App Size tool and much more!</h2><div class="fe"><div class="n ff fg fh fi"><div class="o n"><div><a rel="noopener" href="/web/20210217042021/https://medium.com/@csells_18027?source=post_page-----44f146009e5f--------------------------------"><img alt="Chris Sells" class="s fj fk fl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/96/96/0*6LK838dGSbGJRtat" width="48" height="48"/></a></div><div class="fm aj s"><div class="n"><div style="flex:1"><span class="cf b fn ch el"><div class="fo n o fp"><span class="cf b fn ch bl fq fr fs ft fu fv el"><a class="cl cm au av aw ax ay az ba bb fw be fx fy" rel="noopener" href="/web/20210217042021/https://medium.com/@csells_18027?source=post_page-----44f146009e5f--------------------------------">Chris Sells</a></span><div class="fz s ap h"><span><button class="cf b cg ch ga gb gc gd ge gf gg bb gh gi gj gk gl gm gn db go gp">Follow</button></span></div></div></span></div></div><span class="cf b fn ch fd"><span class="cf b fn ch bl fq fr fs ft fu fv fd"><div><a class="cl cm au av aw ax ay az ba bb fw be fx fy" rel="noopener" href="/web/20210217042021/https://medium.com/flutter/announcing-flutter-1-22-44f146009e5f?source=post_page-----44f146009e5f--------------------------------">Oct 1, 2020</a> <!-- -->·<!-- --> <!-- -->17<!-- --> min read</div></span></span></div></div><div class="n gq gr gs gt gu gv gw gx z"><div class="n o"><div class="gy s ap"><button class="cl cm au av aw ax ay az ba bb gz ha be fx fy" aria-label="Share on twitter"><svg width="29" height="29" class="hb"><path d="M22.05 7.54a4.47 4.47 0 0 0-3.3-1.46 4.53 4.53 0 0 0-4.53 4.53c0 .35.04.7.08 1.05A12.9 12.9 0 0 1 5 6.89a5.1 5.1 0 0 0-.65 2.26c.03 1.6.83 2.99 2.02 3.79a4.3 4.3 0 0 1-2.02-.57v.08a4.55 4.55 0 0 0 3.63 4.44c-.4.08-.8.13-1.21.16l-.81-.08a4.54 4.54 0 0 0 4.2 3.15 9.56 9.56 0 0 1-5.66 1.94l-1.05-.08c2 1.27 4.38 2.02 6.94 2.02 8.3 0 12.86-6.9 12.84-12.85.02-.24 0-.43 0-.65a8.68 8.68 0 0 0 2.26-2.34c-.82.38-1.7.62-2.6.72a4.37 4.37 0 0 0 1.95-2.51c-.84.53-1.81.9-2.83 1.13z"></path></svg></button></div><div class="gy s ap"><button class="cl cm au av aw ax ay az ba bb gz ha be fx fy" aria-label="Share on linkedin"><svg width="29" height="29" viewbox="0 0 29 29" fill="none" class="hb"><path d="M5 6.36C5 5.61 5.63 5 6.4 5h16.2c.77 0 1.4.61 1.4 1.36v16.28c0 .75-.63 1.36-1.4 1.36H6.4c-.77 0-1.4-.6-1.4-1.36V6.36z"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M10.76 20.9v-8.57H7.89v8.58h2.87zm-1.44-9.75c1 0 1.63-.65 1.63-1.48-.02-.84-.62-1.48-1.6-1.48-.99 0-1.63.64-1.63 1.48 0 .83.62 1.48 1.59 1.48h.01zM12.35 20.9h2.87v-4.79c0-.25.02-.5.1-.7.2-.5.67-1.04 1.46-1.04 1.04 0 1.46.8 1.46 1.95v4.59h2.87v-4.92c0-2.64-1.42-3.87-3.3-3.87-1.55 0-2.23.86-2.61 1.45h.02v-1.24h-2.87c.04.8 0 8.58 0 8.58z" fill="#fff"></path></svg></button></div><div class="gy s ap"><button class="cl cm au av aw ax ay az ba bb gz ha be fx fy" aria-label="Share on facebook"><svg width="29" height="29" class="hb"><path d="M23.2 5H5.8a.8.8 0 0 0-.8.8V23.2c0 .44.35.8.8.8h9.3v-7.13h-2.38V13.9h2.38v-2.38c0-2.45 1.55-3.66 3.74-3.66 1.05 0 1.95.08 2.2.11v2.57h-1.5c-1.2 0-1.48.57-1.48 1.4v1.96h2.97l-.6 2.97h-2.37l.05 7.12h5.1a.8.8 0 0 0 .79-.8V5.8a.8.8 0 0 0-.8-.79"></path></svg></button></div><div class="hc s"><div class="hb"><span><a href="https://web.archive.org/web/20210217042021/https://medium.com/m/signin?actionUrl=%2F_%2Fbookmark%2Fp%2F44f146009e5f&operation=register&redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fannouncing-flutter-1-22-44f146009e5f&source=post_actions_header--------------------------bookmark_preview-----------" class="cl cm au av aw ax ay az ba bb gz ha be fx fy" rel="noopener"><svg width="25" height="25" viewbox="0 0 25 25"><path d="M19 6a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v14.66h.01c.01.1.05.2.12.28a.5.5 0 0 0 .7.03l5.67-4.12 5.66 4.13a.5.5 0 0 0 .71-.03.5.5 0 0 0 .12-.29H19V6zm-6.84 9.97L7 19.64V6a1 1 0 0 1 1-1h9a1 1 0 0 1 1 1v13.64l-5.16-3.67a.49.49 0 0 0-.68 0z" fill-rule="evenodd"></path></svg></a></span></div></div><div class="hd s an"></div></div></div></div></div></div><p id="b579" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">We’re delighted to introduce our latest release of Flutter, with extensive support for iOS 14 and Android 11. Flutter 1.22 builds on the foundation set by previous releases by enabling developers to build fast, beautiful user experiences for multiple platforms from a single codebase. Our quarterly stable releases package the latest features, performance improvements, and bug fixes, and are suitable for broad production use.</p><p id="4a73" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">Since this is the season for new mobile OS versions, this release focuses on ensuring that Android 11 and iOS 14 work great with Flutter. Updates for both of these OSes include a lot of under-the-hood work to conform to the latest SDKs and to make sure everything passes our extensive test suite. For iOS 14, this release includes support for the new Xcode 12, new icons, and preview support for the new iOS 14 App Clips feature. For Android 11, the update supports the new types of display cutouts as well as smoother animation when bringing up the soft keyboard.</p><p id="f804" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">This release comes two months after our 1.20 release, so it was shorter than most. Even in that short time, we closed 3,024 issues and merged 1,944 PRs from 197 contributors. Of those contributors, 114 (58%) of them were from the community-at-large and they contributed 271 PRs. The largest single contributor was <a href="https://web.archive.org/web/20210217042021/https://github.com/a14n" class="cl ia" rel="noopener nofollow">a14n</a>, who makes our top contributor list again with 20 PRs, most of which were done as part of the work to support null safety in Flutter (more on that coming soon).</p><p id="ca54" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">In addition to the support for the new mobile OS versions, there’s quite a bit more news to share, including a preview of one of the top-requested features for Android: state restoration, a new “universe” of Material buttons, new international and localization support that works with hot reload, a new Navigator, a stable release for Platform Views (the foundation for the Google Maps and WebView plugins), and a switch you can throw in your code to improve scrolling on devices with high frequency displays. We’ve also got a new tool for dissecting app size and for ensuring that the plugins that you’re building support only the platforms that you want to support.</p><h1 id="4045" class="ib ic do cf id ie if hi ig ih ii hl ij ik il im in io ip iq ir is it iu iv iw el">Targeting iOS 14</h1><p id="538e" class="he hf do hg b en ix hi hj eq iy hl hm hn iz hp hq hr ja ht hu hv jb hx hy hz dg el">Whenever a new version of a mobile OS is announced, we test it thoroughly, looking for incompatibilities or changes that affect Flutter and its tools.</p><p id="63ea" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">In the case of iOS 14, we made quite a few changes to Flutter to ensure that it works the way developers want:</p><ul class=""><li id="b765" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz jc jd je el">Xcode 12 requires iOS 9.0 or up, so our default template increases its default from 8.0 to 9.0</li><li id="7a1f" class="he hf do hg b en jf hi hj eq jg hl hm hn jh hp hq hr ji ht hu hv jj hx hy hz jc jd je el">iOS 14 specific crashes and font rendering issues were fixed in Flutter 1.22</li><li id="9f17" class="he hf do hg b en jf hi hj eq jg hl hm hn jh hp hq hr ji ht hu hv jj hx hy hz jc jd je el">Problems deploying to physical devices were fixed as of Flutter 1.20.4</li><li id="8160" class="he hf do hg b en jf hi hj eq jg hl hm hn jh hp hq hr ji ht hu hv jj hx hy hz jc jd je el">A new policy that shows uses notifications when apps access their clipboard caused spurious notifications in Flutter apps, and was fixed as of Flutter 1.20.4</li><li id="9710" class="he hf do hg b en jf hi hj eq jg hl hm hn jh hp hq hr ji ht hu hv jj hx hy hz jc jd je el">A restriction disables running debug apps on iOS 14 devices except as part of the debugging process</li><li id="fb9b" class="he hf do hg b en jf hi hj eq jg hl hm hn jh hp hq hr ji ht hu hv jj hx hy hz jc jd je el">A new policy around network security for locally debugged Flutter apps causes iOS 14 to show a one-time confirmation dialog (only during development, not for released Flutter apps)</li></ul><p id="04db" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">Bottom line: if you’re targeting iOS 14 with your Flutter app, we strongly encourage you to rebuild it with Flutter 1.22 and deploy it to the App Store now to ensure that your iOS 14 users have the best experience.</p><p id="53d5" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">For more details about targeting iOS 14 with Flutter, including some Add-to-App, deep linking, and notification considerations, refer to <a href="https://web.archive.org/web/20210217042021/https://flutter.dev/docs/development/ios-14" class="cl ia" rel="noopener nofollow">the iOS 14 documentation on flutter.dev</a>.</p><p id="832b" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">Hopefully, all of this work on the tooling and SDK support allows you to focus on the coding that you care about — taking advantage of new iOS 14 features.</p><p id="9942" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">One such feature is updated support for iOS’s new SF Symbols font, which inspired us to spend some time giving <a href="https://web.archive.org/web/20210217042021/https://pub.dev/packages/cupertino_icons" class="cl ia" rel="noopener nofollow">the </a><code class="jk jl jm jn jo b"><a href="https://web.archive.org/web/20210217042021/https://pub.dev/packages/cupertino_icons" class="cl ia" rel="noopener nofollow">cupertino_icon</a></code><a href="https://web.archive.org/web/20210217042021/https://pub.dev/packages/cupertino_icons" class="cl ia" rel="noopener nofollow"> package</a> a refresh. Existing uses of <code class="jk jl jm jn jo b">CupertinoIcons</code> will automatically map to the new style once you update your <code class="jk jl jm jn jo b">cupertino_icons</code> dependency to the new 1.0 major version. If you use <code class="jk jl jm jn jo b">cupertino_icons</code> 1.0 in conjunction with Flutter 1.22, you’ll also have access to ~900 new icons through the <code class="jk jl jm jn jo b"><a href="https://web.archive.org/web/20210217042021/https://api.flutter.dev/flutter/cupertino/CupertinoIcons-class.html" class="cl ia" rel="noopener nofollow">CupertinoIcons</a></code> API.</p><figure class="jq jr js jt ju jv cy cz paragraph-image"><div role="button" tabindex="0" class="jw jx jy jz aj ka"><div class="cy cz jp"><div class="kg s jy jk"><div class="kh ki s"><div class="kb kc t u v kd aj bl ke kf"><img alt="Image for post" class="t u v kd aj kj kk kl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/60/0*ZGKu3IhnPNp6fS_e?q=20" width="864" height="722"/></div><img alt="Image for post" class="kb kc t u v kd aj c" width="864" height="722"/><noscript><img alt="Image for post" class="t u v kd aj" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1728/0*ZGKu3IhnPNp6fS_e" width="864" height="722" srcset="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/552/0*ZGKu3IhnPNp6fS_e 276w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1104/0*ZGKu3IhnPNp6fS_e 552w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1280/0*ZGKu3IhnPNp6fS_e 640w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1400/0*ZGKu3IhnPNp6fS_e 700w" sizes="700px"/></noscript></div></div></div></div></figure><p id="e54d" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">You can see the complete list of icons on the <code class="jk jl jm jn jo b"><a href="https://web.archive.org/web/20210217042021/https://flutter.github.io/cupertino_icons/" class="cl ia" rel="noopener nofollow">cupertino_icons</a></code> preview page and <a href="https://web.archive.org/web/20210217042021/https://flutter.dev/docs/release/breaking-changes/cupertino-icons-1.0.0" class="cl ia" rel="noopener nofollow">a migration detail page on flutter.dev</a>.</p><p id="de2a" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">Another feature for you to try with Flutter on iOS 14 is <a href="https://web.archive.org/web/20210217042021/https://developer.apple.com/app-clips/" class="cl ia" rel="noopener nofollow">App Clips</a>, a new iOS 14 feature that supports quick, no-install app executions of lightweight versions of apps under 10MB. In Flutter version 1.22, we have a preview of App Clip targets built with Flutter.</p></div></div><div class="jv"><div class="n p"><div class="km kn ko kp kq kr af ks ag kt ai aj"><figure class="jq jr js jt ju jv kv kw paragraph-image"><div role="button" tabindex="0" class="jw jx jy jz aj ka"><div class="cy cz ku"><div class="kg s jy jk"><div class="kx ki s"><div class="kb kc t u v kd aj bl ke kf"><img alt="Image for post" class="t u v kd aj kj kk kl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/60/0*8MER4IM-IEt2ye2a?q=20" width="1600" height="1361"/></div><img alt="Image for post" class="kb kc t u v kd aj c" width="1600" height="1361"/><noscript><img alt="Image for post" class="t u v kd aj" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/3200/0*8MER4IM-IEt2ye2a" width="1600" height="1361" srcset="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/552/0*8MER4IM-IEt2ye2a 276w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1104/0*8MER4IM-IEt2ye2a 552w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1280/0*8MER4IM-IEt2ye2a 640w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1456/0*8MER4IM-IEt2ye2a 728w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1632/0*8MER4IM-IEt2ye2a 816w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1808/0*8MER4IM-IEt2ye2a 904w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1984/0*8MER4IM-IEt2ye2a 992w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/2000/0*8MER4IM-IEt2ye2a 1000w" sizes="1000px"/></noscript></div></div></div></div><figcaption class="ky kz da cy cz la lb cf b fn ch fd">A Flutter-powered App Clip experience</figcaption></figure></div></div></div><div class="n p"><div class="ab ac ae af ag dl ai aj"><p id="62d2" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">For more details on how to build App Clips with Flutter, check out <a href="https://web.archive.org/web/20210217042021/https://flutter.dev/docs/development/platform-integration/ios-app-clip" class="cl ia" rel="noopener nofollow">the docs on flutter.dev</a>. You could also consult this <a href="https://web.archive.org/web/20210217042021/https://github.com/flutter/samples/tree/master/ios_app_clip" class="cl ia" rel="noopener nofollow">simple sample project</a>.</p><h1 id="2609" class="ib ic do cf id ie if hi ig ih ii hl ij ik il im in io ip iq ir is it iu iv iw el">Android 11</h1><p id="b19f" class="he hf do hg b en ix hi hj eq iy hl hm hn iz hp hq hr ja ht hu hv jb hx hy hz dg el">This release of Flutter also coincides with the launch of Android 11 this month. The Flutter framework and engine have been updated to support two new features introduced in the latest version of Android.</p><p id="b76a" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">Firstly, Flutter now supports exposing the safe insets of Android notches, cutouts and edges of waterfall displays.</p></div></div><div class="jv"><div class="n p"><div class="km kn ko kp kq kr af ks ag kt ai aj"><figure class="jq jr js jt ju jv kv kw paragraph-image"><div role="button" tabindex="0" class="jw jx jy jz aj ka"><div class="cy cz ku"><div class="kg s jy jk"><div class="lc ki s"><div class="kb kc t u v kd aj bl ke kf"><img alt="Image for post" class="t u v kd aj kj kk kl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/60/0*lPO4ueKwxvV0QP_I?q=20" width="1600" height="1173"/></div><img alt="Image for post" class="kb kc t u v kd aj c" width="1600" height="1173"/><noscript><img alt="Image for post" class="t u v kd aj" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/3200/0*lPO4ueKwxvV0QP_I" width="1600" height="1173" srcset="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/552/0*lPO4ueKwxvV0QP_I 276w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1104/0*lPO4ueKwxvV0QP_I 552w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1280/0*lPO4ueKwxvV0QP_I 640w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1456/0*lPO4ueKwxvV0QP_I 728w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1632/0*lPO4ueKwxvV0QP_I 816w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1808/0*lPO4ueKwxvV0QP_I 904w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1984/0*lPO4ueKwxvV0QP_I 992w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/2000/0*lPO4ueKwxvV0QP_I 1000w" sizes="1000px"/></noscript></div></div></div></div></figure></div></div></div><div class="n p"><div class="ab ac ae af ag dl ai aj"><p id="adce" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">By using the <code class="jk jl jm jn jo b"><a href="https://web.archive.org/web/20210217042021/https://api.flutter.dev/flutter/widgets/MediaQuery-class.html" class="cl ia" rel="noopener nofollow">MediaQuery</a></code> and <code class="jk jl jm jn jo b"><a href="https://web.archive.org/web/20210217042021/https://api.flutter.dev/flutter/widgets/SafeArea-class.html" class="cl ia" rel="noopener nofollow">SafeArea</a></code> APIs, you can ensure that you’re placing active UI and interactive elements in the non-obstructed regions of the device’s display. Also, you’ll want to avoid gesture detectors in the waterfall edge area that may be prone to accidental touches.</p><p id="2564" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">Secondly, the animation is synchronized with Android 11 as it displays the software keyboard.</p><figure class="jq jr js jt ju jv cy cz paragraph-image"><div role="button" tabindex="0" class="jw jx jy jz aj ka"><div class="cy cz ld"><div class="kg s jy jk"><div class="le ki s"><div class="kb kc t u v kd aj bl ke kf"><img alt="Image for post" class="t u v kd aj kj kk kl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/58/0*DFRjYzbqIc5kOoDm?q=20" width="1190" height="1211"/></div><img alt="Image for post" class="kb kc t u v kd aj c" width="1190" height="1211"/><noscript><img alt="Image for post" class="t u v kd aj" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/2380/0*DFRjYzbqIc5kOoDm" width="1190" height="1211" srcset="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/552/0*DFRjYzbqIc5kOoDm 276w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1104/0*DFRjYzbqIc5kOoDm 552w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1280/0*DFRjYzbqIc5kOoDm 640w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1400/0*DFRjYzbqIc5kOoDm 700w" sizes="700px"/></noscript></div></div></div></div><figcaption class="ky kz da cy cz la lb cf b fn ch fd">See the position animation of the FAB</figcaption></figure><p id="87db" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">Issue <a href="https://web.archive.org/web/20210217042021/https://github.com/flutter/flutter/issues/19279" class="cl ia" rel="noopener nofollow">#19279</a> has been a long-standing problem where the system keyboard show/hide animation isn’t synchronized with Flutter’s inset. This is fixed for Android 11.</p><p id="b88c" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">One note about the Android embedding API. With Flutter version 1.12 last year, we rolled out a new set of Flutter engine and Flutter plugin APIs for Android. We created these v2 APIs to better support our add-to-app users on Android. A year later, over 80% of our Android plugins use the new Android APIs. Starting in 1.22, we’re deprecating the older v1 APIs.</p><p id="ee2f" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">If you’re still using the Android v1 API, here’s what this means for you:</p><ul class=""><li id="2d2c" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz jc jd je el">Newly created plugins will no longer target the v1 APIs</li><li id="3213" class="he hf do hg b en jf hi hj eq jg hl hm hn jh hp hq hr ji ht hu hv jj hx hy hz jc jd je el">The Flutter tool’s <code class="jk jl jm jn jo b">—no-enable-android-embedding-v2</code> config flag has been removed and is now the default behavior</li><li id="6f77" class="he hf do hg b en jf hi hj eq jg hl hm hn jh hp hq hr ji ht hu hv jj hx hy hz jc jd je el">Older applications still using the v1 APIs will show a deprecation warning during build that points to the <a href="https://web.archive.org/web/20210217042021/https://flutter.dev/docs/development/packages-and-plugins/plugin-api-migration" class="cl ia" rel="noopener nofollow">Supporting the new Android plugins APIs</a> docs</li></ul><p id="0998" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">Meanwhile, if you still have a Flutter application based on v1 Android APIs, it will continue to work. However, you may start to encounter new plugins that only target the v2 API and that can’t be consumed by v1 Android APIs. For more details, see <a href="https://web.archive.org/web/20210217042021/https://flutter.dev/docs/release/breaking-changes/android-v1-embedding-create-deprecation" class="cl ia" rel="noopener nofollow">the breaking change documentation</a>.</p><h1 id="1643" class="ib ic do cf id ie if hi ig ih ii hl ij ik il im in io ip iq ir is it iu iv iw el">Expanding the Button “universe”</h1><figure class="jq jr js jt ju jv lg lh gn li lj lk ll lm az ln lo lp lq lr ls paragraph-image"><div role="button" tabindex="0" class="jw jx jy jz aj ka"><div class="cy cz lf"><div class="kg s jy jk"><div class="lt ki s"><div class="kb kc t u v kd aj bl ke kf"><img alt="Image for post" class="t u v kd aj kj kk kl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/40/1*crNLxg7CCtlQkB4mLI_ErA.png?q=20" width="910" height="1368"/></div><img alt="Image for post" class="kb kc t u v kd aj c" width="910" height="1368"/><noscript><img alt="Image for post" class="t u v kd aj" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1820/1*crNLxg7CCtlQkB4mLI_ErA.png" width="910" height="1368" srcset="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/552/1*crNLxg7CCtlQkB4mLI_ErA.png 276w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1000/1*crNLxg7CCtlQkB4mLI_ErA.png 500w" sizes="500px"/></noscript></div></div></div></div><figcaption class="ky kz da cy cz la lb cf b fn ch fd">A new universe of Material Design buttons</figcaption></figure><p id="400c" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">Existing Flutter buttons look good but can be <a href="https://web.archive.org/web/20210217042021/http://flutter.dev/go/material-button-system-updates" class="cl ia" rel="noopener nofollow">hard to use</a>, especially when you need custom theming. Furthermore, the Material specification has expanded to include new buttons with new styles.</p><p id="e520" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">To keep Flutter up to date with Material guidelines, we’re happy to announce a whole new “universe” of buttons in Flutter 1.22.</p><p id="f9f0" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">Rather than try and evolve the existing button classes and their theme in-place, <a href="https://web.archive.org/web/20210217042021/https://github.com/flutter/flutter/pull/59702" class="cl ia" rel="noopener nofollow">this PR</a> introduces new, replacement button widgets and themes. In addition to freeing us from the backwards compatibility labyrinth that evolving the existing classes would entail, the new names sync Flutter with the <a href="https://web.archive.org/web/20210217042021/https://material.io/components/buttons/" class="cl ia" rel="noopener nofollow">Material Design spec</a>, which uses the new names for the button components.</p><figure class="jq jr js jt ju jv cy cz paragraph-image"><div role="button" tabindex="0" class="jw jx jy jz aj ka"><div class="cy cz lu"><div class="kg s jy jk"><div class="lv ki s"><div class="kb kc t u v kd aj bl ke kf"><img alt="Image for post" class="t u v kd aj kj kk kl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/60/1*di6uPEKEsRHoFtRryHeWPg.png?q=20" width="1220" height="282"/></div><img alt="Image for post" class="kb kc t u v kd aj c" width="1220" height="282"/><noscript><img alt="Image for post" class="t u v kd aj" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/2440/1*di6uPEKEsRHoFtRryHeWPg.png" width="1220" height="282" srcset="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/552/1*di6uPEKEsRHoFtRryHeWPg.png 276w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1104/1*di6uPEKEsRHoFtRryHeWPg.png 552w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1280/1*di6uPEKEsRHoFtRryHeWPg.png 640w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1400/1*di6uPEKEsRHoFtRryHeWPg.png 700w" sizes="700px"/></noscript></div></div></div></div></figure><p id="e70c" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">The new themes follow the “normalized” pattern that Flutter has recently adopted for new Material widgets. If you’d like to play with a demo, there’s <a href="https://web.archive.org/web/20210217042021/https://dartpad.dev/e560e1c2e4455ad53aac245079ccdcf2" class="cl ia" rel="noopener nofollow">a great one here on DartPad</a>. This is not a breaking change as the semantics of <code class="jk jl jm jn jo b">FlatButton</code>, <code class="jk jl jm jn jo b">OutlineButton</code>, <code class="jk jl jm jn jo b">RaisedButton</code>, <code class="jk jl jm jn jo b">ButtonBar</code>, <code class="jk jl jm jn jo b">ButtonBarTheme</code>, and <code class="jk jl jm jn jo b">ButtonTheme</code> won’t change. You can mix and match the old buttons with the new. as you prefer.</p><h1 id="f2cb" class="ib ic do cf id ie if hi ig ih ii hl ij ik il im in io ip iq ir is it iu iv iw el">New internationalization and localization support</h1><p id="3faa" class="he hf do hg b en ix hi hj eq iy hl hm hn iz hp hq hr ja ht hu hv jb hx hy hz dg el">Flutter has provided the core functionality you need for the internationalization (i18n) and localization (l10n) of your apps since Flutter’s inception. However, with this release, we’ve baked our opinions of best practices into our tools, even enabling hot reload support to update your app as you add new l10n information.</p><figure class="jq jr js jt ju jv cy cz paragraph-image"><div class="cy cz lw"><div class="kg s jy jk"><div class="lx ki s"><div class="kb kc t u v kd aj bl ke kf"><img alt="Image for post" class="t u v kd aj kj kk kl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/60/0*UBVlGmhw5NUWbg5I?q=20" width="600" height="431"/></div><img alt="Image for post" class="kb kc t u v kd aj c" width="600" height="431"/><noscript><img alt="Image for post" class="t u v kd aj" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1200/0*UBVlGmhw5NUWbg5I" width="600" height="431" srcset="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/552/0*UBVlGmhw5NUWbg5I 276w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1104/0*UBVlGmhw5NUWbg5I 552w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1200/0*UBVlGmhw5NUWbg5I 600w" sizes="600px"/></noscript></div></div></div></figure><p id="658c" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">If you’d like more details about Flutter’s support for l10n, including localized messages, messages with parameters, dates, numbers, and currencies, <a href="https://web.archive.org/web/20210217042021/http://flutter.dev/go/i18n-user-guide" class="cl ia" rel="noopener nofollow">read the Flutter Internationalization User Guide</a>.</p><p id="bc58" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">Furthermore, if you’re interested in i18n and l10n, then you’re probably also interested in strings with characters that don’t fit into plain old ASCII, like Unicode and emoji. Recently, the Dart team released <a href="https://web.archive.org/web/20210217042021/https://pub.dev/packages/characters" class="cl ia" rel="noopener nofollow">the </a><code class="jk jl jm jn jo b"><a href="https://web.archive.org/web/20210217042021/https://pub.dev/packages/characters" class="cl ia" rel="noopener nofollow">characters</a></code><a href="https://web.archive.org/web/20210217042021/https://pub.dev/packages/characters" class="cl ia" rel="noopener nofollow"> package</a>, which helps developers deal with Unicode (extended) grapheme clusters. This package helps solve problems like how to properly abbreviate a string like “A 🇬🇧 text in English” to the first 15 characters. Using the <code class="jk jl jm jn jo b">String</code> class, that abbreviation would be “A 🇬🇧 text in”, which is only 12 user-perceived characters. On the other hand, using the <code class="jk jl jm jn jo b">characters</code> package yields the correct abbreviation of “A 🇬🇧 text in Eng”.</p><p id="398d" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">With <a href="https://web.archive.org/web/20210217042021/https://github.com/flutter/flutter/pull/59267" class="cl ia" rel="noopener nofollow">this PR</a>, Flutter uses the characters package to properly handle these complex characters. For example, when using a <code class="jk jl jm jn jo b">TextField</code> with a <code class="jk jl jm jn jo b">maxLength</code> limit, characters like 👨👩👦 are now properly counted as a single character. Also, with <a href="https://web.archive.org/web/20210217042021/https://github.com/flutter/flutter/pull/59620" class="cl ia" rel="noopener nofollow">this PR</a>, the characters package is automatically available in projects wherever Flutter is, without needing to manually add it. Hopefully this makes it even easier to handle strings of all kinds from all locales. For more details about the characters package, check out the excellent article, <a class="cl ia" rel="noopener" href="/web/20210217042021/https://medium.com/dartlang/dart-string-manipulation-done-right-5abd0668ba3e">Dart string manipulation done right 👉</a>.</p><h1 id="fd27" class="ib ic do cf id ie if hi ig ih ii hl ij ik il im in io ip iq ir is it iu iv iw el">Google Maps and WebView plugins ready for production</h1><p id="e12e" class="he hf do hg b en ix hi hj eq iy hl hm hn iz hp hq hr ja ht hu hv jb hx hy hz dg el">Here on the Flutter team, we are often cautious about labeling something as “production ready” until we’ve tested it thoroughly ourselves. In the case of the <code class="jk jl jm jn jo b"><a href="https://web.archive.org/web/20210217042021/https://pub.dev/packages/google_maps_flutter" class="cl ia" rel="noopener nofollow">google_maps_flutter</a></code> and <code class="jk jl jm jn jo b"><a href="https://web.archive.org/web/20210217042021/https://pub.dev/packages/webview_flutter" class="cl ia" rel="noopener nofollow">webview_flutter</a></code> plugins, the gating factor has been the underlying <a href="https://web.archive.org/web/20210217042021/http://flutter.dev/docs/development/platform-integration/platform-views" class="cl ia" rel="noopener nofollow">Platform Views</a> implementation, which allows native UI components from both Android and iOS to be hosted in a Flutter app. With this release of Flutter, we’re happy to announce that we have hardened the framework plumbing enough to declare both of these plugins as production ready.</p><figure class="jq jr js jt ju jv cy cz paragraph-image"><div class="cy cz ly"><div class="kg s jy jk"><div class="lz ki s"><div class="kb kc t u v kd aj bl ke kf"><img alt="Image for post" class="t u v kd aj kj kk kl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/28/0*luz0EiazQQqsAEC4?q=20" width="500" height="1035"/></div><img alt="Image for post" class="kb kc t u v kd aj c" width="500" height="1035"/><noscript><img alt="Image for post" class="t u v kd aj" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1000/0*luz0EiazQQqsAEC4" width="500" height="1035" srcset="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/552/0*luz0EiazQQqsAEC4 276w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1000/0*luz0EiazQQqsAEC4 500w" sizes="500px"/></noscript></div></div></div><figcaption class="ky kz da cy cz la lb cf b fn ch fd">webview_flutter plugin hosting flutter.dev</figcaption></figure><p id="cd6a" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">In Flutter 1.22, we’ve added an alternative Platform Views implementation that fixes <a href="https://web.archive.org/web/20210217042021/https://github.com/flutter/flutter/issues/61133" class="cl ia" rel="noopener nofollow">all known keyboard, and accessibility issues for Android views</a>. Also, it works with Android API level 19 and above (it used to require level 20). We have also made threading improvements on iOS that make platform views more efficient and more robust (and no longer requires you to add the <code class="jk jl jm jn jo b">io.flutter.embedded_views_preview</code> flag to your iOS <code class="jk jl jm jn jo b">Info.plist</code>)<em class="ma">.</em></p><p id="043a" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">The <code class="jk jl jm jn jo b">webview_flutter</code> plugin supports the new Android Platform Views mode but currently it needs to be <a href="https://web.archive.org/web/20210217042021/https://github.com/flutter/plugins/blob/master/packages/webview_flutter/README.md#android" class="cl ia" rel="noopener nofollow">enabled manually</a>. We’ll enable it by default in future versions once it’s gotten more use in the wider community.</p><p id="5ef5" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">The Google Maps and WebView plugins already benefit from the improvements in Platform Views. If you’d like to use Platform Views to host your own native UI components on iOS or Android, you can learn how to do so on <a href="https://web.archive.org/web/20210217042021/https://flutter.dev/docs/development/platform-integration/platform-views" class="cl ia" rel="noopener nofollow">Hosting native Android and iOS views in your Flutter app with Platform Views</a>.</p><h1 id="19db" class="ib ic do cf id ie if hi ig ih ii hl ij ik il im in io ip iq ir is it iu iv iw el">Navigator 2.0</h1><p id="0ff6" class="he hf do hg b en ix hi hj eq iy hl hm hn iz hp hq hr ja ht hu hv jb hx hy hz dg el">If you’ve used <a href="https://web.archive.org/web/20210217042021/https://flutter.dev/docs/development/ui/navigation" class="cl ia" rel="noopener nofollow">navigation</a> in your Flutter apps before, you may have noticed that the core data structure, the stack of pages that your user is navigating through, is hidden from you. Instead, to manage it, you call <code class="jk jl jm jn jo b">Navigator.pop()</code><em class="ma"> </em>or <code class="jk jl jm jn jo b">Navigator.push()</code>. For example, let’s say that you wanted to show a list of widgets on your home page and allow the user to tap on one to get to a detail page dedicated to just that color.</p></div></div><div class="jv"><div class="n p"><div class="km kn ko kp kq kr af ks ag kt ai aj"><figure class="jq jr js jt ju jv kv kw paragraph-image"><div role="button" tabindex="0" class="jw jx jy jz aj ka"><div class="cy cz ku"><div class="kg s jy jk"><div class="mb ki s"><div class="kb kc t u v kd aj bl ke kf"><img alt="Image for post" class="t u v kd aj kj kk kl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/60/0*OVbaUaMkAXrpLQCy?q=20" width="1600" height="627"/></div><img alt="Image for post" class="kb kc t u v kd aj c" width="1600" height="627"/><noscript><img alt="Image for post" class="t u v kd aj" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/3200/0*OVbaUaMkAXrpLQCy" width="1600" height="627" srcset="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/552/0*OVbaUaMkAXrpLQCy 276w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1104/0*OVbaUaMkAXrpLQCy 552w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1280/0*OVbaUaMkAXrpLQCy 640w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1456/0*OVbaUaMkAXrpLQCy 728w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1632/0*OVbaUaMkAXrpLQCy 816w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1808/0*OVbaUaMkAXrpLQCy 904w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1984/0*OVbaUaMkAXrpLQCy 992w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/2000/0*OVbaUaMkAXrpLQCy 1000w" sizes="1000px"/></noscript></div></div></div></div></figure></div></div></div><div class="n p"><div class="ab ac ae af ag dl ai aj"><p id="d50a" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">The two screens could be implemented like so:</p><figure class="jq jr js jt ju jv"><div class="kg s jy"><div class="mc ki s"></div></div></figure><p id="a2e1" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">Using the simplest Navigator 1.0 style allows you to navigate between these two screens in a way that looks pretty easy:</p><figure class="jq jr js jt ju jv"><div class="kg s jy"><div class="mc ki s"></div></div></figure><p id="e1b9" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">The call to <code class="jk jl jm jn jo b">Navigator.push()</code> is all that’s needed to push another page on top of the first one, creating a stack of two pages. However, unlike the list of <code class="jk jl jm jn jo b">Containers</code> created in the build method of the <code class="jk jl jm jn jo b">ColorListScreen</code>, that stack is hidden from you. And because it’s hidden, it’s hard to manage for other scenarios, like handling deep linking with an initial route provided by a native embedding, for example, or a URL from the web or intent from Android. It’s also exceedingly difficult to manage nested routing between different arrangements of the same page.</p><p id="e2cb" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">Navigator 2.0 solves these problems and more by making the stack of pages visible. Here’s an updated example of navigating between the same <code class="jk jl jm jn jo b">ColorListScreen</code> and <code class="jk jl jm jn jo b">ColorScreen</code>:</p><figure class="jq jr js jt ju jv"><div class="kg s jy"><div class="mc ki s"></div></div></figure><p id="ff10" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">The app explicitly creates a <code class="jk jl jm jn jo b">Navigator</code> and gives it a list of pages that represents the complete stack. We create an empty <code class="jk jl jm jn jo b">_selectedColor</code> to indicate that no color has yet been selected, so we don’t show the <code class="jk jl jm jn jo b">ColorScreen</code> initially. When the user selects a color, we call <code class="jk jl jm jn jo b">setState()</code> as normal to indicate to Flutter that you’d like the <code class="jk jl jm jn jo b">build()</code> method called again, which now creates a stack with the <code class="jk jl jm jn jo b">ColorScreen</code> on top.</p><p id="c453" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">You update your state in the <code class="jk jl jm jn jo b">OnPopPage</code> call back, for example, if the user popped, then they’ve “unselected” the current color and we no longer want to show that page.</p><p id="ea87" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">If Navigator 2.0 looks like the rest of Flutter, that’s the intent — it’s declarative, unlike Navigator 1.0 which is imperative. The idea was to unify the models between navigation and the rest of Flutter while simultaneously fixing a bunch of issues and adding features. In fact, this little example barely scratches the surface of what’s in Navigator 2.0. For the details, I highly recommend the article on <a class="cl ia" rel="noopener" href="/web/20210217042021/https://medium.com/flutter/learning-flutters-new-navigation-and-routing-system-7c9068155ade">Declarative navigation and routing in Flutter</a>.</p><p id="dfda" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">Also, your existing use of Navigator 1.0 will continue to work just as it does today and won’t be removed anytime soon. If you prefer that model, you can certainly continue to use it. However, if you try Navigator 2.0, we think you’ll like it.</p><h1 id="6f28" class="ib ic do cf id ie if hi ig ih ii hl ij ik il im in io ip iq ir is it iu iv iw el">Preview: State Restoration for Android</h1><p id="896c" class="he hf do hg b en ix hi hj eq iy hl hm hn iz hp hq hr ja ht hu hv jb hx hy hz dg el">A new feature that is available for you to experiment with in this release is support for <a href="https://web.archive.org/web/20210217042021/https://developer.android.com/topic/libraries/architecture/saving-states" class="cl ia" rel="noopener nofollow">State Restoration on Android</a>. This is one of our <a href="https://web.archive.org/web/20210217042021/https://github.com/flutter/flutter/issues/6827" class="cl ia" rel="noopener nofollow">most-requested features</a> with 217 thumbs up!</p><p id="d421" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">For those not familiar with the need for state restoration, mobile OSes might kill apps that are in the background to reclaim resources for foreground apps. When this happens, the OS notifies the app to be killed to save any UI state quickly so that it can be restored when the user cycles back to that app. When implemented correctly, this provides a seamless experience for the user while making better use of the device’s resources. Until now, Flutter didn’t support state restoration and it was very difficult to do it correctly without framework support. That’s why we’re very happy to be able to deliver the foundational implementation of this feature for Android.</p><p id="41cd" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">Here’s <a href="https://web.archive.org/web/20210217042021/https://api.flutter.dev/flutter/widgets/RestorationMixin-mixin.html#widgets.RestorationMixin.1" class="cl ia" rel="noopener nofollow">a very simple sample</a> for restoring the state of the default Flutter Counter app:</p><figure class="jq jr js jt ju jv"><div class="kg s jy"><div class="mc ki s"></div></div></figure><p id="c633" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">Briefly, each widget gets a storage bucket, which is registered with the <code class="jk jl jm jn jo b"><a href="https://web.archive.org/web/20210217042021/https://api.flutter.dev/flutter/widgets/RestorationMixin-mixin.html" class="cl ia" rel="noopener nofollow">RestorationMixin</a></code> using a unique ID. By using a <code class="jk jl jm jn jo b"><a href="https://web.archive.org/web/20210217042021/https://master-api.flutter.dev/flutter/widgets/RestorableProperty-class.html" class="cl ia" rel="noopener nofollow">RestorableProperty</a></code> type (like <code class="jk jl jm jn jo b">RestorableInt</code> used here) to store the UI-specific data, and by registering that data with the State Restoration feature, the data is automatically stored before Android kills the app, and restored when it’s brought back to life. And that’s it. Any data that’s stored in a <code class="jk jl jm jn jo b">Restoration*</code> type, like <code class="jk jl jm jn jo b">RestorableInt</code>, <code class="jk jl jm jn jo b">RestorableString</code> and <code class="jk jl jm jn jo b">RestorableTextEditingController</code> (we’ve got a bunch of them) will be restored. And if we don’t cover all of the types you’d like to have restored, you can create your own by extending <code class="jk jl jm jn jo b"><a href="https://web.archive.org/web/20210217042021/https://api.flutter.dev/flutter/widgets/RestorableProperty-class.html" class="cl ia" rel="noopener nofollow">RestorableProperty<T></a></code>.</p><figure class="jq jr js jt ju jv lg lh gn li lj lk ll lm az ln lo lp lq lr ls paragraph-image"><div role="button" tabindex="0" class="jw jx jy jz aj ka"><div class="cy cz md"><div class="kg s jy jk"><div class="me ki s"><div class="kb kc t u v kd aj bl ke kf"><img alt="Image for post" class="t u v kd aj kj kk kl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/30/0*1298qhTKz_FjPuRN?q=20" width="720" height="1480"/></div><img alt="Image for post" class="kb kc t u v kd aj c" width="720" height="1480"/><noscript><img alt="Image for post" class="t u v kd aj" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1440/0*1298qhTKz_FjPuRN" width="720" height="1480" srcset="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/552/0*1298qhTKz_FjPuRN 276w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1000/0*1298qhTKz_FjPuRN 500w" sizes="500px"/></noscript></div></div></div></div></figure><p id="146f" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">For automated testing of state restoration, we’ve added <a href="https://web.archive.org/web/20210217042021/https://api.flutter.dev/flutter/flutter_test/WidgetTester/restartAndRestore.html" class="cl ia" rel="noopener nofollow">a new </a><code class="jk jl jm jn jo b"><a href="https://web.archive.org/web/20210217042021/https://api.flutter.dev/flutter/flutter_test/WidgetTester/restartAndRestore.html" class="cl ia" rel="noopener nofollow">restartAndRestore</a></code><a href="https://web.archive.org/web/20210217042021/https://api.flutter.dev/flutter/flutter_test/WidgetTester/restartAndRestore.html" class="cl ia" rel="noopener nofollow"> API to WidgetTester</a>. And to test manually, the easiest thing to do is to start your state restoration-enabled Flutter app on an Android device, enable “Don’t keep activities” in Android’s developer settings, run your Flutter app, put it into the background, and then return to it. At this point, Android will have killed and restored your app, so you can see if everything is working as you expect.</p><p id="969b" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">While we’re happy to put this preview version of State Restoration in your hands, there’s more work to do. For example, state restoration isn’t just for Android, iOS apps could benefit as well. Furthermore, we’re busy updating our own widgets to keep their state during restoration. We’ve already provided support in the <code class="jk jl jm jn jo b">Scrollable</code> classes like <code class="jk jl jm jn jo b">ListView</code> and <code class="jk jl jm jn jo b">SingleChildScrollView</code> (to remember the user’s scroll position) and <code class="jk jl jm jn jo b">TextFields</code> (to restore the text they’ve entered), and we plan to extend that to other widgets.</p><p id="0669" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">However, the key restoration support we have not yet added, and what makes this a preview release, is navigation (either 1.0 or 2.0). This means that where your user is in the app won’t be restored. That feature will be coming to a beta soon and to the next stable release of Flutter.</p><h1 id="3bdb" class="ib ic do cf id ie if hi ig ih ii hl ij ik il im in io ip iq ir is it iu iv iw el">Preview: Smooth scrolling for unmatched input and display frequencies</h1><p id="f725" class="he hf do hg b en ix hi hj eq iy hl hm hn iz hp hq hr ja ht hu hv jb hx hy hz dg el">Working with our internal Google partners, the Flutter team has greatly improved the performance of scrolling when the input and the display frequencies are not the same. For example, the Pixel 4 input runs at 120hz whereas the display runs at 90hz. This mismatch can cause a performance penalty when scrolling. With a new <code class="jk jl jm jn jo b">resamplingEnabled</code> flag, you can take advantage of the performance work we’ve done in Flutter to address this issue:</p><figure class="jq jr js jt ju jv"><div class="kg s jy"><div class="mc ki s"></div></div></figure><p id="364b" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">Depending on the frequency discrepancies involved, you may see up to 97% less jank in scrolling by enabling this flag. When we’re sure this is the best experience, we plan to enable this flag by default in a future build.</p><h1 id="a9b0" class="ib ic do cf id ie if hi ig ih ii hl ij ik il im in io ip iq ir is it iu iv iw el">A new unified Dart developer tool</h1><p id="b0cc" class="he hf do hg b en ix hi hj eq iy hl hm hn iz hp hq hr ja ht hu hv jb hx hy hz dg el">As always, an update to Flutter doesn’t just mean the engine and the framework but the tooling as well. Flutter 1.22 includes a new version of Dart (2.10), and there’s a new <code class="jk jl jm jn jo b">dart</code> CLI tool that you might find useful as well.</p><p id="5118" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">Dart historically has had many smaller developer tools (such as <code class="jk jl jm jn jo b">dartfmt</code> for formatting, and <code class="jk jl jm jn jo b">dartanalyzer</code> for code analysis). New in Dart 2.10 is a unified <code class="jk jl jm jn jo b">dart</code> developer tool very similar to the <code class="jk jl jm jn jo b">flutter</code> tool.</p><figure class="jq jr js jt ju jv cy cz paragraph-image"><div class="cy cz mf"><div class="kg s jy jk"><div class="mg ki s"><div class="kb kc t u v kd aj bl ke kf"><img alt="Screenshot of the output of `dart help`." class="t u v kd aj kj kk kl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/60/1*9pvyafhpaMEMhJfLVsz1JQ.png?q=20" width="700" height="368"/></div><img alt="Screenshot of the output of `dart help`." class="kb kc t u v kd aj c" width="700" height="368"/><noscript><img alt="Screenshot of the output of `dart help`." class="t u v kd aj" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1400/1*9pvyafhpaMEMhJfLVsz1JQ.png" width="700" height="368" srcset="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/552/1*9pvyafhpaMEMhJfLVsz1JQ.png 276w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1104/1*9pvyafhpaMEMhJfLVsz1JQ.png 552w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1280/1*9pvyafhpaMEMhJfLVsz1JQ.png 640w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1400/1*9pvyafhpaMEMhJfLVsz1JQ.png 700w" sizes="700px"/></noscript></div></div></div></figure><p id="cb2e" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">Starting with today’s Flutter 1.22 SDK, you will find that the <code class="jk jl jm jn jo b"><flutter-sdk>/bin</code> folder (which you likely have in your<code class="jk jl jm jn jo b">PATH</code>) contains both <code class="jk jl jm jn jo b">flutter</code> and <code class="jk jl jm jn jo b">dart</code> commands. For more details, see the <a class="cl ia" rel="noopener" href="/web/20210217042021/https://medium.com/@mit.mit/announcing-dart-2-10-350823952bd5">Dart 2.10 blog post</a>.</p><h1 id="f73e" class="ib ic do cf id ie if hi ig ih ii hl ij ik il im in io ip iq ir is it iu iv iw el">App size analysis tool</h1><p id="69a9" class="he hf do hg b en ix hi hj eq iy hl hm hn iz hp hq hr ja ht hu hv jb hx hy hz dg el">The tooling released as part of Flutter 1.22 includes a new output size analysis utility. This tool helps diagnose Flutter whether the breakdown of your app’s size changes over time.</p><p id="a496" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">You can use the tool to gather the data necessary for analysis by passing an<code class="jk jl jm jn jo b">--analyze-size</code> flag to any of the following commands:</p><ul class=""><li id="a3f7" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz jc jd je el"><code class="jk jl jm jn jo b">flutter build apk</code></li><li id="f438" class="he hf do hg b en jf hi hj eq jg hl hm hn jh hp hq hr ji ht hu hv jj hx hy hz jc jd je el"><code class="jk jl jm jn jo b">flutter build appbundle</code></li><li id="ed69" class="he hf do hg b en jf hi hj eq jg hl hm hn jh hp hq hr ji ht hu hv jj hx hy hz jc jd je el"><code class="jk jl jm jn jo b">flutter build ios</code></li><li id="6378" class="he hf do hg b en jf hi hj eq jg hl hm hn jh hp hq hr ji ht hu hv jj hx hy hz jc jd je el"><code class="jk jl jm jn jo b">flutter build linux</code></li><li id="2a05" class="he hf do hg b en jf hi hj eq jg hl hm hn jh hp hq hr ji ht hu hv jj hx hy hz jc jd je el"><code class="jk jl jm jn jo b">flutter build macos</code></li><li id="3106" class="he hf do hg b en jf hi hj eq jg hl hm hn jh hp hq hr ji ht hu hv jj hx hy hz jc jd je el"><code class="jk jl jm jn jo b">flutter build windows</code></li></ul><p id="784b" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">Using this flag while building a Flutter output artifact prints a summary of the artifact’s size and composition. This includes native code, assets, and even a package-level breakdown of compiled Dart code.</p><figure class="jq jr js jt ju jv cy cz paragraph-image"><div role="button" tabindex="0" class="jw jx jy jz aj ka"><div class="cy cz mh"><div class="kg s jy jk"><div class="mi ki s"><div class="kb kc t u v kd aj bl ke kf"><img alt="Image for post" class="t u v kd aj kj kk kl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/48/0*vfMD0AQZUOUwzfZ4?q=20" width="943" height="1165"/></div><img alt="Image for post" class="kb kc t u v kd aj c" width="943" height="1165"/><noscript><img alt="Image for post" class="t u v kd aj" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1886/0*vfMD0AQZUOUwzfZ4" width="943" height="1165" srcset="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/552/0*vfMD0AQZUOUwzfZ4 276w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1104/0*vfMD0AQZUOUwzfZ4 552w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1280/0*vfMD0AQZUOUwzfZ4 640w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1400/0*vfMD0AQZUOUwzfZ4 700w" sizes="700px"/></noscript></div></div></div></div><figcaption class="ky kz da cy cz la lb cf b fn ch fd">Example breakdown of the Flutter Gallery’s release APK</figcaption></figure><p id="cc36" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">This summary is helpful in quickly identifying hotspots in the application’s package size usage. In addition, the gathered data is also available as a JSON file for use in Dart DevTools, which allows you to further explore your app’s contents, pinpoint size issues and see changes between two different JSON files by following <a href="https://web.archive.org/web/20210217042021/https://flutter.dev/docs/development/tools/devtools/app-size" class="cl ia" rel="noopener nofollow">the instructions on flutter.dev</a>. Once you load the JSON file, you’ll have an interface that gives you a tree map view of your app’s size.</p><figure class="jq jr js jt ju jv cy cz paragraph-image"><div role="button" tabindex="0" class="jw jx jy jz aj ka"><div class="cy cz mj"><div class="kg s jy jk"><div class="mk ki s"><div class="kb kc t u v kd aj bl ke kf"><img alt="Image for post" class="t u v kd aj kj kk kl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/60/0*gA2waLDAyITCzD7K?q=20" width="1322" height="832"/></div><img alt="Image for post" class="kb kc t u v kd aj c" width="1322" height="832"/><noscript><img alt="Image for post" class="t u v kd aj" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/2644/0*gA2waLDAyITCzD7K" width="1322" height="832" srcset="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/552/0*gA2waLDAyITCzD7K 276w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1104/0*gA2waLDAyITCzD7K 552w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1280/0*gA2waLDAyITCzD7K 640w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1400/0*gA2waLDAyITCzD7K 700w" sizes="700px"/></noscript></div></div></div></div><figcaption class="ky kz da cy cz la lb cf b fn ch fd">An example APK breakdown in Dart DevTools</figcaption></figure><p id="0a3c" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">For more details of the things you can do with the App Size tool, read <a href="https://web.archive.org/web/20210217042021/https://flutter.dev/docs/development/tools/devtools/app-size" class="cl ia" rel="noopener nofollow">the Using the app size tool docs</a> on flutter.dev.</p><h1 id="10ac" class="ib ic do cf id ie if hi ig ih ii hl ij ik il im in io ip iq ir is it iu iv iw el">Preview: Updated Network Page in DevTools</h1><p id="7ecc" class="he hf do hg b en ix hi hj eq iy hl hm hn iz hp hq hr ja ht hu hv jb hx hy hz dg el">Another DevTools preview feature in this release is the ability to see HTTP and HTTPs response bodies as part of the <strong class="hg ml">Network</strong> tab.</p><figure class="jq jr js jt ju jv cy cz paragraph-image"><div role="button" tabindex="0" class="jw jx jy jz aj ka"><div class="cy cz mm"><div class="kg s jy jk"><div class="mn ki s"><div class="kb kc t u v kd aj bl ke kf"><img alt="Image for post" class="t u v kd aj kj kk kl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/60/0*-FukCwELl9DLlefP?q=20" width="781" height="719"/></div><img alt="Image for post" class="kb kc t u v kd aj c" width="781" height="719"/><noscript><img alt="Image for post" class="t u v kd aj" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1562/0*-FukCwELl9DLlefP" width="781" height="719" srcset="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/552/0*-FukCwELl9DLlefP 276w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1104/0*-FukCwELl9DLlefP 552w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1280/0*-FukCwELl9DLlefP 640w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1400/0*-FukCwELl9DLlefP 700w" sizes="700px"/></noscript></div></div></div></div></figure><p id="2ba4" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">To enable this feature, make sure you’re on the Flutter dev channel via <code class="jk jl jm jn jo b">flutter channel dev</code> and <code class="jk jl jm jn jo b">flutter channel upgrade</code>.</p><p id="085e" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">In addition, for apps with lots of network traffic, we’ve provided the ability to search and filter.</p><figure class="jq jr js jt ju jv cy cz paragraph-image"><div role="button" tabindex="0" class="jw jx jy jz aj ka"><div class="cy cz mo"><div class="kg s jy jk"><div class="mp ki s"><div class="kb kc t u v kd aj bl ke kf"><img alt="Image for post" class="t u v kd aj kj kk kl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/54/0*k-fEpOpbV_MiX9Fn?q=20" width="994" height="1096"/></div><img alt="Image for post" class="kb kc t u v kd aj c" width="994" height="1096"/><noscript><img alt="Image for post" class="t u v kd aj" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1988/0*k-fEpOpbV_MiX9Fn" width="994" height="1096" srcset="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/552/0*k-fEpOpbV_MiX9Fn 276w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1104/0*k-fEpOpbV_MiX9Fn 552w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1280/0*k-fEpOpbV_MiX9Fn 640w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1400/0*k-fEpOpbV_MiX9Fn 700w" sizes="700px"/></noscript></div></div></div></div></figure><p id="8b26" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">For the <strong class="hg ml">Network</strong> tab docs, see <a href="https://web.archive.org/web/20210217042021/https://flutter.dev/docs/development/tools/devtools/network" class="cl ia" rel="noopener nofollow">Using the Network View</a> on flutter.dev.</p><h1 id="06f9" class="ib ic do cf id ie if hi ig ih ii hl ij ik il im in io ip iq ir is it iu iv iw el">Hosted DevTools Inspector tab in IntelliJ</h1><p id="4294" class="he hf do hg b en ix hi hj eq iy hl hm hn iz hp hq hr ja ht hu hv jb hx hy hz dg el">For a while now, we’ve been maintaining two copies of some of our Flutter tools, like the <strong class="hg ml">Inspector</strong> pane in IntelliJ and the <strong class="hg ml">Inspector</strong> tab in Dart DevTools. Not only does this slow us down because we’ve got to maintain two codebases, but some features haven’t yet made it into the IntelliJ plugin, like the Layout Explorer. So, to solve both of those problems, we’ve enabled the ability to host the <strong class="hg ml">Inspector</strong> tab from Dart DevTools directly inside of IntelliJ.</p><figure class="jq jr js jt ju jv cy cz paragraph-image"><div role="button" tabindex="0" class="jw jx jy jz aj ka"><div class="cy cz mq"><div class="kg s jy jk"><div class="mr ki s"><div class="kb kc t u v kd aj bl ke kf"><img alt="Image for post" class="t u v kd aj kj kk kl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/56/0*RQZ-EVyFP1-BqBIX?q=20" width="1041" height="1102"/></div><img alt="Image for post" class="kb kc t u v kd aj c" width="1041" height="1102"/><noscript><img alt="Image for post" class="t u v kd aj" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/2082/0*RQZ-EVyFP1-BqBIX" width="1041" height="1102" srcset="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/552/0*RQZ-EVyFP1-BqBIX 276w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1104/0*RQZ-EVyFP1-BqBIX 552w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1280/0*RQZ-EVyFP1-BqBIX 640w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1400/0*RQZ-EVyFP1-BqBIX 700w" sizes="700px"/></noscript></div></div></div></div></figure><p id="a50c" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">Notice the addition of the Layout Explorer, which you can use right next to your code. To toggle this option on, go to <strong class="hg ml">Preferences</strong> ><strong class="hg ml"> Languages & Frameworks</strong> > <strong class="hg ml">Flutter</strong> > <strong class="hg ml">Enable embedded DevTools inspector</strong>.</p><h1 id="f8b3" class="ib ic do cf id ie if hi ig ih ii hl ij ik il im in io ip iq ir is it iu iv iw el">Improved output linking in Visual Studio Code</h1><p id="d3b7" class="he hf do hg b en ix hi hj eq iy hl hm hn iz hp hq hr ja ht hu hv jb hx hy hz dg el">A regular activity that all Flutter developers face is going from the error output in the terminal or in their stack traces. In the most recent release of the Flutter extension for Visual Studio Code, these links are now properly parsed for you to enable links directly from the output.</p><figure class="jq jr js jt ju jv cy cz paragraph-image"><div role="button" tabindex="0" class="jw jx jy jz aj ka"><div class="cy cz ku"><div class="kg s jy jk"><div class="ms ki s"><div class="kb kc t u v kd aj bl ke kf"><img alt="Image for post" class="t u v kd aj kj kk kl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/60/0*prigrwpp7gE6ChCE?q=20" width="1600" height="909"/></div><img alt="Image for post" class="kb kc t u v kd aj c" width="1600" height="909"/><noscript><img alt="Image for post" class="t u v kd aj" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/3200/0*prigrwpp7gE6ChCE" width="1600" height="909" srcset="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/552/0*prigrwpp7gE6ChCE 276w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1104/0*prigrwpp7gE6ChCE 552w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1280/0*prigrwpp7gE6ChCE 640w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1400/0*prigrwpp7gE6ChCE 700w" sizes="700px"/></noscript></div></div></div></div></figure><p id="1ce7" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">It seems like a small thing, but initial feedback is already very positive on this feature.</p><p id="0d9d" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el">As always, there are too many tooling changes list here, but I recommend the following announcements for details:</p><ul class=""><li id="6bb5" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz jc jd je el"><a href="https://web.archive.org/web/20210217042021/https://groups.google.com/g/flutter-announce/c/UxMv8MzE_uo/m/ED539pi2AAAJ" class="cl ia" rel="noopener nofollow">Dart DevTools — 0.9.0</a></li><li id="ca96" class="he hf do hg b en jf hi hj eq jg hl hm hn jh hp hq hr ji ht hu hv jj hx hy hz jc jd je el"><a href="https://web.archive.org/web/20210217042021/https://groups.google.com/g/flutter-announce/c/y27h86ATFJM" class="cl ia" rel="noopener nofollow">Dart DevTools — 0.9.1</a></li><li id="202a" class="he hf do hg b en jf hi hj eq jg hl hm hn jh hp hq hr ji ht hu hv jj hx hy hz jc jd je el"><a href="https://web.archive.org/web/20210217042021/https://groups.google.com/g/flutter-announce/c/24LppkXdMtM" class="cl ia" rel="noopener nofollow">Dart DevTools — 0.9.3</a></li><li id="ca12" class="he hf do hg b en jf hi hj eq jg hl hm hn jh hp hq hr ji ht hu hv jj hx hy hz jc jd je el"><a href="https://web.archive.org/web/20210217042021/https://groups.google.com/g/flutter-announce/c/nvgDi3RLAUE/m/Fx4Ze0vrBAAJ" class="cl ia" rel="noopener nofollow">Flutter IntelliJ Plugin M48.1 Release</a></li><li id="23be" class="he hf do hg b en jf hi hj eq jg hl hm hn jh hp hq hr ji ht hu hv jj hx hy hz jc jd je el"><a href="https://web.archive.org/web/20210217042021/https://groups.google.com/g/flutter-announce/c/-ZMKRIBRtGU" class="cl ia" rel="noopener nofollow">Flutter IntelliJ Plugin M49 Release</a></li><li id="68d3" class="he hf do hg b en jf hi hj eq jg hl hm hn jh hp hq hr ji ht hu hv jj hx hy hz jc jd je el"><a href="https://web.archive.org/web/20210217042021/https://groups.google.com/g/flutter-announce/c/u0zU6zv3o44/m/2y0JsX1_AwAJ" class="cl ia" rel="noopener nofollow">Flutter IntelliJ Plugin M50 Release</a></li><li id="3237" class="he hf do hg b en jf hi hj eq jg hl hm hn jh hp hq hr ji ht hu hv jj hx hy hz jc jd je el"><a href="https://web.archive.org/web/20210217042021/https://groups.google.com/g/flutter-announce/c/8e8e-ZrgySY" class="cl ia" rel="noopener nofollow">VS Code extensions v3.14.0</a></li><li id="8f16" class="he hf do hg b en jf hi hj eq jg hl hm hn jh hp hq hr ji ht hu hv jj hx hy hz jc jd je el"><a href="https://web.archive.org/web/20210217042021/https://dartcode.org/releases/v3-15/" class="cl ia" rel="noopener nofollow">VS Code extensions v3.15.0</a></li></ul><h1 id="6d72" class="ib ic do cf id ie if hi ig ih ii hl ij ik il im in io ip iq ir is it iu iv iw el">Customer Spotlight: EasyA</h1><p id="ba14" class="he hf do hg b en ix hi hj eq iy hl hm hn iz hp hq hr ja ht hu hv jb hx hy hz dg el">EasyA is a subscription app designed to give school-age students access to brilliant tutors via instant messaging, and is written in Flutter. Recently it was featured by Apple as <a href="https://web.archive.org/web/20210217042021/https://apps.apple.com/gb/story/id1527472788" class="cl ia" rel="noopener nofollow">their App of the Day</a>.</p></div></div><div class="jv"><div class="n p"><div class="km kn ko kp kq kr af ks ag kt ai aj"><figure class="jq jr js jt ju jv kv kw paragraph-image"><div role="button" tabindex="0" class="jw jx jy jz aj ka"><div class="cy cz ku"><div class="kg s jy jk"><div class="mt ki s"><div class="kb kc t u v kd aj bl ke kf"><img alt="Image for post" class="t u v kd aj kj kk kl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/60/0*yLWTxV_YTJ2HKhuz?q=20" width="1600" height="1384"/></div><img alt="Image for post" class="kb kc t u v kd aj c" width="1600" height="1384"/><noscript><img alt="Image for post" class="t u v kd aj" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/3200/0*yLWTxV_YTJ2HKhuz" width="1600" height="1384" srcset="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/552/0*yLWTxV_YTJ2HKhuz 276w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1104/0*yLWTxV_YTJ2HKhuz 552w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1280/0*yLWTxV_YTJ2HKhuz 640w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1456/0*yLWTxV_YTJ2HKhuz 728w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1632/0*yLWTxV_YTJ2HKhuz 816w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1808/0*yLWTxV_YTJ2HKhuz 904w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/1984/0*yLWTxV_YTJ2HKhuz 992w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/2000/0*yLWTxV_YTJ2HKhuz 1000w" sizes="1000px"/></noscript></div></div></div></div></figure></div></div></div><div class="n p"><div class="ab ac ae af ag dl ai aj"><blockquote class="mu mv mw"><p id="6724" class="he hf ma hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el"><em class="do">“When schools began to go online earlier this year, we knew we needed to launch our tutoring app quickly to help students. The sheer speed of development with Flutter meant we were able to implement award-winning designs for both iOS and Android, and also publish to the web — just in time for lockdown! Normally, this would have been practically impossible. But since Flutter allows us to target all three platforms at once, we were able to share code efficiently and leverage our small team of developers to the fullest.”</em></p><p id="83a0" class="he hf ma hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz dg el"><em class="do">— Phil Kwok, Co-founder, </em><a href="https://web.archive.org/web/20210217042021/https://easya.io/" class="cl ia" rel="noopener nofollow"><em class="do">EasyA</em></a></p></blockquote><h1 id="d8c7" class="ib ic do cf id ie if hi ig ih ii hl ij ik il im in io ip iq ir is it iu iv iw el">Breaking Changes</h1><p id="ad2f" class="he hf do hg b en ix hi hj eq iy hl hm hn iz hp hq hr ja ht hu hv jb hx hy hz dg el">As always, we attempt to keep the number of breaking changes to a minimum. Here’s the list from the Flutter 1.22 release.</p><ul class=""><li id="71e2" class="he hf do hg b en hh hi hj eq hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz jc jd je el"><a href="https://web.archive.org/web/20210217042021/https://github.com/flutter/flutter/pull/56413" class="cl ia" rel="noopener nofollow">56413</a> <a href="https://web.archive.org/web/20210217042021/https://docs.google.com/document/d/1BZhxy176uUnqOCnXdnHM1XetS9mw9WIyUAOE-dgVdUM/edit?usp=sharing" class="cl ia" rel="noopener nofollow">Prevent viewport.showOnScreen from scrolling the viewport if the specified Rect is already visible</a>.</li><li id="6747" class="he hf do hg b en jf hi hj eq jg hl hm hn jh hp hq hr ji ht hu hv jj hx hy hz jc jd je el"><a href="https://web.archive.org/web/20210217042021/https://github.com/flutter/flutter/pull/62395" class="cl ia" rel="noopener nofollow">62395</a> [gen_l10n] Synthetic package generation by default</li><li id="ec26" class="he hf do hg b en jf hi hj eq jg hl hm hn jh hp hq hr ji ht hu hv jj hx hy hz jc jd je el"><a href="https://web.archive.org/web/20210217042021/https://github.com/flutter/flutter/pull/62588" class="cl ia" rel="noopener nofollow">62588</a> Build routes even less.</li></ul><h1 id="42d9" class="ib ic do cf id ie if hi ig ih ii hl ij ik il im in io ip iq ir is it iu iv iw el">Summary</h1><p id="9f2c" class="he hf do hg b en ix hi hj eq iy hl hm hn iz hp hq hr ja ht hu hv jb hx hy hz dg el">The Flutter 1.22 stable release may have come quickly on the heels of the previous release, but there’s so much good stuff in it that this post couldn’t mention it all. We hope this release helps you build amazing apps for iOS and Android, and we can’t wait to see what you have in store! Thank you for your support — we build Flutter for you.</p></div></div></section></div></article><div class="kb df my mx aj nf nd ng" data-test-id="post-sidebar"><div class="n p"><div class="ab ac ae af ag ah ai aj"><div class="nh n ni"><div class="df"><div><div class="nk nl s"><a href="/web/20210217042021/https://medium.com/flutter?source=post_sidebar--------------------------post_sidebar-----------" class="cl cm au av aw ax ay az ba bb gz ha be fx fy" rel="noopener"><h2 class="cf id nj ch dn el dg">Flutter</h2></a><div class="nm nn s"><p class="cf b fn ch bl no fr fs np fu fv fd">Flutter is Google's mobile UI framework for crafting…</p></div><div class="go" aria-hidden="false" aria-describedby="collectionFollowPopover" aria-labelledby="collectionFollowPopover"><span><button class="cf b fn ch ga nq gc gd ge gf gg bb gh gi gj gk gl gm gn db go gp"><div class="n nr">Follow</div></button></span></div></div><div class="ns nt nu n"><div class="n o"><div class="s jy nv nw nx ny nz"><span><a href="https://web.archive.org/web/20210217042021/https://medium.com/m/signin?actionUrl=%2F_%2Fvote%2Fflutter%2F44f146009e5f&operation=register&redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fannouncing-flutter-1-22-44f146009e5f&source=post_sidebar-----44f146009e5f---------------------clap_sidebar-----------" class="cl cm au av aw ax ay az ba bb gz ha be fx fy" rel="noopener"><div class="az oa ob oc od oe of og r oh oi"><svg width="29" height="29" aria-label="clap"><g fill-rule="evenodd"><path d="M13.74 1l.76 2.97.76-2.97zM16.82 4.78l1.84-2.56-1.43-.47zM10.38 2.22l1.84 2.56-.41-3.03zM22.38 22.62a5.11 5.11 0 0 1-3.16 1.61l.49-.45c2.88-2.89 3.45-5.98 1.69-9.21l-1.1-1.94-.96-2.02c-.31-.67-.23-1.18.25-1.55a.84.84 0 0 1 .66-.16c.34.05.66.28.88.6l2.85 5.02c1.18 1.97 1.38 5.12-1.6 8.1M9.1 22.1l-5.02-5.02a1 1 0 0 1 .7-1.7 1 1 0 0 1 .72.3l2.6 2.6a.44.44 0 0 0 .63-.62L6.1 15.04l-1.75-1.75a1 1 0 1 1 1.41-1.41l4.15 4.15a.44.44 0 0 0 .63 0 .44.44 0 0 0 0-.62L6.4 11.26l-1.18-1.18a1 1 0 0 1 0-1.4 1.02 1.02 0 0 1 1.41 0l1.18 1.16L11.96 14a.44.44 0 0 0 .62 0 .44.44 0 0 0 0-.63L8.43 9.22a.99.99 0 0 1-.3-.7.99.99 0 0 1 .3-.7 1 1 0 0 1 1.41 0l7 6.98a.44.44 0 0 0 .7-.5l-1.35-2.85c-.31-.68-.23-1.19.25-1.56a.85.85 0 0 1 .66-.16c.34.06.66.28.88.6L20.63 15c1.57 2.88 1.07 5.54-1.55 8.16a5.62 5.62 0 0 1-5.06 1.65 9.35 9.35 0 0 1-4.93-2.72zM13 6.98l2.56 2.56c-.5.6-.56 1.41-.15 2.28l.26.56-4.25-4.25a.98.98 0 0 1-.12-.45 1 1 0 0 1 .29-.7 1.02 1.02 0 0 1 1.41 0zm8.89 2.06c-.38-.56-.9-.92-1.49-1.01a1.74 1.74 0 0 0-1.34.33c-.38.29-.61.65-.71 1.06a2.1 2.1 0 0 0-1.1-.56 1.78 1.78 0 0 0-.99.13l-2.64-2.64a1.88 1.88 0 0 0-2.65 0 1.86 1.86 0 0 0-.48.85 1.89 1.89 0 0 0-2.67-.01 1.87 1.87 0 0 0-.5.9c-.76-.75-2-.75-2.7-.04a1.88 1.88 0 0 0 0 2.66c-.3.12-.61.29-.87.55a1.88 1.88 0 0 0 0 2.66l.62.62a1.88 1.88 0 0 0-.9 3.16l5.01 5.02c1.6 1.6 3.52 2.64 5.4 2.96a7.16 7.16 0 0 0 1.18.1c1.03 0 2-.25 2.9-.7A5.9 5.9 0 0 0 23 23.24c3.34-3.34 3.08-6.93 1.74-9.17l-2.87-5.04z"></path></g></svg></div></a></span></div><div class="s oj ok ol om on oo op"><div class="oq"><p class="cf b fn ch fd"><button class="cl cm au av aw ax ay az ba bb gz ha be fx fy">6.7K<!-- --> </button></p></div></div></div></div><div class="nt s"><button class="od ob az"><div class="ot n o nr"><svg width="25" height="25" class="r" aria-label="responses"><path d="M19.07 21.12a6.33 6.33 0 0 1-3.53-1.1 7.8 7.8 0 0 1-.7-.52c-.77.21-1.57.32-2.38.32-4.67 0-8.46-3.5-8.46-7.8C4 7.7 7.79 4.2 12.46 4.2c4.66 0 8.46 3.5 8.46 7.8 0 2.06-.85 3.99-2.4 5.45a6.28 6.28 0 0 0 1.14 2.59c.15.21.17.48.06.7a.69.69 0 0 1-.62.38h-.03zm0-1v.5l.03-.5h-.03zm-3.92-1.64l.21.2a6.09 6.09 0 0 0 3.24 1.54 7.14 7.14 0 0 1-.83-1.84 5.15 5.15 0 0 1-.16-.75 2.4 2.4 0 0 1-.02-.29v-.23l.18-.15a6.6 6.6 0 0 0 2.3-4.96c0-3.82-3.4-6.93-7.6-6.93-4.19 0-7.6 3.11-7.6 6.93 0 3.83 3.41 6.94 7.6 6.94.83 0 1.64-.12 2.41-.35l.28-.08z" fill-rule="evenodd"></path></svg><div class="s jy ou ov ow ox oy oz pa pb"><p class="cf b fn ch fd">11<!-- --> </p></div></div></button></div><div class="hb"><span><a href="https://web.archive.org/web/20210217042021/https://medium.com/m/signin?actionUrl=%2F_%2Fbookmark%2Fp%2F44f146009e5f&operation=register&redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fannouncing-flutter-1-22-44f146009e5f&source=post_sidebar-----44f146009e5f---------------------bookmark_sidebar-----------" class="cl cm au av aw ax ay az ba bb gz ha be fx fy" rel="noopener"><svg width="25" height="25" viewbox="0 0 25 25"><path d="M19 6a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v14.66h.01c.01.1.05.2.12.28a.5.5 0 0 0 .7.03l5.67-4.12 5.66 4.13a.5.5 0 0 0 .71-.03.5.5 0 0 0 .12-.29H19V6zm-6.84 9.97L7 19.64V6a1 1 0 0 1 1-1h9a1 1 0 0 1 1 1v13.64l-5.16-3.67a.49.49 0 0 0-.68 0z" fill-rule="evenodd"></path></svg></a></span></div></div></div></div></div></div></div><div class="kb df mx my mz na nb nc nd ne"></div><div><div class="pc jv n ni p"><div class="n p"><div class="ab ac ae af ag dl ai aj"><div class="n pd"></div><div class="n o pd"><div class="s"><div class="go"><p class="cf b cg ch fd"><div><div class="go" role="tooltip" aria-hidden="false"><a href="https://web.archive.org/web/20210217042021/http://creativecommons.org/licenses/by/4.0/" class="cl cm au av aw ax ay az ba bb fw be fx fy" target="_blank" rel="noopener nofollow">Some rights reserved</a></div></div></p></div><div class="go"><p class="cf b cg ch fd"><span class="hb" style="margin-left:5px;vertical-align:text-bottom"><svg width="21" height="21"><path d="M10.48 2c2.4 0 4.4.82 6.04 2.46A8.2 8.2 0 0 1 19 10.5c0 2.39-.81 4.38-2.43 5.96A8.4 8.4 0 0 1 10.49 19c-2.3 0-4.3-.83-5.98-2.5C2.84 14.82 2 12.83 2 10.5s.83-4.34 2.5-6.04A8.14 8.14 0 0 1 10.48 2zm.03 1.53c-1.93 0-3.56.68-4.9 2.04a6.84 6.84 0 0 0-.01 9.82 6.71 6.71 0 0 0 4.92 2.06c1.89 0 3.54-.69 4.94-2.07a6.47 6.47 0 0 0 2-4.87c0-1.93-.67-3.57-2.03-4.93a6.72 6.72 0 0 0-4.91-2.03zM12.8 8.4v3.48h-.97v4.12H9.18v-4.12h-.97V8.39A.53.53 0 0 1 8.37 8a.53.53 0 0 1 .39-.16h3.49c.14 0 .27.06.38.16a.52.52 0 0 1 .16.39zM9.32 6.2c0-.8.39-1.2 1.18-1.2.79 0 1.18.4 1.18 1.2 0 .8-.4 1.19-1.18 1.19-.79 0-1.18-.4-1.18-1.18z" fill-rule="evenodd"></path></svg></span></p></div></div></div><div class="pe s"><ul class="az ba"><li class="go br hc pf"><a href="https://web.archive.org/web/20210217042021/https://medium.com/flutter/tagged/flutter" class="cf b cg pg fd ph pi gp s pj">Flutter</a></li><li class="go br hc pf"><a href="https://web.archive.org/web/20210217042021/https://medium.com/flutter/tagged/ios" class="cf b cg pg fd ph pi gp s pj">iOS</a></li><li class="go br hc pf"><a href="https://web.archive.org/web/20210217042021/https://medium.com/flutter/tagged/android" class="cf b cg pg fd ph pi gp s pj">Android</a></li><li class="go br hc pf"><a href="https://web.archive.org/web/20210217042021/https://medium.com/flutter/tagged/announcements" class="cf b cg pg fd ph pi gp s pj">Announcements</a></li><li class="go br hc pf"><a href="https://web.archive.org/web/20210217042021/https://medium.com/flutter/tagged/mobile-app-development" class="cf b cg pg fd ph pi gp s pj">Mobile App Development</a></li></ul></div><div class="pe n ff z"><div class="n nr"><div class="pk s"><span class="s pl pm pn e d"><div class="n o"><div class="s jy nv nw nx ny nz"><span><a href="https://web.archive.org/web/20210217042021/https://medium.com/m/signin?actionUrl=%2F_%2Fvote%2Fflutter%2F44f146009e5f&operation=register&redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fannouncing-flutter-1-22-44f146009e5f&source=post_actions_footer-----44f146009e5f---------------------clap_footer-----------" class="cl cm au av aw ax ay az ba bb gz ha be fx fy" rel="noopener"><div class="az oa ob oc od oe of og r oh oi"><svg width="25" height="25" viewbox="0 0 25 25" aria-label="clap"><g fill-rule="evenodd"><path d="M11.74 0l.76 2.97.76-2.97zM14.81 3.78l1.84-2.56-1.42-.47zM8.38 1.22l1.84 2.56L9.8.75zM20.38 21.62a5.11 5.11 0 0 1-3.16 1.61l.49-.45c2.88-2.89 3.45-5.98 1.69-9.21l-1.1-1.94-.96-2.02c-.31-.67-.23-1.18.25-1.55a.84.84 0 0 1 .66-.16c.34.05.66.28.88.6l2.85 5.02c1.18 1.97 1.38 5.12-1.6 8.1M7.1 21.1l-5.02-5.02a1 1 0 0 1 .7-1.7 1 1 0 0 1 .72.3l2.6 2.6a.44.44 0 0 0 .63-.62L4.1 14.04l-1.75-1.75a1 1 0 1 1 1.41-1.41l4.15 4.15a.44.44 0 0 0 .63 0 .44.44 0 0 0 0-.62L4.4 10.26 3.22 9.08a1 1 0 0 1 0-1.4 1.02 1.02 0 0 1 1.41 0l1.18 1.16L9.96 13a.44.44 0 0 0 .62 0 .44.44 0 0 0 0-.63L6.43 8.22a.99.99 0 0 1-.3-.7.99.99 0 0 1 .3-.7 1 1 0 0 1 1.41 0l7 6.98a.44.44 0 0 0 .7-.5l-1.35-2.85c-.31-.68-.23-1.19.25-1.56a.85.85 0 0 1 .66-.16c.34.06.66.28.88.6L18.63 14c1.57 2.88 1.07 5.54-1.55 8.16a5.62 5.62 0 0 1-5.06 1.65 9.35 9.35 0 0 1-4.93-2.72zM11 5.98l2.56 2.56c-.5.6-.56 1.41-.15 2.28l.26.56-4.25-4.25a.98.98 0 0 1-.12-.45 1 1 0 0 1 .29-.7 1.02 1.02 0 0 1 1.41 0zm8.89 2.06c-.38-.56-.9-.92-1.49-1.01a1.74 1.74 0 0 0-1.34.33c-.38.29-.61.65-.71 1.06a2.1 2.1 0 0 0-1.1-.56 1.78 1.78 0 0 0-.99.13l-2.64-2.64a1.88 1.88 0 0 0-2.65 0 1.86 1.86 0 0 0-.48.85 1.89 1.89 0 0 0-2.67-.01 1.87 1.87 0 0 0-.5.9c-.76-.75-2-.75-2.7-.04a1.88 1.88 0 0 0 0 2.66c-.3.12-.61.29-.87.55a1.88 1.88 0 0 0 0 2.66l.62.62a1.88 1.88 0 0 0-.9 3.16l5.01 5.02c1.6 1.6 3.52 2.64 5.4 2.96a7.16 7.16 0 0 0 1.18.1c1.03 0 2-.25 2.9-.7A5.9 5.9 0 0 0 21 22.24c3.34-3.34 3.08-6.93 1.74-9.17l-2.87-5.04z"></path></g></svg></div></a></span></div><div class="s oj ok ol om on oo op"><div class="jy po oq"><p class="cf b fn ch el"><button class="cl cm au av aw ax ay az ba bb gz ha be fx fy">6.7K<span class="s h g f pp pq"> <!-- -->claps</span></button><span class="s h g f pp pq"></span></p></div></div></div></span><span class="s h g f pp pq"><div class="n bv"><div class="s jy nv nw"><span><a href="https://web.archive.org/web/20210217042021/https://medium.com/m/signin?actionUrl=%2F_%2Fvote%2Fflutter%2F44f146009e5f&operation=register&redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fannouncing-flutter-1-22-44f146009e5f&source=post_actions_footer-----44f146009e5f---------------------clap_footer-----------" class="cl cm au av aw ax ay az ba bb gz ha be fx fy" rel="noopener"><div class="az oa ob oc od oe of og r oh oi"><svg width="33" height="33" viewbox="0 0 33 33" aria-label="clap"><path d="M28.86 17.34l-3.64-6.4c-.3-.43-.71-.73-1.16-.8a1.12 1.12 0 0 0-.9.21c-.62.5-.73 1.18-.32 2.06l1.22 2.6 1.4 2.45c2.23 4.09 1.51 8-2.15 11.66a9.6 9.6 0 0 1-.8.71 6.53 6.53 0 0 0 4.3-2.1c3.82-3.82 3.57-7.87 2.05-10.39zm-6.25 11.08c3.35-3.35 4-6.78 1.98-10.47L21.2 12c-.3-.43-.71-.72-1.16-.8a1.12 1.12 0 0 0-.9.22c-.62.49-.74 1.18-.32 2.06l1.72 3.63a.5.5 0 0 1-.81.57l-8.91-8.9a1.33 1.33 0 0 0-1.89 1.88l5.3 5.3a.5.5 0 0 1-.71.7l-5.3-5.3-1.49-1.49c-.5-.5-1.38-.5-1.88 0a1.34 1.34 0 0 0 0 1.89l1.49 1.5 5.3 5.28a.5.5 0 0 1-.36.86.5.5 0 0 1-.36-.15l-5.29-5.29a1.34 1.34 0 0 0-1.88 0 1.34 1.34 0 0 0 0 1.89l2.23 2.23L9.3 21.4a.5.5 0 0 1-.36.85.5.5 0 0 1-.35-.14l-3.32-3.33a1.33 1.33 0 0 0-1.89 0 1.32 1.32 0 0 0-.39.95c0 .35.14.69.4.94l6.39 6.4c3.53 3.53 8.86 5.3 12.82 1.35zM12.73 9.26l5.68 5.68-.49-1.04c-.52-1.1-.43-2.13.22-2.89l-3.3-3.3a1.34 1.34 0 0 0-1.88 0 1.33 1.33 0 0 0-.4.94c0 .22.07.42.17.61zm14.79 19.18a7.46 7.46 0 0 1-6.41 2.31 7.92 7.92 0 0 1-3.67.9c-3.05 0-6.12-1.63-8.36-3.88l-6.4-6.4A2.31 2.31 0 0 1 2 19.72a2.33 2.33 0 0 1 1.92-2.3l-.87-.87a2.34 2.34 0 0 1 0-3.3 2.33 2.33 0 0 1 1.24-.64l-.14-.14a2.34 2.34 0 0 1 0-3.3 2.39 2.39 0 0 1 3.3 0l.14.14a2.33 2.33 0 0 1 3.95-1.24l.09.09c.09-.42.29-.83.62-1.16a2.34 2.34 0 0 1 3.3 0l3.38 3.39a2.17 2.17 0 0 1 1.27-.17c.54.08 1.03.35 1.45.76.1-.55.41-1.03.9-1.42a2.12 2.12 0 0 1 1.67-.4 2.8 2.8 0 0 1 1.85 1.25l3.65 6.43c1.7 2.83 2.03 7.37-2.2 11.6zM13.22.48l-1.92.89 2.37 2.83-.45-3.72zm8.48.88L19.78.5l-.44 3.7 2.36-2.84zM16.5 3.3L15.48 0h2.04L16.5 3.3z" fill-rule="evenodd"></path></svg></div></a></span></div><div class="s oj ok ol om pr ps pt pu pv pw"><div class="jy po oq"><p class="cf b fn ch el"><button class="cl cm au av aw ax ay az ba bb gz ha be fx fy">6.7K<span class="s h g f pp pq"> <!-- -->claps</span></button><span class="s h g f pp pq"></span></p></div></div></div></span></div><div class="s px py pz qa qb"></div><button class="od ob az"><div class="ot n o nr"><span class="qc s h g f pp pq"><svg width="33" height="33" viewbox="0 0 33 33" fill="none" class="r" aria-label="responses"><path clip-rule="evenodd" d="M24.28 25.5l.32-.29c2.11-1.94 3.4-4.61 3.4-7.56C28 11.83 22.92 7 16.5 7S5 11.83 5 17.65s5.08 10.66 11.5 10.66c1.22 0 2.4-.18 3.5-.5l.5-.15.41.33a8.86 8.86 0 0 0 4.68 2.1 7.34 7.34 0 0 1-1.3-4.15v-.43zm1 .45c0 1.5.46 2.62 1.69 4.44.22.32.01.75-.38.75a9.69 9.69 0 0 1-6.31-2.37c-1.2.35-2.46.54-3.78.54C9.6 29.3 4 24.09 4 17.65 4 11.22 9.6 6 16.5 6S29 11.22 29 17.65c0 3.25-1.42 6.18-3.72 8.3z"></path></svg></span><span class="qd s pl pm pn e d"><svg width="25" height="25" class="r" aria-label="responses"><path d="M19.07 21.12a6.33 6.33 0 0 1-3.53-1.1 7.8 7.8 0 0 1-.7-.52c-.77.21-1.57.32-2.38.32-4.67 0-8.46-3.5-8.46-7.8C4 7.7 7.79 4.2 12.46 4.2c4.66 0 8.46 3.5 8.46 7.8 0 2.06-.85 3.99-2.4 5.45a6.28 6.28 0 0 0 1.14 2.59c.15.21.17.48.06.7a.69.69 0 0 1-.62.38h-.03zm0-1v.5l.03-.5h-.03zm-3.92-1.64l.21.2a6.09 6.09 0 0 0 3.24 1.54 7.14 7.14 0 0 1-.83-1.84 5.15 5.15 0 0 1-.16-.75 2.4 2.4 0 0 1-.02-.29v-.23l.18-.15a6.6 6.6 0 0 0 2.3-4.96c0-3.82-3.4-6.93-7.6-6.93-4.19 0-7.6 3.11-7.6 6.93 0 3.83 3.41 6.94 7.6 6.94.83 0 1.64-.12 2.41-.35l.28-.08z" fill-rule="evenodd"></path></svg></span><div class="s jy qe ov qf ox qg oz qh qi qj qk"><p class="cf b fn ch el">11<!-- --> <span class="s h g f pp pq">response<!-- -->s</span></p></div></div></button></div><div class="n o"><div class="gy s ap"><button class="cl cm au av aw ax ay az ba bb gz ha be fx fy" aria-label="Share on twitter"><svg width="29" height="29" class="hb"><path d="M22.05 7.54a4.47 4.47 0 0 0-3.3-1.46 4.53 4.53 0 0 0-4.53 4.53c0 .35.04.7.08 1.05A12.9 12.9 0 0 1 5 6.89a5.1 5.1 0 0 0-.65 2.26c.03 1.6.83 2.99 2.02 3.79a4.3 4.3 0 0 1-2.02-.57v.08a4.55 4.55 0 0 0 3.63 4.44c-.4.08-.8.13-1.21.16l-.81-.08a4.54 4.54 0 0 0 4.2 3.15 9.56 9.56 0 0 1-5.66 1.94l-1.05-.08c2 1.27 4.38 2.02 6.94 2.02 8.3 0 12.86-6.9 12.84-12.85.02-.24 0-.43 0-.65a8.68 8.68 0 0 0 2.26-2.34c-.82.38-1.7.62-2.6.72a4.37 4.37 0 0 0 1.95-2.51c-.84.53-1.81.9-2.83 1.13z"></path></svg></button></div><div class="gy s ap"><button class="cl cm au av aw ax ay az ba bb gz ha be fx fy" aria-label="Share on linkedin"><svg width="29" height="29" viewbox="0 0 29 29" fill="none" class="hb"><path d="M5 6.36C5 5.61 5.63 5 6.4 5h16.2c.77 0 1.4.61 1.4 1.36v16.28c0 .75-.63 1.36-1.4 1.36H6.4c-.77 0-1.4-.6-1.4-1.36V6.36z"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M10.76 20.9v-8.57H7.89v8.58h2.87zm-1.44-9.75c1 0 1.63-.65 1.63-1.48-.02-.84-.62-1.48-1.6-1.48-.99 0-1.63.64-1.63 1.48 0 .83.62 1.48 1.59 1.48h.01zM12.35 20.9h2.87v-4.79c0-.25.02-.5.1-.7.2-.5.67-1.04 1.46-1.04 1.04 0 1.46.8 1.46 1.95v4.59h2.87v-4.92c0-2.64-1.42-3.87-3.3-3.87-1.55 0-2.23.86-2.61 1.45h.02v-1.24h-2.87c.04.8 0 8.58 0 8.58z" fill="#fff"></path></svg></button></div><div class="gy s ap"><button class="cl cm au av aw ax ay az ba bb gz ha be fx fy" aria-label="Share on facebook"><svg width="29" height="29" class="hb"><path d="M23.2 5H5.8a.8.8 0 0 0-.8.8V23.2c0 .44.35.8.8.8h9.3v-7.13h-2.38V13.9h2.38v-2.38c0-2.45 1.55-3.66 3.74-3.66 1.05 0 1.95.08 2.2.11v2.57h-1.5c-1.2 0-1.48.57-1.48 1.4v1.96h2.97l-.6 2.97h-2.37l.05 7.12h5.1a.8.8 0 0 0 .79-.8V5.8a.8.8 0 0 0-.8-.79"></path></svg></button></div><div class="ql s ap"><div class="hb"><span><a href="https://web.archive.org/web/20210217042021/https://medium.com/m/signin?actionUrl=%2F_%2Fbookmark%2Fp%2F44f146009e5f&operation=register&redirect=https%3A%2F%2Fmedium.com%2Fflutter%2Fannouncing-flutter-1-22-44f146009e5f&source=post_actions_footer--------------------------bookmark_footer-----------" class="cl cm au av aw ax ay az ba bb gz ha be fx fy" rel="noopener"><svg width="25" height="25" viewbox="0 0 25 25"><path d="M19 6a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v14.66h.01c.01.1.05.2.12.28a.5.5 0 0 0 .7.03l5.67-4.12 5.66 4.13a.5.5 0 0 0 .71-.03.5.5 0 0 0 .12-.29H19V6zm-6.84 9.97L7 19.64V6a1 1 0 0 1 1-1h9a1 1 0 0 1 1 1v13.64l-5.16-3.67a.49.49 0 0 0-.68 0z" fill-rule="evenodd"></path></svg></a></span></div></div></div></div></div></div><div><div class="n p"><div class="ab ac ae af ag dl ai aj"><div class="qm qn qo pe s qp z"><div class="s g"><div class="qq qr s jy"><span class="s qs am qt"><div class="s t qu qv"><a rel="noopener" href="/web/20210217042021/https://medium.com/@csells_18027?source=follow_footer-------------------------------------"><img alt="Chris Sells" class="s fj by qw" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/160/160/0*6LK838dGSbGJRtat" width="80" height="80"/></a></div><span class="s"><div class="qx s qy"><p class="cf b cg qz ra fd cj">Written by</p></div><div class="qx rb n qy"><div class="aj n o ff"><h2 class="cf id rc rd dn el"><a class="cl cm au av aw ax ay az ba bb gz ha be fx fy" rel="noopener" href="/web/20210217042021/https://medium.com/@csells_18027?source=follow_footer-------------------------------------">Chris Sells</a></h2><div class="s g"><span><button class="cf b fn ch ga re gc gd ge gf gg bb gh gi gj gk gl gm gn db go gp">Follow</button></span></div></div></div></span></span><div class="qx rf s qy bj"><div class="rg s"><p class="cf b nj rh fd">Chris Sells is a Google Product Manager on the Flutter development experience. He enjoys long walks on the beach and various technologies.</p></div><div class="ri rj bj"><span><button class="cf b fn ch ga re gc gd ge gf gg bb gh gi gj gk gl gm gn db go gp">Follow</button></span></div></div></div><div class="qm s"></div><div class="qq qr s jy"><span class="s qs am qt"><div class="s t qu qv"><a href="/web/20210217042021/https://medium.com/flutter?source=follow_footer-------------------------------------" rel="noopener"><img alt="Flutter" class="gl qw by" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/160/160/1*5-aoK8IBmXve5whBQM90GA.png" width="80" height="80"/></a></div><span class="s"><div class="qx rb n qy"><div class="aj n o ff"><h2 class="cf id rc rd dn el"><a href="/web/20210217042021/https://medium.com/flutter?source=follow_footer-------------------------------------" class="cl cm au av aw ax ay az ba bb gz ha be fx fy" rel="noopener">Flutter</a></h2><div class="s g"><div class="go" aria-hidden="false" aria-describedby="collectionFollowPopover" aria-labelledby="collectionFollowPopover"><span><button class="cf b fn ch ga re gc gd ge gf gg bb gh gi gj gk gl gm gn db go gp"><div class="n nr">Follow</div></button></span></div></div></div></div></span></span><div class="qx rk s qy bj"><div class="rg s"><p class="cf b nj rh fd">Flutter is Google's mobile UI framework for crafting high-quality native interfaces on iOS and Android in record time. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source. Learn more at https://flutter.dev</p></div><div class="ri rj bj"><div class="go" aria-hidden="false" aria-describedby="collectionFollowPopover" aria-labelledby="collectionFollowPopover"><span><button class="cf b fn ch ga re gc gd ge gf gg bb gh gi gj gk gl gm gn db go gp"><div class="n nr">Follow</div></button></span></div></div></div></div></div><div class="ri bj"><div class="rl s"><div class="n nr"><div class="rm s"><a rel="noopener" href="/web/20210217042021/https://medium.com/@csells_18027?source=follow_footer-------------------------------------"><img alt="Chris Sells" class="s fj rn ro" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/80/80/0*6LK838dGSbGJRtat" width="40" height="40"/></a></div><div class="fm s"><p class="cf b rp rq rr fd cj">Written by</p><div class="n nr"><h2 class="cf id nj ch dn el"><a class="cl cm au av aw ax ay az ba bb gz ha be fx fy" rel="noopener" href="/web/20210217042021/https://medium.com/@csells_18027?source=follow_footer-------------------------------------">Chris Sells</a></h2><div class="fm s"><span><button class="cf b cg ch ga gb gc gd ge gf gg bb gh gi gj gk gl gm gn db go gp">Follow</button></span></div></div><div class="rs s"><p class="cf b fn ch fd">Chris Sells is a Google Product Manager on the Flutter development experience. He enjoys long walks on the beach and various technologies.</p></div></div></div><div class="rl s"><div class="n nr"><a href="/web/20210217042021/https://medium.com/flutter?source=follow_footer-------------------------------------" rel="noopener"><img alt="Flutter" class="gl ro rn" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/80/80/1*5-aoK8IBmXve5whBQM90GA.png" width="40" height="40"/></a><div class="fm s"><div class="n nr"><h2 class="cf id nj ch dn el"><a href="/web/20210217042021/https://medium.com/flutter?source=follow_footer-------------------------------------" class="cl cm au av aw ax ay az ba bb gz ha be fx fy" rel="noopener">Flutter</a></h2><div class="fm s"><div class="go" aria-hidden="false" aria-describedby="collectionFollowPopover" aria-labelledby="collectionFollowPopover"><span><button class="cf b cg ch ga gb gc gd ge gf gg bb gh gi gj gk gl gm gn db go gp"><div class="n nr">Follow</div></button></span></div></div></div><div class="rs s"><p class="cf b fn ch fd">Flutter is Google's mobile UI framework for crafting high-quality native interfaces on iOS and Android in record time. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source. Learn more at https://flutter.dev</p></div></div></div></div></div></div></div></div></div><div class="s lg z"><div class="n p"><div class="ab ac ae af ag ah ai aj"><div class="rt ru s"><div class="rv nl rw ru s rx ry"><h2 class="cf id rz ep ig sa es ij et ev in ew ey ir ez fb iv el">More From Medium</h2></div><div class="bv n nr pd sb sc sd se sf sg sh si sj sk sl sm sn so sp"><div class="sq sr ss kn st su sv kp sw sx sy sz ta tb tc td te tf tg th ti"><div class="tj ly s"><div class="aj kd"><div class="n ff"><div class="s bq tk tl tm"><div class="tn s"><h2 class="cf id to tp ig tq tr ij ts tt in tu tv ir tw tx iv el"><a href="https://web.archive.org/web/20210217042021/https://pavankataria.medium.com/how-to-programmatically-setup-your-app-with-scene-delegate-in-swift-b0aab1949b?source=post_internal_links---------0----------------------------" rel="noopener">How to programmatically setup your app with Scene Delegate in Swift</a></h2></div><div class="o n"><div></div><div class="aj s"><div class="n"><div style="flex:1"><span class="cf b fn ch el"><div class="cr n o fp"><span class="cf b cg ch el"><a href="https://web.archive.org/web/20210217042021/https://pavankataria.medium.com/?source=post_internal_links---------0----------------------------" class="cl cm au av aw ax ay az ba bb fw be fx fy" rel="noopener">Pavan Kataria</a></span></div></span></div></div></div></div></div><div class="fm hc s ty tz"><a href="https://web.archive.org/web/20210217042021/https://pavankataria.medium.com/how-to-programmatically-setup-your-app-with-scene-delegate-in-swift-b0aab1949b?source=post_internal_links---------0----------------------------" class="cl cm au av aw ax ay az ba bb gz ha be fx fy s" rel="noopener"><div class="kg s jy jk"><div class="ua ki s"><div class="kb kc t u v kd aj bl ke kf"><img class="t u v kd aj kj kk kl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/60/1*VfzjpWNg5Er_rWorG3E9sA.png?q=20" width="70" height="70" role="presentation"/></div><img class="kb kc ub uc ud ue uf ug uh ui uj uk c" width="70" height="70" role="presentation"/><noscript><img class="ub uc ud ue uf ug uh ui uj uk" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/140/140/1*VfzjpWNg5Er_rWorG3E9sA.png" width="70" height="70" srcset="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/96/140/1*VfzjpWNg5Er_rWorG3E9sA.png 48w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/140/140/1*VfzjpWNg5Er_rWorG3E9sA.png 70w" sizes="70px" role="presentation"/></noscript></div></div></a></div></div></div></div></div><div class="sq sr ss kn st su sv kp sw sx sy sz ta tb tc td te tf tg th ti"><div class="tj ly s"><div class="aj kd"><div class="n ff"><div class="s bq tk tl tm"><div class="tn s"><h2 class="cf id to tp ig tq tr ij ts tt in tu tv ir tw tx iv el"><a rel="noopener" href="/web/20210217042021/https://medium.com/better-programming/data-persistence-cloudkit-b12e575bd85c?source=post_internal_links---------1----------------------------">Data Persistence — CloudKit</a></h2></div><div class="o n"><div></div><div class="aj s"><div class="n"><div style="flex:1"><span class="cf b fn ch el"><div class="cr n o fp"><span class="cf b cg ch el"><a class="cl cm au av aw ax ay az ba bb fw be fx fy" rel="noopener" href="/web/20210217042021/https://medium.com/@walkereric10?source=post_internal_links---------1----------------------------">Eric Walker</a><span> <!-- -->in<!-- --> <a href="/web/20210217042021/https://medium.com/better-programming?source=post_internal_links---------1----------------------------" class="cl cm au av aw ax ay az ba bb fw be fx fy" rel="noopener">Better Programming</a></span></span></div></span></div></div></div></div></div><div class="fm hc s ty tz"><a class="cl cm au av aw ax ay az ba bb gz ha be fx fy s" rel="noopener" href="/web/20210217042021/https://medium.com/better-programming/data-persistence-cloudkit-b12e575bd85c?source=post_internal_links---------1----------------------------"><div class="kg s jy jk"><div class="ua ki s"><div class="kb kc t u v kd aj bl ke kf"><img class="t u v kd aj kj kk kl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/60/1*6iv1W7BRXnNrmYkqwxKRiQ.png?q=20" width="70" height="70" role="presentation"/></div><img class="kb kc ub uc ud ue uf ug uh ui uj uk c" width="70" height="70" role="presentation"/><noscript><img class="ub uc ud ue uf ug uh ui uj uk" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/140/140/1*6iv1W7BRXnNrmYkqwxKRiQ.png" width="70" height="70" srcset="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/96/140/1*6iv1W7BRXnNrmYkqwxKRiQ.png 48w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/140/140/1*6iv1W7BRXnNrmYkqwxKRiQ.png 70w" sizes="70px" role="presentation"/></noscript></div></div></a></div></div></div></div></div><div class="sq sr ss kn st su sv kp sw sx sy sz ta tb tc td te tf tg th ti"><div class="tj ly s"><div class="aj kd"><div class="n ff"><div class="s bq tk tl tm"><div class="tn s"><h2 class="cf id to tp ig tq tr ij ts tt in tu tv ir tw tx iv el"><a rel="noopener" href="/web/20210217042021/https://medium.com/better-programming/lets-build-a-circular-loading-indicator-in-swift-5-b06fcdf1260d?source=post_internal_links---------2----------------------------">Let’s Build a Circular Loading Indicator in Swift 5</a></h2></div><div class="o n"><div></div><div class="aj s"><div class="n"><div style="flex:1"><span class="cf b fn ch el"><div class="cr n o fp"><span class="cf b cg ch el"><a class="cl cm au av aw ax ay az ba bb fw be fx fy" rel="noopener" href="/web/20210217042021/https://medium.com/@z.ivaev?source=post_internal_links---------2----------------------------">Zafar Ivaev</a><span> <!-- -->in<!-- --> <a href="/web/20210217042021/https://medium.com/better-programming?source=post_internal_links---------2----------------------------" class="cl cm au av aw ax ay az ba bb fw be fx fy" rel="noopener">Better Programming</a></span></span></div></span></div></div></div></div></div><div class="fm hc s ty tz"><a class="cl cm au av aw ax ay az ba bb gz ha be fx fy s" rel="noopener" href="/web/20210217042021/https://medium.com/better-programming/lets-build-a-circular-loading-indicator-in-swift-5-b06fcdf1260d?source=post_internal_links---------2----------------------------"><div class="kg s jy jk"><div class="ua ki s"><div class="kb kc t u v kd aj bl ke kf"><img class="t u v kd aj kj kk kl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/60/0*rue3iyd6wBOgUFaK?q=20" width="70" height="70" role="presentation"/></div><img class="kb kc ub uc ud ue uf ug uh ui uj uk c" width="70" height="70" role="presentation"/><noscript><img class="ub uc ud ue uf ug uh ui uj uk" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/140/140/0*rue3iyd6wBOgUFaK" width="70" height="70" srcset="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/96/140/0*rue3iyd6wBOgUFaK 48w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/140/140/0*rue3iyd6wBOgUFaK 70w" sizes="70px" role="presentation"/></noscript></div></div></a></div></div></div></div></div><div class="sq sr ss kn st su sv kp sw sx sy sz ta tb tc td te tf tg th ti"><div class="tj ly s"><div class="aj kd"><div class="n ff"><div class="s bq tk tl tm"><div class="tn s"><h2 class="cf id to tp ig tq tr ij ts tt in tu tv ir tw tx iv el"><a rel="noopener" href="/web/20210217042021/https://medium.com/swlh/closure-in-swift-b074ef4242de?source=post_internal_links---------3----------------------------">Closure in Swift {}</a></h2></div><div class="o n"><div></div><div class="aj s"><div class="n"><div style="flex:1"><span class="cf b fn ch el"><div class="cr n o fp"><span class="cf b cg ch el"><a class="cl cm au av aw ax ay az ba bb fw be fx fy" rel="noopener" href="/web/20210217042021/https://medium.com/@amr.raafat.89?source=post_internal_links---------3----------------------------">Amr Omran</a><span> <!-- -->in<!-- --> <a href="/web/20210217042021/https://medium.com/swlh?source=post_internal_links---------3----------------------------" class="cl cm au av aw ax ay az ba bb fw be fx fy" rel="noopener">The Startup</a></span></span></div></span></div></div></div></div></div><div class="fm hc s ty tz"><a class="cl cm au av aw ax ay az ba bb gz ha be fx fy s" rel="noopener" href="/web/20210217042021/https://medium.com/swlh/closure-in-swift-b074ef4242de?source=post_internal_links---------3----------------------------"><div class="kg s jy jk"><div class="ua ki s"><div class="kb kc t u v kd aj bl ke kf"><img class="t u v kd aj kj kk kl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/60/1*1kwExAXA4lNas7zYeAe3nQ.jpeg?q=20" width="70" height="70" role="presentation"/></div><img class="kb kc ub uc ud ue uf ug uh ui uj uk c" width="70" height="70" role="presentation"/><noscript><img class="ub uc ud ue uf ug uh ui uj uk" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/140/140/1*1kwExAXA4lNas7zYeAe3nQ.jpeg" width="70" height="70" srcset="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/96/140/1*1kwExAXA4lNas7zYeAe3nQ.jpeg 48w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/140/140/1*1kwExAXA4lNas7zYeAe3nQ.jpeg 70w" sizes="70px" role="presentation"/></noscript></div></div></a></div></div></div></div></div><div class="sq sr ss kn st su sv kp sw sx sy sz ta tb tc td te tf tg th ti"><div class="tj ly s"><div class="aj kd"><div class="n ff"><div class="s bq tk tl tm"><div class="tn s"><h2 class="cf id to tp ig tq tr ij ts tt in tu tv ir tw tx iv el"><a rel="noopener" href="/web/20210217042021/https://medium.com/better-programming/using-ios-14s-menu-as-a-picker-in-swiftui-b036c772037?source=post_internal_links---------4----------------------------">Using iOS 14’s Menu as a Picker in SwiftUI</a></h2></div><div class="o n"><div></div><div class="aj s"><div class="n"><div style="flex:1"><span class="cf b fn ch el"><div class="cr n o fp"><span class="cf b cg ch el"><a class="cl cm au av aw ax ay az ba bb fw be fx fy" rel="noopener" href="/web/20210217042021/https://medium.com/@imthathullah?source=post_internal_links---------4----------------------------">Imthathullah</a><span> <!-- -->in<!-- --> <a href="/web/20210217042021/https://medium.com/better-programming?source=post_internal_links---------4----------------------------" class="cl cm au av aw ax ay az ba bb fw be fx fy" rel="noopener">Better Programming</a></span></span></div></span></div></div></div></div></div><div class="fm hc s ty tz"><a class="cl cm au av aw ax ay az ba bb gz ha be fx fy s" rel="noopener" href="/web/20210217042021/https://medium.com/better-programming/using-ios-14s-menu-as-a-picker-in-swiftui-b036c772037?source=post_internal_links---------4----------------------------"><div class="kg s jy jk"><div class="ua ki s"><div class="kb kc t u v kd aj bl ke kf"><img class="t u v kd aj kj kk kl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/60/1*RM2QEC1OejmADHcAqP5lQw.jpeg?q=20" width="70" height="70" role="presentation"/></div><img class="kb kc ub uc ud ue uf ug uh ui uj uk c" width="70" height="70" role="presentation"/><noscript><img class="ub uc ud ue uf ug uh ui uj uk" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/140/140/1*RM2QEC1OejmADHcAqP5lQw.jpeg" width="70" height="70" srcset="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/96/140/1*RM2QEC1OejmADHcAqP5lQw.jpeg 48w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/140/140/1*RM2QEC1OejmADHcAqP5lQw.jpeg 70w" sizes="70px" role="presentation"/></noscript></div></div></a></div></div></div></div></div><div class="sq sr ss kn st su sv kp sw sx sy sz ta tb tc td te tf tg th ti"><div class="tj ly s"><div class="aj kd"><div class="n ff"><div class="s bq tk tl tm"><div class="tn s"><h2 class="cf id to tp ig tq tr ij ts tt in tu tv ir tw tx iv el"><a rel="noopener" href="/web/20210217042021/https://medium.com/@vatsalrustagi/ios-refactoring-in-swift-identifiers-b14d9fff20c3?source=post_internal_links---------5----------------------------">iOS — Refactoring in Swift: Identifiers!</a></h2></div><div class="o n"><div></div><div class="aj s"><div class="n"><div style="flex:1"><span class="cf b fn ch el"><div class="cr n o fp"><span class="cf b cg ch el"><a class="cl cm au av aw ax ay az ba bb fw be fx fy" rel="noopener" href="/web/20210217042021/https://medium.com/@vatsalrustagi?source=post_internal_links---------5----------------------------">Vatsal Rustagi</a></span></div></span></div></div></div></div></div><div class="fm hc s ty tz"><a class="cl cm au av aw ax ay az ba bb gz ha be fx fy s" rel="noopener" href="/web/20210217042021/https://medium.com/@vatsalrustagi/ios-refactoring-in-swift-identifiers-b14d9fff20c3?source=post_internal_links---------5----------------------------"><div class="kg s jy jk"><div class="ua ki s"><div class="kb kc t u v kd aj bl ke kf"><img class="t u v kd aj kj kk kl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/60/1*bAfkfu8JYEYhnVjo9AZHDg.png?q=20" width="70" height="70" role="presentation"/></div><img class="kb kc ub uc ud ue uf ug uh ui uj uk c" width="70" height="70" role="presentation"/><noscript><img class="ub uc ud ue uf ug uh ui uj uk" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/140/140/1*bAfkfu8JYEYhnVjo9AZHDg.png" width="70" height="70" srcset="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/96/140/1*bAfkfu8JYEYhnVjo9AZHDg.png 48w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/140/140/1*bAfkfu8JYEYhnVjo9AZHDg.png 70w" sizes="70px" role="presentation"/></noscript></div></div></a></div></div></div></div></div><div class="sq sr ss kn st su sv kp sw sx sy sz ta tb tc td te tf tg th ti"><div class="tj ly s"><div class="aj kd"><div class="n ff"><div class="s bq tk tl tm"><div class="tn s"><h2 class="cf id to tp ig tq tr ij ts tt in tu tv ir tw tx iv el"><a rel="noopener" href="/web/20210217042021/https://medium.com/swift-productions/sdwebimageswiftui-image-from-url-b0960f0bda64?source=post_internal_links---------6----------------------------">Image from Remote URL Using SDWebImageSwiftUI</a></h2></div><div class="o n"><div></div><div class="aj s"><div class="n"><div style="flex:1"><span class="cf b fn ch el"><div class="cr n o fp"><span class="cf b cg ch el"><a href="https://web.archive.org/web/20210217042021/https://sullivan-decarli.medium.com/?source=post_internal_links---------6----------------------------" class="cl cm au av aw ax ay az ba bb fw be fx fy" rel="noopener">Sullivan De Carli</a><span> <!-- -->in<!-- --> <a href="/web/20210217042021/https://medium.com/swift-productions?source=post_internal_links---------6----------------------------" class="cl cm au av aw ax ay az ba bb fw be fx fy" rel="noopener">Swift Productions</a></span></span></div></span></div></div></div></div></div><div class="fm hc s ty tz"><a class="cl cm au av aw ax ay az ba bb gz ha be fx fy s" rel="noopener" href="/web/20210217042021/https://medium.com/swift-productions/sdwebimageswiftui-image-from-url-b0960f0bda64?source=post_internal_links---------6----------------------------"><div class="kg s jy jk"><div class="ua ki s"><div class="kb kc t u v kd aj bl ke kf"><img class="t u v kd aj kj kk kl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/60/1*vc-tY9pvNvXAES-61Yra1g.png?q=20" width="70" height="70" role="presentation"/></div><img class="kb kc ub uc ud ue uf ug uh ui uj uk c" width="70" height="70" role="presentation"/><noscript><img class="ub uc ud ue uf ug uh ui uj uk" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/140/140/1*vc-tY9pvNvXAES-61Yra1g.png" width="70" height="70" srcset="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/96/140/1*vc-tY9pvNvXAES-61Yra1g.png 48w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/140/140/1*vc-tY9pvNvXAES-61Yra1g.png 70w" sizes="70px" role="presentation"/></noscript></div></div></a></div></div></div></div></div><div class="sq sr ss kn st su sv kp sw sx sy sz ta tb tc td te tf tg th ti"><div class="tj ly s"><div class="aj kd"><div class="n ff"><div class="s bq tk tl tm"><div class="tn s"><h2 class="cf id to tp ig tq tr ij ts tt in tu tv ir tw tx iv el"><a rel="noopener" href="/web/20210217042021/https://medium.com/better-programming/the-proper-way-of-creating-a-transparent-gradient-layer-in-ios-b082daa866b1?source=post_internal_links---------7----------------------------">The Proper Way to Create Transparent Gradient Layers in iOS</a></h2></div><div class="o n"><div></div><div class="aj s"><div class="n"><div style="flex:1"><span class="cf b fn ch el"><div class="cr n o fp"><span class="cf b cg ch el"><a href="https://web.archive.org/web/20210217042021/https://joao-sampaio.medium.com/?source=post_internal_links---------7----------------------------" class="cl cm au av aw ax ay az ba bb fw be fx fy" rel="noopener">João R.G. Sampaio</a><span> <!-- -->in<!-- --> <a href="/web/20210217042021/https://medium.com/better-programming?source=post_internal_links---------7----------------------------" class="cl cm au av aw ax ay az ba bb fw be fx fy" rel="noopener">Better Programming</a></span></span></div></span></div></div></div></div></div><div class="fm hc s ty tz"><a class="cl cm au av aw ax ay az ba bb gz ha be fx fy s" rel="noopener" href="/web/20210217042021/https://medium.com/better-programming/the-proper-way-of-creating-a-transparent-gradient-layer-in-ios-b082daa866b1?source=post_internal_links---------7----------------------------"><div class="kg s jy jk"><div class="ua ki s"><div class="kb kc t u v kd aj bl ke kf"><img class="t u v kd aj kj kk kl" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/60/1*jVlRvqxtbbto8OlTeyCBcQ.jpeg?q=20" width="70" height="70" role="presentation"/></div><img class="kb kc ub uc ud ue uf ug uh ui uj uk c" width="70" height="70" role="presentation"/><noscript><img class="ub uc ud ue uf ug uh ui uj uk" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/140/140/1*jVlRvqxtbbto8OlTeyCBcQ.jpeg" width="70" height="70" srcset="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/96/140/1*jVlRvqxtbbto8OlTeyCBcQ.jpeg 48w, https://web.archive.org/web/20210217042021im_/https://miro.medium.com/fit/c/140/140/1*jVlRvqxtbbto8OlTeyCBcQ.jpeg 70w" sizes="70px" role="presentation"/></noscript></div></div></a></div></div></div></div></div></div></div></div></div></div></div></div></div><div class="ul s um un"><div class="n p"><div class="ab ac ae af ag ah ai aj"><div class="uo up qq n ff g"><div class="uq n ff"><div class="ur s us"><div class="tn s"><a href="https://web.archive.org/web/20210217042021/https://medium.com/about?autoplay=1&source=post_page-----44f146009e5f--------------------------------" class="cl cm au av aw ax ay az ba bb ut uu be uv uw" rel="noopener"><h2 class="cf id ux rh dn uy">Learn more.</h2></a></div><p class="cf b fn ch uz">Medium<!-- --> is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface.<!-- --> <a href="https://web.archive.org/web/20210217042021/https://medium.com/about?autoplay=1&source=post_page-----44f146009e5f--------------------------------" class="cl cm au av aw ax ay az ba bb be uv uw ia" rel="noopener">Learn more</a></p></div><div class="ur s us"><div class="tn s"><a href="https://web.archive.org/web/20210217042021/https://medium.com/topics?source=post_page-----44f146009e5f--------------------------------" class="cl cm au av aw ax ay az ba bb ut uu be uv uw" rel="noopener"><h2 class="cf id ux rh dn uy">Make <!-- -->Medium<!-- --> yours.</h2></a></div><p class="cf b fn ch uz">Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox.<!-- --> <a href="https://web.archive.org/web/20210217042021/https://medium.com/topics?source=post_page-----44f146009e5f--------------------------------" class="cl cm au av aw ax ay az ba bb be uv uw ia" rel="noopener">Explore</a></p></div><div class="ur s us"><div class="tn s"><a href="https://web.archive.org/web/20210217042021/https://about.medium.com/creators/?source=post_page-----44f146009e5f--------------------------------" class="cl cm au av aw ax ay az ba bb ut uu be uv uw" rel="noopener"><h2 class="cf id ux rh dn uy">Share your thinking.</h2></a></div><p class="cf b fn ch uz">If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic.<!-- --> <a href="https://web.archive.org/web/20210217042021/https://about.medium.com/creators/?source=post_page-----44f146009e5f--------------------------------" class="cl cm au av aw ax ay az ba bb be uv uw ia" rel="noopener">Write on <!-- -->Medium</a></p></div></div></div><div class="n ni"><div class="n o ff"><a class="cl cm au av aw ax ay az ba bb ut uu be uv uw" rel="noopener" href="/web/20210217042021/https://medium.com/?source=post_page-----44f146009e5f--------------------------------"><svg viewbox="0 0 3940 610" class="gc va"><path d="M594.79 308.2c0 163.76-131.85 296.52-294.5 296.52S5.8 472 5.8 308.2 137.65 11.69 300.29 11.69s294.5 132.75 294.5 296.51M917.86 308.2c0 154.16-65.93 279.12-147.25 279.12s-147.25-125-147.25-279.12S689.29 29.08 770.61 29.08s147.25 125 147.25 279.12M1050 308.2c0 138.12-23.19 250.08-51.79 250.08s-51.79-112-51.79-250.08 23.19-250.08 51.8-250.08S1050 170.09 1050 308.2M1862.77 37.4l.82-.18v-6.35h-167.48l-155.51 365.5-155.51-365.5h-180.48v6.35l.81.18c30.57 6.9 46.09 17.19 46.09 54.3v434.45c0 37.11-15.58 47.4-46.15 54.3l-.81.18V587H1327v-6.35l-.81-.18c-30.57-6.9-46.09-17.19-46.09-54.3V116.9L1479.87 587h11.33l205.59-483.21V536.9c-2.62 29.31-18 38.36-45.68 44.61l-.82.19v6.3h213.3v-6.3l-.82-.19c-27.71-6.25-43.46-15.3-46.08-44.61l-.14-445.2h.14c0-37.11 15.52-47.4 46.08-54.3m97.43 287.8c3.49-78.06 31.52-134.4 78.56-135.37 14.51.24 26.68 5 36.14 14.16 20.1 19.51 29.55 60.28 28.09 121.21zm-2.11 22h250v-1.05c-.71-59.69-18-106.12-51.34-138-28.82-27.55-71.49-42.71-116.31-42.71h-1c-23.26 0-51.79 5.64-72.09 15.86-23.11 10.7-43.49 26.7-60.45 47.7-27.3 33.83-43.84 79.55-47.86 130.93-.13 1.54-.24 3.08-.35 4.62s-.18 2.92-.25 4.39a332.64 332.64 0 0 0-.36 21.69C1860.79 507 1923.65 600 2035.3 600c98 0 155.07-71.64 169.3-167.8l-7.19-2.53c-25 51.68-69.9 83-121 79.18-69.76-5.22-123.2-75.95-118.35-161.63m532.69 157.68c-8.2 19.45-25.31 30.15-48.24 30.15s-43.89-15.74-58.78-44.34c-16-30.7-24.42-74.1-24.42-125.51 0-107 33.28-176.21 84.79-176.21 21.57 0 38.55 10.7 46.65 29.37zm165.84 76.28c-30.57-7.23-46.09-18-46.09-57V5.28L2424.77 60v6.7l1.14-.09c25.62-2.07 43 1.47 53.09 10.79 7.9 7.3 11.75 18.5 11.75 34.26v71.14c-18.31-11.69-40.09-17.38-66.52-17.38-53.6 0-102.59 22.57-137.92 63.56-36.83 42.72-56.3 101.1-56.3 168.81C2230 518.72 2289.53 600 2378.13 600c51.83 0 93.53-28.4 112.62-76.3V588h166.65v-6.66zm159.29-505.33c0-37.76-28.47-66.24-66.24-66.24-37.59 0-67 29.1-67 66.24s29.44 66.24 67 66.24c37.77 0 66.24-28.48 66.24-66.24m43.84 505.33c-30.57-7.23-46.09-18-46.09-57h-.13V166.65l-166.66 47.85v6.5l1 .09c36.06 3.21 45.93 15.63 45.93 57.77V588h166.8v-6.66zm427.05 0c-30.57-7.23-46.09-18-46.09-57V166.65L3082 212.92v6.52l.94.1c29.48 3.1 38 16.23 38 58.56v226c-9.83 19.45-28.27 31-50.61 31.78-36.23 0-56.18-24.47-56.18-68.9V166.66l-166.66 47.85V221l1 .09c36.06 3.2 45.94 15.62 45.94 57.77v191.27a214.48 214.48 0 0 0 3.47 39.82l3 13.05c14.11 50.56 51.08 77 109 77 49.06 0 92.06-30.37 111-77.89v66h166.66v-6.66zM3934.2 588v-6.67l-.81-.19c-33.17-7.65-46.09-22.07-46.09-51.43v-243.2c0-75.83-42.59-121.09-113.93-121.09-52 0-95.85 30.05-112.73 76.86-13.41-49.6-52-76.86-109.06-76.86-50.12 0-89.4 26.45-106.25 71.13v-69.87l-166.66 45.89v6.54l1 .09c35.63 3.16 45.93 15.94 45.93 57V588h155.5v-6.66l-.82-.2c-26.46-6.22-35-17.56-35-46.66V255.72c7-16.35 21.11-35.72 49-35.72 34.64 0 52.2 24 52.2 71.28V588h155.54v-6.66l-.82-.2c-26.46-6.22-35-17.56-35-46.66v-248a160.45 160.45 0 0 0-2.2-27.68c7.42-17.77 22.34-38.8 51.37-38.8 35.13 0 52.2 23.31 52.2 71.28V588z"></path></svg></a><p class="cf b fn ch uz"><div class="rs vb n ff vc am"><p class="cf b nj rh uy"><a href="https://web.archive.org/web/20210217042021/https://medium.com/about?autoplay=1&source=post_page-----44f146009e5f--------------------------------" class="cl cm au av aw ax ay az ba bb fw be uv uw" rel="noopener">About</a></p><p class="cf b nj rh uy"><a href="https://web.archive.org/web/20210217042021/https://help.medium.com/hc/en-us?source=post_page-----44f146009e5f--------------------------------" class="cl cm au av aw ax ay az ba bb fw be uv uw" rel="noopener">Help</a></p><p class="cf b nj rh uy"><a href="https://web.archive.org/web/20210217042021/https://policy.medium.com/medium-terms-of-service-9db0094a1e0f?source=post_page-----44f146009e5f--------------------------------" class="cl cm au av aw ax ay az ba bb fw be uv uw" rel="noopener">Legal</a></p></div></p></div><div class="ri vd ve am"><p class="cf b nj rh uz">Get the Medium app</p></div><div class="ri vd vf am vg"><div class="vh s"><a href="https://web.archive.org/web/20210217042021/https://itunes.apple.com/app/medium-everyones-stories/id828256236?pt=698524&mt=8&ct=post_page&source=post_page-----44f146009e5f--------------------------------" class="cl cm au av aw ax ay az ba bb ut uu be uv uw" rel="noopener nofollow"><img alt="A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store" class="" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/270/1*Crl55Tm6yDNMoucPo1tvDg.png" width="135" height="41"/></a></div><div class="s"><a href="https://web.archive.org/web/20210217042021/https://play.google.com/store/apps/details?id=com.medium.reader&source=post_page-----44f146009e5f--------------------------------" class="cl cm au av aw ax ay az ba bb ut uu be uv uw" rel="noopener nofollow"><img alt="A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store" class="" src="https://web.archive.org/web/20210217042021im_/https://miro.medium.com/max/270/1*W_RAPQ62h0em559zluJLdQ.png" width="135" height="41"/></a></div></div></div></div></div></div></div></div></div><script>window.__BUILD_ID__ = "main-20210216-205845-4f62e5873e"</script><script>window.__GRAPHQL_URI__ = "https://web.archive.org/web/20210217042021/https://medium.com/_/graphql"</script><script>window.__PRELOADED_STATE__ = {"auroraPage":{"isAuroraPageEnabled":false},"bookReader":{"reader":{"currentAsset":null}},"cache":{"experimentGroupSet":true,"group":"control","tags":[],"serverVariantState":""},"client":{"isBot":false,"isEu":false,"isUs":false,"isNativeMedium":false,"isSafariMobile":false,"isSafari":false,"inAppBrowserName":"","routingEntity":{"type":"DEFAULT","explicit":false},"supportsWebp":true},"config":{"nodeEnv":"production","version":"main-20210216-205845-4f62e5873e","isTaggedVersion":false,"target":"production","productName":"Medium","publicUrl":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fcdn-client.medium.com\u002Flite","authDomain":"medium.com","authGoogleClientId":"216296035834-k1k6qe060s2tp2a2jam4ljdcms00sttg.apps.googleusercontent.com","favicon":"production","glyphUrl":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fglyph.medium.com","branchKey":"key_live_ofxXr2qTrrU9NqURK8ZwEhknBxiI6KBm","lightStep":{"name":"lite-web","host":"lightstep.medium.systems","token":"ce5be895bef60919541332990ac9fef2","appVersion":"main-20210216-205845-4f62e5873e"},"algolia":{"appId":"MQ57UUUQZ2","apiKeySearch":"394474ced050e3911ae2249ecc774921","indexPrefix":"medium_","host":"-dsn.algolia.net"},"recaptchaKey":"6Lfc37IUAAAAAKGGtC6rLS13R1Hrw_BqADfS1LRk","recaptcha3Key":"6Lf8R9wUAAAAABMI_85Wb8melS7Zj6ziuf99Yot5","datadog":{"clientToken":"pub853ea8d17ad6821d9f8f11861d23dfed","context":{"deployment":{"target":"production","tag":"main-20210216-205845-4f62e5873e","commit":"4f62e5873e43d647787d3aff07bc6988a4fa884a"}},"datacenter":"us"},"isAmp":false,"googleAnalyticsCode":"UA-24232453-2","signInWallCustomDomainCollectionIds":["3a8144eabfe3","336d898217ee","61061eb0c96b","138adf9c44c","819cc2aaeee0"],"mediumOwnedAndOperatedCollectionIds":["544c7006046e","bcc38c8f6edf","444d13b52878","8d6b8a439e32","92d2092dc598","1285ba81cada","cb8577c9149e","8ccfed20cbb2","ae2a65f35510","3f6ecf56618","7b6769f2748b","fc8964313712","ef8e90590e66","191186aaafa0","d944778ce714","bdc4052bbdba","88d9857e584e","9dc80918cc93","8a9336e5bb4","cef6983b292","54c98c43354d","193b68bd4fba","b7e45b22fec3","55760f21cdc5"],"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"],"defaultImages":{"avatar":{"imageId":"1*dmbNkD5D-u45r44go_cf0g.png","height":150,"width":150},"orgLogo":{"imageId":"1*OMF3fSqH8t4xBJ9-6oZDZw.png","height":106,"width":545},"postLogo":{"imageId":"1*kFrc4tBFM_tCis-2Ic87WA.png","height":810,"width":1440},"postPreviewImage":{"imageId":"1*hn4v1tCaJy7cWMyb0bpNpQ.png","height":386,"width":579}},"performanceTags":[],"collectionStructuredData":{"8d6b8a439e32":{"name":"Elemental","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\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\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\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\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmiro.medium.com\u002Fmax\u002F264\u002F1*RdVZMdvfV3YiZTw6mX7yWA.png","width":264,"height":140}}},"88d9857e584e":{"name":"LEVEL","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*JqYMhNX6KNNb2UlqGqO2WQ.png","width":540,"height":108}}},"7b6769f2748b":{"name":"Marker","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\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\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*cw32fIqCbRWzwJaoQw6BUg.png","width":540,"height":123}}},"8ccfed20cbb2":{"name":"Zora","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\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\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\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\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Fcategories\u002F201931128-Policies-Safety"},{"start":125,"end":132,"href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\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\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmedium.com\u002Fmembership"},{"start":138,"end":145,"href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\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\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmedium.com\u002Fmembership"},{"start":127,"end":134,"href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\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\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fcookpolitical.com\u002F2020-national-popular-vote-tracker"}]},"EXCLUDE_POSTS":["397ef29e3ca5"]},"embedPostRules":[],"recircOptions":{"v1":{"limit":3},"v2":{"limit":8}},"braintreeClientKey":"production_zjkj96jm_m56f8fqpf7ngnrd4","paypalClientId":"AXj1G4fotC2GE8KzWX9mSxCH1wmPE3nJglf4Z2ig_amnhvlMVX87otaq58niAg9iuLktVNF_1WCMnN7v","stripePublishableKey":"pk_live_7FReX44VnNIInZwrIIx6ghjl","errorTracking":"none"},"debug":{"requestId":"ec5f0c3b-c1e8-4fae-8b00-0d69b0474665","branchDeployConfig":null,"originalSpanCarrier":{"ot-tracer-spanid":"6c3c98224363271e","ot-tracer-traceid":"e6da037852e4759","ot-tracer-sampled":"true"}},"multiVote":{"clapsPerPost":{}},"navigation":{"branch":{"show":null,"hasRendered":null,"blockedByCTA":false},"hideGoogleOneTap":false,"hasRenderedGoogleOneTap":null,"hasRenderedAlternateUserBanner":null,"currentLocation":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmedium.com\u002Fflutter\u002Fannouncing-flutter-1-22-44f146009e5f","host":"medium.com","hostname":"medium.com","susiModal":{"step":null,"operation":"register"},"postRead":false},"session":{"user":{"id":"lo_4e4ce405e06f"},"xsrf":"","isSpoofed":false},"tracing":{}}</script><script>window.__APOLLO_STATE__ = {"ROOT_QUERY":{"__typename":"Query","variantFlags":[{"__typename":"VariantFlag","name":"allow_access","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"allow_signup","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"allow_test_auth","valueType":{"__typename":"VariantFlagString","value":"disallow"}},{"__typename":"VariantFlag","name":"android_enable_lock_responses","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"assign_default_topic_to_posts","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"available_annual_plan","valueType":{"__typename":"VariantFlagString","value":"2c754bcc2995"}},{"__typename":"VariantFlag","name":"available_monthly_plan","valueType":{"__typename":"VariantFlagString","value":"60e220181034"}},{"__typename":"VariantFlag","name":"bane_add_user","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"bane_verify_domain","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"branch_seo_metadata","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"browsable_stream_config_bucket","valueType":{"__typename":"VariantFlagString","value":"curated-topics"}},{"__typename":"VariantFlag","name":"coronavirus_topic_recirc","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"covid_19_cdc_banner","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"default_seo_post_titles","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"digest_delivery_window_one_hour_after","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"disable_android_subscription_activity_carousel","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"disable_ios_resume_reading_toast","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"disable_ios_subscription_activity_carousel","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"disable_mobile_featured_chunk","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"disable_post_recommended_from_friends_provider","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_android_local_currency","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_annual_renewal_reminder_email","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_app_flirty_thirty","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_apple_parse_expires_at","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_apple_sign_in","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_apple_webhook","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_apple_webhook_renewal_failure","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_aurora_about_page_routing","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_aurora_general_admission","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_aurora_nav","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_aurora_profile_page","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_aurora_pub_follower_page","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_aurora_recirc","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_aurora_sticky_nav","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_aurora_tag_page_routing","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_author_autotier","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_author_cards","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_automated_mission_control_triggers","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_braintree_apple_pay","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_braintree_client","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_braintree_integration","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_braintree_paypal","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_braintree_trial_membership","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_braintree_webhook","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_branch_io","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_branch_text_me_the_app","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_branding","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_branding_fonts","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_cleansweep_double_writes","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_client_error_tracking","valueType":{"__typename":"VariantFlagString","value":"none"}},{"__typename":"VariantFlag","name":"enable_confirm_sign_in","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_cta_meter","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_curation_priority_queue_experiment","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_custom_domain_v2_settings","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_dedicated_series_tab_api_ios","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_digest_feature_logging","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_digest_tagline","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_earn_redirect","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_edit_alt_text","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_email_sign_in_captcha","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_email_to_subscribers_after_publish","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_embedding_based_diversification","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_end_of_post_cleanup","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_evhead_com_to_ev_medium_com_redirect","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_expanded_feature_chunk_pool","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_filter_by_resend_rules","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_filter_expire_processor","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_footer_app_buttons","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_fyf_authors_and_collections","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_global_susi_modal","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_google_one_tap","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_google_webhook","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_google_webhook_subscription_cancelled","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_highlander_member_digest","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_hightower_user_minimum_guarantee","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_homepage_who_to_follow_module","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_homepage_write_button","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_increased_digest_timeout","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_ios_post_stats","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_json_logs_trained_ranker","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_kbfd_rex","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_kbfd_rex_app_highlights","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_kbfd_rex_daily_digest","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_lite_homepage","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_lite_homepage_feed","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_lite_notifications","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_lite_pay_page","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_lite_post","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_lite_post_cd","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_lite_pub_homepage_for_selected_domains","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_lite_publish_to_profile","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_lite_server_upstream_deadlines","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_lite_stories","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_lite_threaded_responses","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_lite_topics","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_lite_unread_notification_count_mutation","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_lock_responses","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_login_code_flow","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_marketing_emails","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_media_resource_try_catch","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_medium2_kbfd","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_membership_remove_section_a","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_miro_on_kubernetes","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_mission_control","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_ml_rank_modules","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_ml_rank_rex_anno","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_mute","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_new_checkout_flow","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_new_collaborative_filtering_data","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_new_login_flow","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_new_three_dot_menu","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_parsely","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_patronus_on_kubernetes","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_popularity_feature","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_post_import","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_post_page_nav_stickiness_removal","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_post_settings_screen","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_primary_topic_for_mobile","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_profile_design_reminder","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_profile_page_seo_titles","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_publish_to_email_for_publication_posts","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_receipt_notes","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_responses_2","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_responses_all","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_responses_edit_and_delete","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_responses_moderation","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_rex_follow_feed_cache","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_rito_upstream_deadlines","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_rtr_channel","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_s3_sites","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_save_to_medium","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_signup_friction","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_starspace","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_starspace_ranker_starspace","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_tick_landing_page","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_tipalti_onboarding","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_trending_posts_diversification","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_tribute_landing_page","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_triton_predictions","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_trumpland_landing_page","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_twitter_auth_suggestions","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_untruncated_author_post_as_email","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"glyph_font_set","valueType":{"__typename":"VariantFlagString","value":"m2-unbound"}},{"__typename":"VariantFlag","name":"google_sign_in_android","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"ios_enable_generic_home_modules","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"ios_enable_home_post_menu","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"ios_enable_iceland_paywall","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"ios_enable_lock_responses","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"ios_iceland_nux","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"ios_pub_follow_email_opt_in","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"is_not_medium_subscriber","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"kill_fastrak","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"kill_stripe_express","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"limit_post_referrers","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"limit_user_follows","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"make_nav_sticky","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"new_transition_page","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"provider_for_credit_card_form","valueType":{"__typename":"VariantFlagString","value":"BRAINTREE"}},{"__typename":"VariantFlag","name":"pub_sidebar","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"redefine_average_post_reading_time","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"remove_post_post_similarity","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"retrained_ranker","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"sign_up_with_email_button","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"signin_services","valueType":{"__typename":"VariantFlagString","value":"twitter,facebook,google,email,google-fastidv,google-one-tap,apple"}},{"__typename":"VariantFlag","name":"signup_services","valueType":{"__typename":"VariantFlagString","value":"twitter,facebook,google,email,google-fastidv,google-one-tap,apple"}},{"__typename":"VariantFlag","name":"skip_sign_in_recaptcha","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"suppress_apple_missing_expires_date_alert","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"use_new_admin_topic_backend","valueType":{"__typename":"VariantFlagBoolean","value":true}}],"viewer":null,"visitor":{"__ref":"Visitor:lo_4e4ce405e06f"},"meterPost({\"postId\":\"44f146009e5f\",\"postMeteringOptions\":{}})":{"__ref":"MeteringInfo:{}"},"postResult({\"id\":\"44f146009e5f\"})":{"__ref":"Post:44f146009e5f"}},"Visitor:lo_4e4ce405e06f":{"id":"lo_4e4ce405e06f","__typename":"Visitor"},"MeteringInfo:{}":{"__typename":"MeteringInfo","postIds":[],"maxUnlockCount":3,"unlocksRemaining":3},"ImageMetadata:":{"id":"","__typename":"ImageMetadata"},"ImageMetadata:1*KvnfbD1F5CzEsU9wSmRZyA.png":{"id":"1*KvnfbD1F5CzEsU9wSmRZyA.png","__typename":"ImageMetadata","originalWidth":538,"originalHeight":141},"User:4631513e40c0":{"id":"4631513e40c0","__typename":"User"},"ImageMetadata:1*5-aoK8IBmXve5whBQM90GA.png":{"id":"1*5-aoK8IBmXve5whBQM90GA.png","__typename":"ImageMetadata"},"Collection:4da7dfd21a33":{"id":"4da7dfd21a33","__typename":"Collection","domain":null,"googleAnalyticsId":null,"slug":"flutter","colorBehavior":"ACCENT_COLOR_AND_FILL_BACKGROUND","isAuroraVisible":false,"favicon":{"__ref":"ImageMetadata:"},"name":"Flutter","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}]}},"customStyleSheet":null,"tagline":"Flutter is Google's mobile UI framework for crafting…","isAuroraEligible":false,"viewerIsEditor":false,"logo":{"__ref":"ImageMetadata:1*KvnfbD1F5CzEsU9wSmRZyA.png"},"navItems":[{"__typename":"NavItem","title":"Announcements","url":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmedium.com\u002Fflutter\u002Ftagged\u002Fannouncements","type":"TAG_NAV_ITEM"},{"__typename":"NavItem","title":"Performance","url":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmedium.com\u002Fflutter\u002Ftagged\u002Fperformance","type":"TAG_NAV_ITEM"},{"__typename":"NavItem","title":"Material Design","url":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmedium.com\u002Fflutter\u002Ftagged\u002Fmaterial-design","type":"TAG_NAV_ITEM"},{"__typename":"NavItem","title":"Web Development","url":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmedium.com\u002Fflutter\u002Ftagged\u002Fweb-development","type":"TAG_NAV_ITEM"},{"__typename":"NavItem","title":"flutter.dev","url":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fflutter.dev\u002F","type":"EXTERNAL_LINK_NAV_ITEM"}],"creator":{"__ref":"User:4631513e40c0"},"subscriberCount":38108,"avatar":{"__ref":"ImageMetadata:1*5-aoK8IBmXve5whBQM90GA.png"},"isEnrolledInHightower":false,"newsletterV3":null,"viewerIsFollowing":false,"viewerIsSubscribedToLetters":false,"canToggleEmail":false,"isUserSubscribedToCollectionEmails":false,"viewerIsMuting":false,"viewerCanEditOwnPosts":false,"viewerCanEditPosts":false,"description":"Flutter is Google's mobile UI framework for crafting high-quality native interfaces on iOS and Android in record time. 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","ampEnabled":false,"twitterUsername":"flutterdev","facebookPageId":null},"User:e0fa815e608b":{"id":"e0fa815e608b","__typename":"User","isFollowing":null,"viewerIsUser":false,"isSuspended":false,"name":"Chris Sells","hasCompletedProfile":false,"bio":"Chris Sells is a Google Product Manager on the Flutter development experience. He enjoys long walks on the beach and various technologies.","imageId":"0*6LK838dGSbGJRtat","customStyleSheet":null,"customDomainState":null,"username":"csells_18027","isAuroraVisible":true,"socialStats":{"__typename":"SocialStats","followerCount":2189},"isBlocking":null,"mediumMemberAt":0,"hasSubdomain":false,"isMuting":null,"allowNotes":true,"newsletterV3":null,"twitterScreenName":"","isPartnerProgramEnrolled":false},"Paragraph:ffe028c3b946_0":{"id":"ffe028c3b946_0","__typename":"Paragraph","name":"3f9d","text":"Announcing Flutter 1.22","type":"H3","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_1":{"id":"ffe028c3b946_1","__typename":"Paragraph","name":"22a8","text":"Supporting iOS 14 and Android 11, new i18n and l10n support, Google Maps and WebView plugins ready for production, a new App Size tool and much more!","type":"H4","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_2":{"id":"ffe028c3b946_2","__typename":"Paragraph","name":"b579","text":"We’re delighted to introduce our latest release of Flutter, with extensive support for iOS 14 and Android 11. Flutter 1.22 builds on the foundation set by previous releases by enabling developers to build fast, beautiful user experiences for multiple platforms from a single codebase. Our quarterly stable releases package the latest features, performance improvements, and bug fixes, and are suitable for broad production use.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_3":{"id":"ffe028c3b946_3","__typename":"Paragraph","name":"4a73","text":"Since this is the season for new mobile OS versions, this release focuses on ensuring that Android 11 and iOS 14 work great with Flutter. Updates for both of these OSes include a lot of under-the-hood work to conform to the latest SDKs and to make sure everything passes our extensive test suite. For iOS 14, this release includes support for the new Xcode 12, new icons, and preview support for the new iOS 14 App Clips feature. For Android 11, the update supports the new types of display cutouts as well as smoother animation when bringing up the soft keyboard.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_4":{"id":"ffe028c3b946_4","__typename":"Paragraph","name":"f804","text":"This release comes two months after our 1.20 release, so it was shorter than most. Even in that short time, we closed 3,024 issues and merged 1,944 PRs from 197 contributors. Of those contributors, 114 (58%) of them were from the community-at-large and they contributed 271 PRs. The largest single contributor was a14n, who makes our top contributor list again with 20 PRs, most of which were done as part of the work to support null safety in Flutter (more on that coming soon).","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":314,"end":318,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fgithub.com\u002Fa14n","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_5":{"id":"ffe028c3b946_5","__typename":"Paragraph","name":"ca54","text":"In addition to the support for the new mobile OS versions, there’s quite a bit more news to share, including a preview of one of the top-requested features for Android: state restoration, a new “universe” of Material buttons, new international and localization support that works with hot reload, a new Navigator, a stable release for Platform Views (the foundation for the Google Maps and WebView plugins), and a switch you can throw in your code to improve scrolling on devices with high frequency displays. We’ve also got a new tool for dissecting app size and for ensuring that the plugins that you’re building support only the platforms that you want to support.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_6":{"id":"ffe028c3b946_6","__typename":"Paragraph","name":"4045","text":"Targeting iOS 14","type":"H3","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_7":{"id":"ffe028c3b946_7","__typename":"Paragraph","name":"538e","text":"Whenever a new version of a mobile OS is announced, we test it thoroughly, looking for incompatibilities or changes that affect Flutter and its tools.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_8":{"id":"ffe028c3b946_8","__typename":"Paragraph","name":"63ea","text":"In the case of iOS 14, we made quite a few changes to Flutter to ensure that it works the way developers want:","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_9":{"id":"ffe028c3b946_9","__typename":"Paragraph","name":"b765","text":"Xcode 12 requires iOS 9.0 or up, so our default template increases its default from 8.0 to 9.0","type":"ULI","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_10":{"id":"ffe028c3b946_10","__typename":"Paragraph","name":"7a1f","text":"iOS 14 specific crashes and font rendering issues were fixed in Flutter 1.22","type":"ULI","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_11":{"id":"ffe028c3b946_11","__typename":"Paragraph","name":"9f17","text":"Problems deploying to physical devices were fixed as of Flutter 1.20.4","type":"ULI","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_12":{"id":"ffe028c3b946_12","__typename":"Paragraph","name":"8160","text":"A new policy that shows uses notifications when apps access their clipboard caused spurious notifications in Flutter apps, and was fixed as of Flutter 1.20.4","type":"ULI","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_13":{"id":"ffe028c3b946_13","__typename":"Paragraph","name":"9710","text":"A restriction disables running debug apps on iOS 14 devices except as part of the debugging process","type":"ULI","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_14":{"id":"ffe028c3b946_14","__typename":"Paragraph","name":"fb9b","text":"A new policy around network security for locally debugged Flutter apps causes iOS 14 to show a one-time confirmation dialog (only during development, not for released Flutter apps)","type":"ULI","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_15":{"id":"ffe028c3b946_15","__typename":"Paragraph","name":"04db","text":"Bottom line: if you’re targeting iOS 14 with your Flutter app, we strongly encourage you to rebuild it with Flutter 1.22 and deploy it to the App Store now to ensure that your iOS 14 users have the best experience.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_16":{"id":"ffe028c3b946_16","__typename":"Paragraph","name":"53d5","text":"For more details about targeting iOS 14 with Flutter, including some Add-to-App, deep linking, and notification considerations, refer to the iOS 14 documentation on flutter.dev.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":137,"end":176,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fflutter.dev\u002Fdocs\u002Fdevelopment\u002Fios-14","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_17":{"id":"ffe028c3b946_17","__typename":"Paragraph","name":"832b","text":"Hopefully, all of this work on the tooling and SDK support allows you to focus on the coding that you care about — taking advantage of new iOS 14 features.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_18":{"id":"ffe028c3b946_18","__typename":"Paragraph","name":"9942","text":"One such feature is updated support for iOS’s new SF Symbols font, which inspired us to spend some time giving the cupertino_icon package a refresh. Existing uses of CupertinoIcons will automatically map to the new style once you update your cupertino_icons dependency to the new 1.0 major version. If you use cupertino_icons 1.0 in conjunction with Flutter 1.22, you’ll also have access to ~900 new icons through the CupertinoIcons API.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":115,"end":129,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":166,"end":180,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":242,"end":257,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":310,"end":325,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":418,"end":432,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":111,"end":137,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fpub.dev\u002Fpackages\u002Fcupertino_icons","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","start":418,"end":432,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fcupertino\u002FCupertinoIcons-class.html","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_19":{"id":"ffe028c3b946_19","__typename":"Paragraph","name":"da88","text":"","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*ZGKu3IhnPNp6fS_e"},"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_20":{"id":"ffe028c3b946_20","__typename":"Paragraph","name":"e54d","text":"You can see the complete list of icons on the cupertino_icons preview page and a migration detail page on flutter.dev.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":46,"end":61,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":46,"end":61,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fflutter.github.io\u002Fcupertino_icons\u002F","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","start":79,"end":117,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fflutter.dev\u002Fdocs\u002Frelease\u002Fbreaking-changes\u002Fcupertino-icons-1.0.0","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_21":{"id":"ffe028c3b946_21","__typename":"Paragraph","name":"de2a","text":"Another feature for you to try with Flutter on iOS 14 is App Clips, a new iOS 14 feature that supports quick, no-install app executions of lightweight versions of apps under 10MB. In Flutter version 1.22, we have a preview of App Clip targets built with Flutter.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":57,"end":66,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fdeveloper.apple.com\u002Fapp-clips\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_22":{"id":"ffe028c3b946_22","__typename":"Paragraph","name":"9343","text":"A Flutter-powered App Clip experience","type":"IMG","href":null,"layout":"OUTSET_CENTER","metadata":{"__ref":"ImageMetadata:0*8MER4IM-IEt2ye2a"},"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_23":{"id":"ffe028c3b946_23","__typename":"Paragraph","name":"62d2","text":"For more details on how to build App Clips with Flutter, check out the docs on flutter.dev. You could also consult this simple sample project.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":67,"end":90,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fflutter.dev\u002Fdocs\u002Fdevelopment\u002Fplatform-integration\u002Fios-app-clip","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","start":120,"end":141,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fgithub.com\u002Fflutter\u002Fsamples\u002Ftree\u002Fmaster\u002Fios_app_clip","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_24":{"id":"ffe028c3b946_24","__typename":"Paragraph","name":"2609","text":"Android 11","type":"H3","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_25":{"id":"ffe028c3b946_25","__typename":"Paragraph","name":"b19f","text":"This release of Flutter also coincides with the launch of Android 11 this month. The Flutter framework and engine have been updated to support two new features introduced in the latest version of Android.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_26":{"id":"ffe028c3b946_26","__typename":"Paragraph","name":"b76a","text":"Firstly, Flutter now supports exposing the safe insets of Android notches, cutouts and edges of waterfall displays.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_27":{"id":"ffe028c3b946_27","__typename":"Paragraph","name":"53d3","text":"","type":"IMG","href":null,"layout":"OUTSET_CENTER","metadata":{"__ref":"ImageMetadata:0*lPO4ueKwxvV0QP_I"},"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_28":{"id":"ffe028c3b946_28","__typename":"Paragraph","name":"adce","text":"By using the MediaQuery and SafeArea APIs, you can ensure that you’re placing active UI and interactive elements in the non-obstructed regions of the device’s display. Also, you’ll want to avoid gesture detectors in the waterfall edge area that may be prone to accidental touches.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":13,"end":23,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":28,"end":36,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":13,"end":23,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fwidgets\u002FMediaQuery-class.html","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","start":28,"end":36,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fwidgets\u002FSafeArea-class.html","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_29":{"id":"ffe028c3b946_29","__typename":"Paragraph","name":"2564","text":"Secondly, the animation is synchronized with Android 11 as it displays the software keyboard.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_30":{"id":"ffe028c3b946_30","__typename":"Paragraph","name":"763b","text":"See the position animation of the FAB","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*DFRjYzbqIc5kOoDm"},"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_31":{"id":"ffe028c3b946_31","__typename":"Paragraph","name":"87db","text":"Issue #19279 has been a long-standing problem where the system keyboard show\u002Fhide animation isn’t synchronized with Flutter’s inset. This is fixed for Android 11.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":6,"end":12,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fissues\u002F19279","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_32":{"id":"ffe028c3b946_32","__typename":"Paragraph","name":"b88c","text":"One note about the Android embedding API. With Flutter version 1.12 last year, we rolled out a new set of Flutter engine and Flutter plugin APIs for Android. We created these v2 APIs to better support our add-to-app users on Android. A year later, over 80% of our Android plugins use the new Android APIs. Starting in 1.22, we’re deprecating the older v1 APIs.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_33":{"id":"ffe028c3b946_33","__typename":"Paragraph","name":"ee2f","text":"If you’re still using the Android v1 API, here’s what this means for you:","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_34":{"id":"ffe028c3b946_34","__typename":"Paragraph","name":"2d2c","text":"Newly created plugins will no longer target the v1 APIs","type":"ULI","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_35":{"id":"ffe028c3b946_35","__typename":"Paragraph","name":"3213","text":"The Flutter tool’s —no-enable-android-embedding-v2 config flag has been removed and is now the default behavior","type":"ULI","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":19,"end":50,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_36":{"id":"ffe028c3b946_36","__typename":"Paragraph","name":"6f77","text":"Older applications still using the v1 APIs will show a deprecation warning during build that points to the Supporting the new Android plugins APIs docs","type":"ULI","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":107,"end":146,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fflutter.dev\u002Fdocs\u002Fdevelopment\u002Fpackages-and-plugins\u002Fplugin-api-migration","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_37":{"id":"ffe028c3b946_37","__typename":"Paragraph","name":"0998","text":"Meanwhile, if you still have a Flutter application based on v1 Android APIs, it will continue to work. However, you may start to encounter new plugins that only target the v2 API and that can’t be consumed by v1 Android APIs. For more details, see the breaking change documentation.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":248,"end":281,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fflutter.dev\u002Fdocs\u002Frelease\u002Fbreaking-changes\u002Fandroid-v1-embedding-create-deprecation","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_38":{"id":"ffe028c3b946_38","__typename":"Paragraph","name":"1643","text":"Expanding the Button “universe”","type":"H3","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_39":{"id":"ffe028c3b946_39","__typename":"Paragraph","name":"cd48","text":"A new universe of Material Design buttons","type":"IMG","href":null,"layout":"OUTSET_LEFT","metadata":{"__ref":"ImageMetadata:1*crNLxg7CCtlQkB4mLI_ErA.png"},"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_40":{"id":"ffe028c3b946_40","__typename":"Paragraph","name":"400c","text":"Existing Flutter buttons look good but can be hard to use, especially when you need custom theming. Furthermore, the Material specification has expanded to include new buttons with new styles.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":46,"end":57,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttp:\u002F\u002Fflutter.dev\u002Fgo\u002Fmaterial-button-system-updates","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_41":{"id":"ffe028c3b946_41","__typename":"Paragraph","name":"e520","text":"To keep Flutter up to date with Material guidelines, we’re happy to announce a whole new “universe” of buttons in Flutter 1.22.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_42":{"id":"ffe028c3b946_42","__typename":"Paragraph","name":"f9f0","text":"Rather than try and evolve the existing button classes and their theme in-place, this PR introduces new, replacement button widgets and themes. In addition to freeing us from the backwards compatibility labyrinth that evolving the existing classes would entail, the new names sync Flutter with the Material Design spec, which uses the new names for the button components.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":81,"end":88,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fpull\u002F59702","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","start":298,"end":318,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmaterial.io\u002Fcomponents\u002Fbuttons\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_43":{"id":"ffe028c3b946_43","__typename":"Paragraph","name":"3a0b","text":"","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:1*di6uPEKEsRHoFtRryHeWPg.png"},"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_44":{"id":"ffe028c3b946_44","__typename":"Paragraph","name":"e70c","text":"The new themes follow the “normalized” pattern that Flutter has recently adopted for new Material widgets. If you’d like to play with a demo, there’s a great one here on DartPad. This is not a breaking change as the semantics of FlatButton, OutlineButton, RaisedButton, ButtonBar, ButtonBarTheme, and ButtonTheme won’t change. You can mix and match the old buttons with the new. as you prefer.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":229,"end":239,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":241,"end":254,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":256,"end":268,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":270,"end":279,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":281,"end":295,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":301,"end":312,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":150,"end":177,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fdartpad.dev\u002Fe560e1c2e4455ad53aac245079ccdcf2","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_45":{"id":"ffe028c3b946_45","__typename":"Paragraph","name":"f2cb","text":"New internationalization and localization support","type":"H3","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_46":{"id":"ffe028c3b946_46","__typename":"Paragraph","name":"3faa","text":"Flutter has provided the core functionality you need for the internationalization (i18n) and localization (l10n) of your apps since Flutter’s inception. However, with this release, we’ve baked our opinions of best practices into our tools, even enabling hot reload support to update your app as you add new l10n information.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_47":{"id":"ffe028c3b946_47","__typename":"Paragraph","name":"c0ec","text":"","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*UBVlGmhw5NUWbg5I"},"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_48":{"id":"ffe028c3b946_48","__typename":"Paragraph","name":"658c","text":"If you’d like more details about Flutter’s support for l10n, including localized messages, messages with parameters, dates, numbers, and currencies, read the Flutter Internationalization User Guide.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":149,"end":197,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttp:\u002F\u002Fflutter.dev\u002Fgo\u002Fi18n-user-guide","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_49":{"id":"ffe028c3b946_49","__typename":"Paragraph","name":"bc58","text":"Furthermore, if you’re interested in i18n and l10n, then you’re probably also interested in strings with characters that don’t fit into plain old ASCII, like Unicode and emoji. Recently, the Dart team released the characters package, which helps developers deal with Unicode (extended) grapheme clusters. This package helps solve problems like how to properly abbreviate a string like “A 🇬🇧 text in English” to the first 15 characters. Using the String class, that abbreviation would be “A 🇬🇧 text in”, which is only 12 user-perceived characters. On the other hand, using the characters package yields the correct abbreviation of “A 🇬🇧 text in Eng”.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":214,"end":224,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":448,"end":454,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":580,"end":590,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":210,"end":232,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fpub.dev\u002Fpackages\u002Fcharacters","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_50":{"id":"ffe028c3b946_50","__typename":"Paragraph","name":"398d","text":"With this PR, Flutter uses the characters package to properly handle these complex characters. For example, when using a TextField with a maxLength limit, characters like 👨👩👦 are now properly counted as a single character. Also, with this PR, the characters package is automatically available in projects wherever Flutter is, without needing to manually add it. Hopefully this makes it even easier to handle strings of all kinds from all locales. For more details about the characters package, check out the excellent article, Dart string manipulation done right 👉.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":121,"end":130,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":138,"end":147,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":5,"end":12,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fpull\u002F59267","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","start":239,"end":246,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fpull\u002F59620","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","start":532,"end":570,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmedium.com\u002Fdartlang\u002Fdart-string-manipulation-done-right-5abd0668ba3e","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_51":{"id":"ffe028c3b946_51","__typename":"Paragraph","name":"fd27","text":"Google Maps and WebView plugins ready for production","type":"H3","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_52":{"id":"ffe028c3b946_52","__typename":"Paragraph","name":"e12e","text":"Here on the Flutter team, we are often cautious about labeling something as “production ready” until we’ve tested it thoroughly ourselves. In the case of the google_maps_flutter and webview_flutter plugins, the gating factor has been the underlying Platform Views implementation, which allows native UI components from both Android and iOS to be hosted in a Flutter app. With this release of Flutter, we’re happy to announce that we have hardened the framework plumbing enough to declare both of these plugins as production ready.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":158,"end":177,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":182,"end":197,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":158,"end":177,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fpub.dev\u002Fpackages\u002Fgoogle_maps_flutter","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","start":182,"end":197,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fpub.dev\u002Fpackages\u002Fwebview_flutter","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","start":249,"end":263,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttp:\u002F\u002Fflutter.dev\u002Fdocs\u002Fdevelopment\u002Fplatform-integration\u002Fplatform-views","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_53":{"id":"ffe028c3b946_53","__typename":"Paragraph","name":"e2c6","text":"webview_flutter plugin hosting flutter.dev","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*luz0EiazQQqsAEC4"},"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_54":{"id":"ffe028c3b946_54","__typename":"Paragraph","name":"cd6a","text":"In Flutter 1.22, we’ve added an alternative Platform Views implementation that fixes all known keyboard, and accessibility issues for Android views. Also, it works with Android API level 19 and above (it used to require level 20). We have also made threading improvements on iOS that make platform views more efficient and more robust (and no longer requires you to add the io.flutter.embedded_views_preview flag to your iOS Info.plist).","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":374,"end":407,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":425,"end":435,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":85,"end":147,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fissues\u002F61133","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","start":436,"end":437,"type":"EM","href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_55":{"id":"ffe028c3b946_55","__typename":"Paragraph","name":"043a","text":"The webview_flutter plugin supports the new Android Platform Views mode but currently it needs to be enabled manually. We’ll enable it by default in future versions once it’s gotten more use in the wider community.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":4,"end":19,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":101,"end":117,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fgithub.com\u002Fflutter\u002Fplugins\u002Fblob\u002Fmaster\u002Fpackages\u002Fwebview_flutter\u002FREADME.md#android","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_56":{"id":"ffe028c3b946_56","__typename":"Paragraph","name":"5ef5","text":"The Google Maps and WebView plugins already benefit from the improvements in Platform Views. If you’d like to use Platform Views to host your own native UI components on iOS or Android, you can learn how to do so on Hosting native Android and iOS views in your Flutter app with Platform Views.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":216,"end":292,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fflutter.dev\u002Fdocs\u002Fdevelopment\u002Fplatform-integration\u002Fplatform-views","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_57":{"id":"ffe028c3b946_57","__typename":"Paragraph","name":"19db","text":"Navigator 2.0","type":"H3","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_58":{"id":"ffe028c3b946_58","__typename":"Paragraph","name":"0ff6","text":"If you’ve used navigation in your Flutter apps before, you may have noticed that the core data structure, the stack of pages that your user is navigating through, is hidden from you. Instead, to manage it, you call Navigator.pop() or Navigator.push(). For example, let’s say that you wanted to show a list of widgets on your home page and allow the user to tap on one to get to a detail page dedicated to just that color.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":215,"end":230,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":234,"end":250,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":15,"end":25,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fflutter.dev\u002Fdocs\u002Fdevelopment\u002Fui\u002Fnavigation","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","start":230,"end":231,"type":"EM","href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_59":{"id":"ffe028c3b946_59","__typename":"Paragraph","name":"c496","text":"","type":"IMG","href":null,"layout":"OUTSET_CENTER","metadata":{"__ref":"ImageMetadata:0*OVbaUaMkAXrpLQCy"},"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_60":{"id":"ffe028c3b946_60","__typename":"Paragraph","name":"d50a","text":"The two screens could be implemented like so:","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_61":{"id":"ffe028c3b946_61","__typename":"Paragraph","name":"d954","text":"","type":"IFRAME","href":null,"layout":"INSET_CENTER","metadata":null,"hasDropCap":null,"iframe":{"__typename":"Iframe","mediaResource":{"__ref":"MediaResource:72f4a4ffdac907c3e8eda2da84dda0f6"}},"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_62":{"id":"ffe028c3b946_62","__typename":"Paragraph","name":"a2e1","text":"Using the simplest Navigator 1.0 style allows you to navigate between these two screens in a way that looks pretty easy:","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_63":{"id":"ffe028c3b946_63","__typename":"Paragraph","name":"b5b7","text":"","type":"IFRAME","href":null,"layout":"INSET_CENTER","metadata":null,"hasDropCap":null,"iframe":{"__typename":"Iframe","mediaResource":{"__ref":"MediaResource:05fab7a288dd55acf6ed63f02d36f916"}},"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_64":{"id":"ffe028c3b946_64","__typename":"Paragraph","name":"e1b9","text":"The call to Navigator.push() is all that’s needed to push another page on top of the first one, creating a stack of two pages. However, unlike the list of Containers created in the build method of the ColorListScreen, that stack is hidden from you. And because it’s hidden, it’s hard to manage for other scenarios, like handling deep linking with an initial route provided by a native embedding, for example, or a URL from the web or intent from Android. It’s also exceedingly difficult to manage nested routing between different arrangements of the same page.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":12,"end":28,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":155,"end":165,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":201,"end":216,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_65":{"id":"ffe028c3b946_65","__typename":"Paragraph","name":"e2cb","text":"Navigator 2.0 solves these problems and more by making the stack of pages visible. Here’s an updated example of navigating between the same ColorListScreen and ColorScreen:","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":140,"end":155,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":160,"end":171,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_66":{"id":"ffe028c3b946_66","__typename":"Paragraph","name":"0871","text":"","type":"IFRAME","href":null,"layout":"INSET_CENTER","metadata":null,"hasDropCap":null,"iframe":{"__typename":"Iframe","mediaResource":{"__ref":"MediaResource:9db4a0d060729ba3e043ce6388465861"}},"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_67":{"id":"ffe028c3b946_67","__typename":"Paragraph","name":"ff10","text":"The app explicitly creates a Navigator and gives it a list of pages that represents the complete stack. We create an empty _selectedColor to indicate that no color has yet been selected, so we don’t show the ColorScreen initially. When the user selects a color, we call setState() as normal to indicate to Flutter that you’d like the build() method called again, which now creates a stack with the ColorScreen on top.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":29,"end":38,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":123,"end":137,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":208,"end":219,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":270,"end":280,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":334,"end":341,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":398,"end":409,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_68":{"id":"ffe028c3b946_68","__typename":"Paragraph","name":"c453","text":"You update your state in the OnPopPage call back, for example, if the user popped, then they’ve “unselected” the current color and we no longer want to show that page.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":29,"end":38,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_69":{"id":"ffe028c3b946_69","__typename":"Paragraph","name":"ea87","text":"If Navigator 2.0 looks like the rest of Flutter, that’s the intent — it’s declarative, unlike Navigator 1.0 which is imperative. The idea was to unify the models between navigation and the rest of Flutter while simultaneously fixing a bunch of issues and adding features. In fact, this little example barely scratches the surface of what’s in Navigator 2.0. For the details, I highly recommend the article on Declarative navigation and routing in Flutter.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":409,"end":454,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmedium.com\u002Fflutter\u002Flearning-flutters-new-navigation-and-routing-system-7c9068155ade","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_70":{"id":"ffe028c3b946_70","__typename":"Paragraph","name":"dfda","text":"Also, your existing use of Navigator 1.0 will continue to work just as it does today and won’t be removed anytime soon. If you prefer that model, you can certainly continue to use it. However, if you try Navigator 2.0, we think you’ll like it.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_71":{"id":"ffe028c3b946_71","__typename":"Paragraph","name":"6f28","text":"Preview: State Restoration for Android","type":"H3","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_72":{"id":"ffe028c3b946_72","__typename":"Paragraph","name":"896c","text":"A new feature that is available for you to experiment with in this release is support for State Restoration on Android. This is one of our most-requested features with 217 thumbs up!","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":90,"end":118,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fdeveloper.android.com\u002Ftopic\u002Flibraries\u002Farchitecture\u002Fsaving-states","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","start":139,"end":162,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fissues\u002F6827","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_73":{"id":"ffe028c3b946_73","__typename":"Paragraph","name":"d421","text":"For those not familiar with the need for state restoration, mobile OSes might kill apps that are in the background to reclaim resources for foreground apps. When this happens, the OS notifies the app to be killed to save any UI state quickly so that it can be restored when the user cycles back to that app. When implemented correctly, this provides a seamless experience for the user while making better use of the device’s resources. Until now, Flutter didn’t support state restoration and it was very difficult to do it correctly without framework support. That’s why we’re very happy to be able to deliver the foundational implementation of this feature for Android.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_74":{"id":"ffe028c3b946_74","__typename":"Paragraph","name":"41cd","text":"Here’s a very simple sample for restoring the state of the default Flutter Counter app:","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":7,"end":27,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fwidgets\u002FRestorationMixin-mixin.html#widgets.RestorationMixin.1","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_75":{"id":"ffe028c3b946_75","__typename":"Paragraph","name":"2b8c","text":"","type":"IFRAME","href":null,"layout":"INSET_CENTER","metadata":null,"hasDropCap":null,"iframe":{"__typename":"Iframe","mediaResource":{"__ref":"MediaResource:5b53da24e0462f59d442d2af47bb265a"}},"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_76":{"id":"ffe028c3b946_76","__typename":"Paragraph","name":"c633","text":"Briefly, each widget gets a storage bucket, which is registered with the RestorationMixin using a unique ID. By using a RestorableProperty type (like RestorableInt used here) to store the UI-specific data, and by registering that data with the State Restoration feature, the data is automatically stored before Android kills the app, and restored when it’s brought back to life. And that’s it. Any data that’s stored in a Restoration* type, like RestorableInt, RestorableString and RestorableTextEditingController (we’ve got a bunch of them) will be restored. And if we don’t cover all of the types you’d like to have restored, you can create your own by extending RestorableProperty\u003CT\u003E.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":73,"end":89,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":120,"end":138,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":150,"end":163,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":422,"end":434,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":446,"end":459,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":461,"end":477,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":482,"end":513,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":665,"end":686,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":73,"end":89,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fwidgets\u002FRestorationMixin-mixin.html","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","start":120,"end":138,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmaster-api.flutter.dev\u002Fflutter\u002Fwidgets\u002FRestorableProperty-class.html","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","start":665,"end":686,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fwidgets\u002FRestorableProperty-class.html","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_77":{"id":"ffe028c3b946_77","__typename":"Paragraph","name":"4adc","text":"","type":"IMG","href":null,"layout":"OUTSET_LEFT","metadata":{"__ref":"ImageMetadata:0*1298qhTKz_FjPuRN"},"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_78":{"id":"ffe028c3b946_78","__typename":"Paragraph","name":"146f","text":"For automated testing of state restoration, we’ve added a new restartAndRestore API to WidgetTester. And to test manually, the easiest thing to do is to start your state restoration-enabled Flutter app on an Android device, enable “Don’t keep activities” in Android’s developer settings, run your Flutter app, put it into the background, and then return to it. At this point, Android will have killed and restored your app, so you can see if everything is working as you expect.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":62,"end":79,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":56,"end":99,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fflutter_test\u002FWidgetTester\u002FrestartAndRestore.html","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_79":{"id":"ffe028c3b946_79","__typename":"Paragraph","name":"969b","text":"While we’re happy to put this preview version of State Restoration in your hands, there’s more work to do. For example, state restoration isn’t just for Android, iOS apps could benefit as well. Furthermore, we’re busy updating our own widgets to keep their state during restoration. We’ve already provided support in the Scrollable classes like ListView and SingleChildScrollView (to remember the user’s scroll position) and TextFields (to restore the text they’ve entered), and we plan to extend that to other widgets.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":321,"end":331,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":345,"end":353,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":358,"end":379,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":425,"end":435,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_80":{"id":"ffe028c3b946_80","__typename":"Paragraph","name":"0669","text":"However, the key restoration support we have not yet added, and what makes this a preview release, is navigation (either 1.0 or 2.0). This means that where your user is in the app won’t be restored. That feature will be coming to a beta soon and to the next stable release of Flutter.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_81":{"id":"ffe028c3b946_81","__typename":"Paragraph","name":"3bdb","text":"Preview: Smooth scrolling for unmatched input and display frequencies","type":"H3","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_82":{"id":"ffe028c3b946_82","__typename":"Paragraph","name":"f725","text":"Working with our internal Google partners, the Flutter team has greatly improved the performance of scrolling when the input and the display frequencies are not the same. For example, the Pixel 4 input runs at 120hz whereas the display runs at 90hz. This mismatch can cause a performance penalty when scrolling. With a new resamplingEnabled flag, you can take advantage of the performance work we’ve done in Flutter to address this issue:","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":323,"end":340,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_83":{"id":"ffe028c3b946_83","__typename":"Paragraph","name":"b561","text":"","type":"IFRAME","href":null,"layout":"INSET_CENTER","metadata":null,"hasDropCap":null,"iframe":{"__typename":"Iframe","mediaResource":{"__ref":"MediaResource:ac9c676eb1233dd1597b234b73ffc8a3"}},"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_84":{"id":"ffe028c3b946_84","__typename":"Paragraph","name":"364b","text":"Depending on the frequency discrepancies involved, you may see up to 97% less jank in scrolling by enabling this flag. When we’re sure this is the best experience, we plan to enable this flag by default in a future build.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_85":{"id":"ffe028c3b946_85","__typename":"Paragraph","name":"a9b0","text":"A new unified Dart developer tool","type":"H3","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_86":{"id":"ffe028c3b946_86","__typename":"Paragraph","name":"b0cc","text":"As always, an update to Flutter doesn’t just mean the engine and the framework but the tooling as well. Flutter 1.22 includes a new version of Dart (2.10), and there’s a new dart CLI tool that you might find useful as well.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":174,"end":178,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_87":{"id":"ffe028c3b946_87","__typename":"Paragraph","name":"5118","text":"Dart historically has had many smaller developer tools (such as dartfmt for formatting, and dartanalyzer for code analysis). New in Dart 2.10 is a unified dart developer tool very similar to the flutter tool.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":64,"end":71,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":92,"end":104,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":155,"end":159,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":195,"end":202,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_88":{"id":"ffe028c3b946_88","__typename":"Paragraph","name":"f4af","text":"","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:1*9pvyafhpaMEMhJfLVsz1JQ.png"},"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_89":{"id":"ffe028c3b946_89","__typename":"Paragraph","name":"cb2e","text":"Starting with today’s Flutter 1.22 SDK, you will find that the \u003Cflutter-sdk\u003E\u002Fbin folder (which you likely have in yourPATH) contains both flutter and dart commands. For more details, see the Dart 2.10 blog post.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":63,"end":80,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":118,"end":122,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":138,"end":145,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":150,"end":154,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":191,"end":210,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmedium.com\u002F@mit.mit\u002Fannouncing-dart-2-10-350823952bd5","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_90":{"id":"ffe028c3b946_90","__typename":"Paragraph","name":"f73e","text":"App size analysis tool","type":"H3","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_91":{"id":"ffe028c3b946_91","__typename":"Paragraph","name":"69a9","text":"The tooling released as part of Flutter 1.22 includes a new output size analysis utility. This tool helps diagnose Flutter whether the breakdown of your app’s size changes over time.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_92":{"id":"ffe028c3b946_92","__typename":"Paragraph","name":"a496","text":"You can use the tool to gather the data necessary for analysis by passing an--analyze-size flag to any of the following commands:","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":76,"end":90,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_93":{"id":"ffe028c3b946_93","__typename":"Paragraph","name":"a3f7","text":"flutter build apk","type":"ULI","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":0,"end":17,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_94":{"id":"ffe028c3b946_94","__typename":"Paragraph","name":"f438","text":"flutter build appbundle","type":"ULI","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":0,"end":23,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_95":{"id":"ffe028c3b946_95","__typename":"Paragraph","name":"ed69","text":"flutter build ios","type":"ULI","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":0,"end":17,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_96":{"id":"ffe028c3b946_96","__typename":"Paragraph","name":"6378","text":"flutter build linux","type":"ULI","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":0,"end":19,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_97":{"id":"ffe028c3b946_97","__typename":"Paragraph","name":"2a05","text":"flutter build macos","type":"ULI","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":0,"end":19,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_98":{"id":"ffe028c3b946_98","__typename":"Paragraph","name":"3106","text":"flutter build windows","type":"ULI","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":0,"end":21,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_99":{"id":"ffe028c3b946_99","__typename":"Paragraph","name":"784b","text":"Using this flag while building a Flutter output artifact prints a summary of the artifact’s size and composition. This includes native code, assets, and even a package-level breakdown of compiled Dart code.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_100":{"id":"ffe028c3b946_100","__typename":"Paragraph","name":"12e1","text":"Example breakdown of the Flutter Gallery’s release APK","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*vfMD0AQZUOUwzfZ4"},"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_101":{"id":"ffe028c3b946_101","__typename":"Paragraph","name":"cc36","text":"This summary is helpful in quickly identifying hotspots in the application’s package size usage. In addition, the gathered data is also available as a JSON file for use in Dart DevTools, which allows you to further explore your app’s contents, pinpoint size issues and see changes between two different JSON files by following the instructions on flutter.dev. Once you load the JSON file, you’ll have an interface that gives you a tree map view of your app’s size.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":327,"end":358,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fflutter.dev\u002Fdocs\u002Fdevelopment\u002Ftools\u002Fdevtools\u002Fapp-size","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_102":{"id":"ffe028c3b946_102","__typename":"Paragraph","name":"912f","text":"An example APK breakdown in Dart DevTools","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*gA2waLDAyITCzD7K"},"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_103":{"id":"ffe028c3b946_103","__typename":"Paragraph","name":"0a3c","text":"For more details of the things you can do with the App Size tool, read the Using the app size tool docs on flutter.dev.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":71,"end":103,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fflutter.dev\u002Fdocs\u002Fdevelopment\u002Ftools\u002Fdevtools\u002Fapp-size","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_104":{"id":"ffe028c3b946_104","__typename":"Paragraph","name":"10ac","text":"Preview: Updated Network Page in DevTools","type":"H3","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_105":{"id":"ffe028c3b946_105","__typename":"Paragraph","name":"7ecc","text":"Another DevTools preview feature in this release is the ability to see HTTP and HTTPs response bodies as part of the Network tab.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":117,"end":124,"type":"STRONG","href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_106":{"id":"ffe028c3b946_106","__typename":"Paragraph","name":"e284","text":"","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*-FukCwELl9DLlefP"},"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_107":{"id":"ffe028c3b946_107","__typename":"Paragraph","name":"2ba4","text":"To enable this feature, make sure you’re on the Flutter dev channel via flutter channel dev and flutter channel upgrade.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":72,"end":91,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":96,"end":119,"type":"CODE","href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_108":{"id":"ffe028c3b946_108","__typename":"Paragraph","name":"085e","text":"In addition, for apps with lots of network traffic, we’ve provided the ability to search and filter.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_109":{"id":"ffe028c3b946_109","__typename":"Paragraph","name":"d687","text":"","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*k-fEpOpbV_MiX9Fn"},"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_110":{"id":"ffe028c3b946_110","__typename":"Paragraph","name":"8b26","text":"For the Network tab docs, see Using the Network View on flutter.dev.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":30,"end":52,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fflutter.dev\u002Fdocs\u002Fdevelopment\u002Ftools\u002Fdevtools\u002Fnetwork","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","start":8,"end":15,"type":"STRONG","href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_111":{"id":"ffe028c3b946_111","__typename":"Paragraph","name":"06f9","text":"Hosted DevTools Inspector tab in IntelliJ","type":"H3","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_112":{"id":"ffe028c3b946_112","__typename":"Paragraph","name":"4294","text":"For a while now, we’ve been maintaining two copies of some of our Flutter tools, like the Inspector pane in IntelliJ and the Inspector tab in Dart DevTools. Not only does this slow us down because we’ve got to maintain two codebases, but some features haven’t yet made it into the IntelliJ plugin, like the Layout Explorer. So, to solve both of those problems, we’ve enabled the ability to host the Inspector tab from Dart DevTools directly inside of IntelliJ.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":90,"end":99,"type":"STRONG","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":125,"end":134,"type":"STRONG","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":399,"end":408,"type":"STRONG","href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_113":{"id":"ffe028c3b946_113","__typename":"Paragraph","name":"55da","text":"","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*RQZ-EVyFP1-BqBIX"},"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_114":{"id":"ffe028c3b946_114","__typename":"Paragraph","name":"a50c","text":"Notice the addition of the Layout Explorer, which you can use right next to your code. To toggle this option on, go to Preferences \u003E Languages & Frameworks \u003E Flutter \u003E Enable embedded DevTools inspector.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":119,"end":130,"type":"STRONG","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":132,"end":155,"type":"STRONG","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":158,"end":165,"type":"STRONG","href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","start":168,"end":202,"type":"STRONG","href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_115":{"id":"ffe028c3b946_115","__typename":"Paragraph","name":"f8b3","text":"Improved output linking in Visual Studio Code","type":"H3","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_116":{"id":"ffe028c3b946_116","__typename":"Paragraph","name":"d3b7","text":"A regular activity that all Flutter developers face is going from the error output in the terminal or in their stack traces. In the most recent release of the Flutter extension for Visual Studio Code, these links are now properly parsed for you to enable links directly from the output.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_117":{"id":"ffe028c3b946_117","__typename":"Paragraph","name":"d9cd","text":"","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*prigrwpp7gE6ChCE"},"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_118":{"id":"ffe028c3b946_118","__typename":"Paragraph","name":"1ce7","text":"It seems like a small thing, but initial feedback is already very positive on this feature.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_119":{"id":"ffe028c3b946_119","__typename":"Paragraph","name":"0d9d","text":"As always, there are too many tooling changes list here, but I recommend the following announcements for details:","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_120":{"id":"ffe028c3b946_120","__typename":"Paragraph","name":"6bb5","text":"Dart DevTools — 0.9.0","type":"ULI","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":0,"end":21,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fgroups.google.com\u002Fg\u002Fflutter-announce\u002Fc\u002FUxMv8MzE_uo\u002Fm\u002FED539pi2AAAJ","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_121":{"id":"ffe028c3b946_121","__typename":"Paragraph","name":"ca96","text":"Dart DevTools — 0.9.1","type":"ULI","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":0,"end":21,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fgroups.google.com\u002Fg\u002Fflutter-announce\u002Fc\u002Fy27h86ATFJM","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_122":{"id":"ffe028c3b946_122","__typename":"Paragraph","name":"202a","text":"Dart DevTools — 0.9.3","type":"ULI","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":0,"end":21,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fgroups.google.com\u002Fg\u002Fflutter-announce\u002Fc\u002F24LppkXdMtM","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_123":{"id":"ffe028c3b946_123","__typename":"Paragraph","name":"ca12","text":"Flutter IntelliJ Plugin M48.1 Release","type":"ULI","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":0,"end":37,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fgroups.google.com\u002Fg\u002Fflutter-announce\u002Fc\u002FnvgDi3RLAUE\u002Fm\u002FFx4Ze0vrBAAJ","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_124":{"id":"ffe028c3b946_124","__typename":"Paragraph","name":"23be","text":"Flutter IntelliJ Plugin M49 Release","type":"ULI","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":0,"end":35,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fgroups.google.com\u002Fg\u002Fflutter-announce\u002Fc\u002F-ZMKRIBRtGU","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_125":{"id":"ffe028c3b946_125","__typename":"Paragraph","name":"68d3","text":"Flutter IntelliJ Plugin M50 Release","type":"ULI","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":0,"end":35,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fgroups.google.com\u002Fg\u002Fflutter-announce\u002Fc\u002Fu0zU6zv3o44\u002Fm\u002F2y0JsX1_AwAJ","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_126":{"id":"ffe028c3b946_126","__typename":"Paragraph","name":"3237","text":"VS Code extensions v3.14.0","type":"ULI","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":0,"end":26,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fgroups.google.com\u002Fg\u002Fflutter-announce\u002Fc\u002F8e8e-ZrgySY","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_127":{"id":"ffe028c3b946_127","__typename":"Paragraph","name":"8f16","text":"VS Code extensions v3.15.0","type":"ULI","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":0,"end":26,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fdartcode.org\u002Freleases\u002Fv3-15\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_128":{"id":"ffe028c3b946_128","__typename":"Paragraph","name":"6d72","text":"Customer Spotlight: EasyA","type":"H3","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_129":{"id":"ffe028c3b946_129","__typename":"Paragraph","name":"ba14","text":"EasyA is a subscription app designed to give school-age students access to brilliant tutors via instant messaging, and is written in Flutter. Recently it was featured by Apple as their App of the Day.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":179,"end":199,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fapps.apple.com\u002Fgb\u002Fstory\u002Fid1527472788","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_130":{"id":"ffe028c3b946_130","__typename":"Paragraph","name":"d26a","text":"","type":"IMG","href":null,"layout":"OUTSET_CENTER","metadata":{"__ref":"ImageMetadata:0*yLWTxV_YTJ2HKhuz"},"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_131":{"id":"ffe028c3b946_131","__typename":"Paragraph","name":"6724","text":"“When schools began to go online earlier this year, we knew we needed to launch our tutoring app quickly to help students. The sheer speed of development with Flutter meant we were able to implement award-winning designs for both iOS and Android, and also publish to the web — just in time for lockdown! Normally, this would have been practically impossible. But since Flutter allows us to target all three platforms at once, we were able to share code efficiently and leverage our small team of developers to the fullest.”","type":"BQ","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":0,"end":523,"type":"EM","href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_132":{"id":"ffe028c3b946_132","__typename":"Paragraph","name":"83a0","text":"— Phil Kwok, Co-founder, EasyA","type":"BQ","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":25,"end":30,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Feasya.io\u002F","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","start":0,"end":30,"type":"EM","href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_133":{"id":"ffe028c3b946_133","__typename":"Paragraph","name":"d8c7","text":"Breaking Changes","type":"H3","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_134":{"id":"ffe028c3b946_134","__typename":"Paragraph","name":"ad2f","text":"As always, we attempt to keep the number of breaking changes to a minimum. Here’s the list from the Flutter 1.22 release.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_135":{"id":"ffe028c3b946_135","__typename":"Paragraph","name":"71e2","text":"56413 Prevent viewport.showOnScreen from scrolling the viewport if the specified Rect is already visible.","type":"ULI","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":0,"end":5,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fpull\u002F56413","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","start":6,"end":104,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1BZhxy176uUnqOCnXdnHM1XetS9mw9WIyUAOE-dgVdUM\u002Fedit?usp=sharing","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_136":{"id":"ffe028c3b946_136","__typename":"Paragraph","name":"6747","text":"62395 [gen_l10n] Synthetic package generation by default","type":"ULI","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":0,"end":5,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fpull\u002F62395","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_137":{"id":"ffe028c3b946_137","__typename":"Paragraph","name":"ec26","text":"62588 Build routes even less.","type":"ULI","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[{"__typename":"Markup","start":0,"end":5,"type":"A","href":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fpull\u002F62588","anchorType":"LINK","userId":null,"linkMetadata":null}],"dropCapImage":null},"Paragraph:ffe028c3b946_138":{"id":"ffe028c3b946_138","__typename":"Paragraph","name":"42d9","text":"Summary","type":"H3","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"Paragraph:ffe028c3b946_139":{"id":"ffe028c3b946_139","__typename":"Paragraph","name":"9f2c","text":"The Flutter 1.22 stable release may have come quickly on the heels of the previous release, but there’s so much good stuff in it that this post couldn’t mention it all. We hope this release helps you build amazing apps for iOS and Android, and we can’t wait to see what you have in store! Thank you for your support — we build Flutter for you.","type":"P","href":null,"layout":null,"metadata":null,"hasDropCap":null,"iframe":null,"mixtapeMetadata":null,"markups":[],"dropCapImage":null},"ImageMetadata:0*ZGKu3IhnPNp6fS_e":{"id":"0*ZGKu3IhnPNp6fS_e","__typename":"ImageMetadata","originalHeight":722,"originalWidth":864,"focusPercentX":null,"focusPercentY":null,"alt":null},"ImageMetadata:0*8MER4IM-IEt2ye2a":{"id":"0*8MER4IM-IEt2ye2a","__typename":"ImageMetadata","originalHeight":1361,"originalWidth":1600,"focusPercentX":null,"focusPercentY":null,"alt":null},"ImageMetadata:0*lPO4ueKwxvV0QP_I":{"id":"0*lPO4ueKwxvV0QP_I","__typename":"ImageMetadata","originalHeight":1173,"originalWidth":1600,"focusPercentX":null,"focusPercentY":null,"alt":null},"ImageMetadata:0*DFRjYzbqIc5kOoDm":{"id":"0*DFRjYzbqIc5kOoDm","__typename":"ImageMetadata","originalHeight":1211,"originalWidth":1190,"focusPercentX":null,"focusPercentY":null,"alt":null},"ImageMetadata:1*crNLxg7CCtlQkB4mLI_ErA.png":{"id":"1*crNLxg7CCtlQkB4mLI_ErA.png","__typename":"ImageMetadata","originalHeight":1368,"originalWidth":910,"focusPercentX":null,"focusPercentY":null,"alt":null},"ImageMetadata:1*di6uPEKEsRHoFtRryHeWPg.png":{"id":"1*di6uPEKEsRHoFtRryHeWPg.png","__typename":"ImageMetadata","originalHeight":282,"originalWidth":1220,"focusPercentX":null,"focusPercentY":null,"alt":null},"ImageMetadata:0*UBVlGmhw5NUWbg5I":{"id":"0*UBVlGmhw5NUWbg5I","__typename":"ImageMetadata","originalHeight":431,"originalWidth":600,"focusPercentX":null,"focusPercentY":null,"alt":null},"ImageMetadata:0*luz0EiazQQqsAEC4":{"id":"0*luz0EiazQQqsAEC4","__typename":"ImageMetadata","originalHeight":1035,"originalWidth":500,"focusPercentX":null,"focusPercentY":null,"alt":null},"ImageMetadata:0*OVbaUaMkAXrpLQCy":{"id":"0*OVbaUaMkAXrpLQCy","__typename":"ImageMetadata","originalHeight":627,"originalWidth":1600,"focusPercentX":null,"focusPercentY":null,"alt":null},"MediaResource:72f4a4ffdac907c3e8eda2da84dda0f6":{"id":"72f4a4ffdac907c3e8eda2da84dda0f6","__typename":"MediaResource","iframeSrc":"","iframeHeight":0,"iframeWidth":0,"title":"flutter-nav2-part1"},"MediaResource:05fab7a288dd55acf6ed63f02d36f916":{"id":"05fab7a288dd55acf6ed63f02d36f916","__typename":"MediaResource","iframeSrc":"","iframeHeight":0,"iframeWidth":0,"title":"flutter-nav2-part2"},"MediaResource:9db4a0d060729ba3e043ce6388465861":{"id":"9db4a0d060729ba3e043ce6388465861","__typename":"MediaResource","iframeSrc":"","iframeHeight":0,"iframeWidth":0,"title":"flutter-nav2-part3"},"MediaResource:5b53da24e0462f59d442d2af47bb265a":{"id":"5b53da24e0462f59d442d2af47bb265a","__typename":"MediaResource","iframeSrc":"","iframeHeight":0,"iframeWidth":0,"title":"flutter-state-restoration"},"ImageMetadata:0*1298qhTKz_FjPuRN":{"id":"0*1298qhTKz_FjPuRN","__typename":"ImageMetadata","originalHeight":1480,"originalWidth":720,"focusPercentX":null,"focusPercentY":null,"alt":null},"MediaResource:ac9c676eb1233dd1597b234b73ffc8a3":{"id":"ac9c676eb1233dd1597b234b73ffc8a3","__typename":"MediaResource","iframeSrc":"","iframeHeight":0,"iframeWidth":0,"title":"flutter-resampling"},"ImageMetadata:1*9pvyafhpaMEMhJfLVsz1JQ.png":{"id":"1*9pvyafhpaMEMhJfLVsz1JQ.png","__typename":"ImageMetadata","originalHeight":368,"originalWidth":700,"focusPercentX":null,"focusPercentY":null,"alt":"Screenshot of the output of `dart help`."},"ImageMetadata:0*vfMD0AQZUOUwzfZ4":{"id":"0*vfMD0AQZUOUwzfZ4","__typename":"ImageMetadata","originalHeight":1165,"originalWidth":943,"focusPercentX":null,"focusPercentY":null,"alt":null},"ImageMetadata:0*gA2waLDAyITCzD7K":{"id":"0*gA2waLDAyITCzD7K","__typename":"ImageMetadata","originalHeight":832,"originalWidth":1322,"focusPercentX":null,"focusPercentY":null,"alt":null},"ImageMetadata:0*-FukCwELl9DLlefP":{"id":"0*-FukCwELl9DLlefP","__typename":"ImageMetadata","originalHeight":719,"originalWidth":781,"focusPercentX":null,"focusPercentY":null,"alt":null},"ImageMetadata:0*k-fEpOpbV_MiX9Fn":{"id":"0*k-fEpOpbV_MiX9Fn","__typename":"ImageMetadata","originalHeight":1096,"originalWidth":994,"focusPercentX":null,"focusPercentY":null,"alt":null},"ImageMetadata:0*RQZ-EVyFP1-BqBIX":{"id":"0*RQZ-EVyFP1-BqBIX","__typename":"ImageMetadata","originalHeight":1102,"originalWidth":1041,"focusPercentX":null,"focusPercentY":null,"alt":null},"ImageMetadata:0*prigrwpp7gE6ChCE":{"id":"0*prigrwpp7gE6ChCE","__typename":"ImageMetadata","originalHeight":909,"originalWidth":1600,"focusPercentX":null,"focusPercentY":null,"alt":null},"ImageMetadata:0*yLWTxV_YTJ2HKhuz":{"id":"0*yLWTxV_YTJ2HKhuz","__typename":"ImageMetadata","originalHeight":1384,"originalWidth":1600,"focusPercentX":null,"focusPercentY":null,"alt":null},"Tag:flutter":{"id":"flutter","__typename":"Tag","displayTitle":"Flutter"},"Tag:ios":{"id":"ios","__typename":"Tag","displayTitle":"iOS"},"Tag:android":{"id":"android","__typename":"Tag","displayTitle":"Android"},"Tag:announcements":{"id":"announcements","__typename":"Tag","displayTitle":"Announcements"},"Tag:mobile-app-development":{"id":"mobile-app-development","__typename":"Tag","displayTitle":"Mobile App Development"},"ImageMetadata:1*VfzjpWNg5Er_rWorG3E9sA.png":{"id":"1*VfzjpWNg5Er_rWorG3E9sA.png","__typename":"ImageMetadata","focusPercentX":null,"focusPercentY":null},"User:8af1e7a352fd":{"id":"8af1e7a352fd","__typename":"User","name":"Pavan Kataria","username":"pavankataria","bio":"Engineer Pavan, First of His name, the Unburnt, Lord of the iOS Realm, Bug Breaker, Space Indenter, and New writer — otherwise known as PK","isFollowing":null,"imageId":"1*BcPRn0RzjBqcogdlsxLtpQ.jpeg","mediumMemberAt":0,"customDomainState":{"__typename":"CustomDomainState","live":{"__typename":"CustomDomain","domain":"pavankataria.medium.com"}},"hasSubdomain":true},"Post:b0aab1949b":{"id":"b0aab1949b","__typename":"Post","title":"How to programmatically setup your app with Scene Delegate in Swift","mediumUrl":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fpavankataria.medium.com\u002Fhow-to-programmatically-setup-your-app-with-scene-delegate-in-swift-b0aab1949b","previewImage":{"__ref":"ImageMetadata:1*VfzjpWNg5Er_rWorG3E9sA.png"},"isPublished":true,"firstPublishedAt":1593437132048,"readingTime":3.308805031446541,"statusForCollection":null,"isLocked":true,"isShortform":false,"visibility":"LOCKED","collection":null,"creator":{"__ref":"User:8af1e7a352fd"},"previewContent":{"__typename":"PreviewContent","isFullContent":false}},"ImageMetadata:1*6iv1W7BRXnNrmYkqwxKRiQ.png":{"id":"1*6iv1W7BRXnNrmYkqwxKRiQ.png","__typename":"ImageMetadata","focusPercentX":null,"focusPercentY":null},"Collection:d0b105d10f0a":{"id":"d0b105d10f0a","__typename":"Collection","name":"Better Programming","slug":"better-programming","domain":null},"User:848400af9df0":{"id":"848400af9df0","__typename":"User","name":"Eric Walker","username":"walkereric10","bio":"Studying Mechanical Engineering at The University of Akron. Cancer survivor since 2015.","isFollowing":null,"imageId":"0*JJWxlkuYehNnChyf.jpg","mediumMemberAt":0,"customDomainState":null,"hasSubdomain":false},"Post:b12e575bd85c":{"id":"b12e575bd85c","__typename":"Post","title":"Data Persistence — CloudKit","mediumUrl":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmedium.com\u002Fbetter-programming\u002Fdata-persistence-cloudkit-b12e575bd85c","previewImage":{"__ref":"ImageMetadata:1*6iv1W7BRXnNrmYkqwxKRiQ.png"},"isPublished":true,"firstPublishedAt":1565638107164,"readingTime":12.8,"statusForCollection":"APPROVED","isLocked":true,"isShortform":false,"visibility":"LOCKED","collection":{"__ref":"Collection:d0b105d10f0a"},"creator":{"__ref":"User:848400af9df0"},"previewContent":{"__typename":"PreviewContent","isFullContent":false}},"ImageMetadata:0*rue3iyd6wBOgUFaK":{"id":"0*rue3iyd6wBOgUFaK","__typename":"ImageMetadata","focusPercentX":null,"focusPercentY":null},"User:2bbfa9d2f44f":{"id":"2bbfa9d2f44f","__typename":"User","name":"Zafar Ivaev","username":"z.ivaev","bio":" WWDC20 Scholar. I write about features of Swift, iOS development practices, and sometimes Flutter.","isFollowing":null,"imageId":"1*DBp49NznjtATlDUu88TANQ.png","mediumMemberAt":1585761014000,"customDomainState":null,"hasSubdomain":false},"Post:b06fcdf1260d":{"id":"b06fcdf1260d","__typename":"Post","title":"Let’s Build a Circular Loading Indicator in Swift 5","mediumUrl":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmedium.com\u002Fbetter-programming\u002Flets-build-a-circular-loading-indicator-in-swift-5-b06fcdf1260d","previewImage":{"__ref":"ImageMetadata:0*rue3iyd6wBOgUFaK"},"isPublished":true,"firstPublishedAt":1602096953813,"readingTime":5.5726415094339625,"statusForCollection":"APPROVED","isLocked":true,"isShortform":false,"visibility":"LOCKED","collection":{"__ref":"Collection:d0b105d10f0a"},"creator":{"__ref":"User:2bbfa9d2f44f"},"previewContent":{"__typename":"PreviewContent","isFullContent":false}},"ImageMetadata:1*1kwExAXA4lNas7zYeAe3nQ.jpeg":{"id":"1*1kwExAXA4lNas7zYeAe3nQ.jpeg","__typename":"ImageMetadata","focusPercentX":null,"focusPercentY":null},"Collection:f5af2b715248":{"id":"f5af2b715248","__typename":"Collection","name":"The Startup","slug":"swlh","domain":null},"User:d3d4c92a838f":{"id":"d3d4c92a838f","__typename":"User","name":"Amr Omran","username":"amr.raafat.89","bio":"iOS Software Developer @Exxeta.com","isFollowing":null,"imageId":"2*5jTfBRGerTD8Rm1XnKupJA.jpeg","mediumMemberAt":0,"customDomainState":null,"hasSubdomain":false},"Post:b074ef4242de":{"id":"b074ef4242de","__typename":"Post","title":"Closure in Swift {}","mediumUrl":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmedium.com\u002Fswlh\u002Fclosure-in-swift-b074ef4242de","previewImage":{"__ref":"ImageMetadata:1*1kwExAXA4lNas7zYeAe3nQ.jpeg"},"isPublished":true,"firstPublishedAt":1589192931699,"readingTime":1.690566037735849,"statusForCollection":"APPROVED","isLocked":true,"isShortform":false,"visibility":"LOCKED","collection":{"__ref":"Collection:f5af2b715248"},"creator":{"__ref":"User:d3d4c92a838f"},"previewContent":{"__typename":"PreviewContent","isFullContent":false}},"ImageMetadata:1*RM2QEC1OejmADHcAqP5lQw.jpeg":{"id":"1*RM2QEC1OejmADHcAqP5lQw.jpeg","__typename":"ImageMetadata","focusPercentX":null,"focusPercentY":null},"User:a361beddb63f":{"id":"a361beddb63f","__typename":"User","name":"Imthathullah","username":"imthathullah","bio":"Aspiring Author. Mostly writes code and sometimes articles. Tweets @imthath_m","isFollowing":null,"imageId":"1*KuorgxYnvKldSsfl-ejO_g.jpeg","mediumMemberAt":0,"customDomainState":null,"hasSubdomain":false},"Post:b036c772037":{"id":"b036c772037","__typename":"Post","title":"Using iOS 14’s Menu as a Picker in SwiftUI","mediumUrl":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmedium.com\u002Fbetter-programming\u002Fusing-ios-14s-menu-as-a-picker-in-swiftui-b036c772037","previewImage":{"__ref":"ImageMetadata:1*RM2QEC1OejmADHcAqP5lQw.jpeg"},"isPublished":true,"firstPublishedAt":1595947678305,"readingTime":2.0962264150943395,"statusForCollection":"APPROVED","isLocked":true,"isShortform":false,"visibility":"LOCKED","collection":{"__ref":"Collection:d0b105d10f0a"},"creator":{"__ref":"User:a361beddb63f"},"previewContent":{"__typename":"PreviewContent","isFullContent":false}},"ImageMetadata:1*bAfkfu8JYEYhnVjo9AZHDg.png":{"id":"1*bAfkfu8JYEYhnVjo9AZHDg.png","__typename":"ImageMetadata","focusPercentX":null,"focusPercentY":null},"User:3661b4b9193c":{"id":"3661b4b9193c","__typename":"User","name":"Vatsal Rustagi","username":"vatsalrustagi","bio":"I’m a software engineer in SF! Currently 2+ years into this profession with experience in server-side programming with a focus on APIs and micro-services.","isFollowing":null,"imageId":"0*n-iwny6ZhGM1htOY.","mediumMemberAt":0,"customDomainState":null,"hasSubdomain":false},"Post:b14d9fff20c3":{"id":"b14d9fff20c3","__typename":"Post","title":"iOS — Refactoring in Swift: Identifiers!","mediumUrl":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmedium.com\u002F@vatsalrustagi\u002Fios-refactoring-in-swift-identifiers-b14d9fff20c3","previewImage":{"__ref":"ImageMetadata:1*bAfkfu8JYEYhnVjo9AZHDg.png"},"isPublished":true,"firstPublishedAt":1542096119279,"readingTime":4.746226415094339,"statusForCollection":null,"isLocked":false,"isShortform":false,"visibility":"PUBLIC","collection":null,"creator":{"__ref":"User:3661b4b9193c"},"previewContent":{"__typename":"PreviewContent","isFullContent":false}},"ImageMetadata:1*vc-tY9pvNvXAES-61Yra1g.png":{"id":"1*vc-tY9pvNvXAES-61Yra1g.png","__typename":"ImageMetadata","focusPercentX":null,"focusPercentY":null},"Collection:acb6f01f2100":{"id":"acb6f01f2100","__typename":"Collection","name":"Swift Productions","slug":"swift-productions","domain":null},"User:dceb58d43453":{"id":"dceb58d43453","__typename":"User","name":"Sullivan De Carli","username":"sullivan-decarli","bio":"Design & App development enthusiast. Check out my portfolio at https:\u002F\u002Fsullivandecarli.com","isFollowing":null,"imageId":"1*tUc6vaAvxUp6z1F98ZlE6g@2x.jpeg","mediumMemberAt":1603206664000,"customDomainState":{"__typename":"CustomDomainState","live":{"__typename":"CustomDomain","domain":"sullivan-decarli.medium.com"}},"hasSubdomain":true},"Post:b0960f0bda64":{"id":"b0960f0bda64","__typename":"Post","title":"Image from Remote URL Using SDWebImageSwiftUI","mediumUrl":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmedium.com\u002Fswift-productions\u002Fsdwebimageswiftui-image-from-url-b0960f0bda64","previewImage":{"__ref":"ImageMetadata:1*vc-tY9pvNvXAES-61Yra1g.png"},"isPublished":true,"firstPublishedAt":1611584379288,"readingTime":1.7050314465408807,"statusForCollection":"APPROVED","isLocked":true,"isShortform":false,"visibility":"LOCKED","collection":{"__ref":"Collection:acb6f01f2100"},"creator":{"__ref":"User:dceb58d43453"},"previewContent":{"__typename":"PreviewContent","isFullContent":false}},"ImageMetadata:1*jVlRvqxtbbto8OlTeyCBcQ.jpeg":{"id":"1*jVlRvqxtbbto8OlTeyCBcQ.jpeg","__typename":"ImageMetadata","focusPercentX":null,"focusPercentY":null},"User:406e99625b3c":{"id":"406e99625b3c","__typename":"User","name":"João R.G. Sampaio","username":"joao-sampaio","bio":"Programming as a career, snowboarding as a passion, writing as a hobby.","isFollowing":null,"imageId":"0*iR9QpZMeF3O662Ts.jpg","mediumMemberAt":0,"customDomainState":{"__typename":"CustomDomainState","live":{"__typename":"CustomDomain","domain":"joao-sampaio.medium.com"}},"hasSubdomain":true},"Post:b082daa866b1":{"id":"b082daa866b1","__typename":"Post","title":"The Proper Way to Create Transparent Gradient Layers in iOS","mediumUrl":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmedium.com\u002Fbetter-programming\u002Fthe-proper-way-of-creating-a-transparent-gradient-layer-in-ios-b082daa866b1","previewImage":{"__ref":"ImageMetadata:1*jVlRvqxtbbto8OlTeyCBcQ.jpeg"},"isPublished":true,"firstPublishedAt":1606121759888,"readingTime":3.134905660377359,"statusForCollection":"APPROVED","isLocked":true,"isShortform":false,"visibility":"LOCKED","collection":{"__ref":"Collection:d0b105d10f0a"},"creator":{"__ref":"User:406e99625b3c"},"previewContent":{"__typename":"PreviewContent","isFullContent":false}},"Post:44f146009e5f":{"id":"44f146009e5f","__typename":"Post","canonicalUrl":"","collection":{"__ref":"Collection:4da7dfd21a33"},"content({\"postMeteringOptions\":{}})":{"__typename":"PostContent","isLockedPreviewOnly":false,"validatedShareKey":"","isCacheableContent":false,"bodyModel":{"__typename":"RichText","paragraphs":[{"__ref":"Paragraph:ffe028c3b946_0"},{"__ref":"Paragraph:ffe028c3b946_1"},{"__ref":"Paragraph:ffe028c3b946_2"},{"__ref":"Paragraph:ffe028c3b946_3"},{"__ref":"Paragraph:ffe028c3b946_4"},{"__ref":"Paragraph:ffe028c3b946_5"},{"__ref":"Paragraph:ffe028c3b946_6"},{"__ref":"Paragraph:ffe028c3b946_7"},{"__ref":"Paragraph:ffe028c3b946_8"},{"__ref":"Paragraph:ffe028c3b946_9"},{"__ref":"Paragraph:ffe028c3b946_10"},{"__ref":"Paragraph:ffe028c3b946_11"},{"__ref":"Paragraph:ffe028c3b946_12"},{"__ref":"Paragraph:ffe028c3b946_13"},{"__ref":"Paragraph:ffe028c3b946_14"},{"__ref":"Paragraph:ffe028c3b946_15"},{"__ref":"Paragraph:ffe028c3b946_16"},{"__ref":"Paragraph:ffe028c3b946_17"},{"__ref":"Paragraph:ffe028c3b946_18"},{"__ref":"Paragraph:ffe028c3b946_19"},{"__ref":"Paragraph:ffe028c3b946_20"},{"__ref":"Paragraph:ffe028c3b946_21"},{"__ref":"Paragraph:ffe028c3b946_22"},{"__ref":"Paragraph:ffe028c3b946_23"},{"__ref":"Paragraph:ffe028c3b946_24"},{"__ref":"Paragraph:ffe028c3b946_25"},{"__ref":"Paragraph:ffe028c3b946_26"},{"__ref":"Paragraph:ffe028c3b946_27"},{"__ref":"Paragraph:ffe028c3b946_28"},{"__ref":"Paragraph:ffe028c3b946_29"},{"__ref":"Paragraph:ffe028c3b946_30"},{"__ref":"Paragraph:ffe028c3b946_31"},{"__ref":"Paragraph:ffe028c3b946_32"},{"__ref":"Paragraph:ffe028c3b946_33"},{"__ref":"Paragraph:ffe028c3b946_34"},{"__ref":"Paragraph:ffe028c3b946_35"},{"__ref":"Paragraph:ffe028c3b946_36"},{"__ref":"Paragraph:ffe028c3b946_37"},{"__ref":"Paragraph:ffe028c3b946_38"},{"__ref":"Paragraph:ffe028c3b946_39"},{"__ref":"Paragraph:ffe028c3b946_40"},{"__ref":"Paragraph:ffe028c3b946_41"},{"__ref":"Paragraph:ffe028c3b946_42"},{"__ref":"Paragraph:ffe028c3b946_43"},{"__ref":"Paragraph:ffe028c3b946_44"},{"__ref":"Paragraph:ffe028c3b946_45"},{"__ref":"Paragraph:ffe028c3b946_46"},{"__ref":"Paragraph:ffe028c3b946_47"},{"__ref":"Paragraph:ffe028c3b946_48"},{"__ref":"Paragraph:ffe028c3b946_49"},{"__ref":"Paragraph:ffe028c3b946_50"},{"__ref":"Paragraph:ffe028c3b946_51"},{"__ref":"Paragraph:ffe028c3b946_52"},{"__ref":"Paragraph:ffe028c3b946_53"},{"__ref":"Paragraph:ffe028c3b946_54"},{"__ref":"Paragraph:ffe028c3b946_55"},{"__ref":"Paragraph:ffe028c3b946_56"},{"__ref":"Paragraph:ffe028c3b946_57"},{"__ref":"Paragraph:ffe028c3b946_58"},{"__ref":"Paragraph:ffe028c3b946_59"},{"__ref":"Paragraph:ffe028c3b946_60"},{"__ref":"Paragraph:ffe028c3b946_61"},{"__ref":"Paragraph:ffe028c3b946_62"},{"__ref":"Paragraph:ffe028c3b946_63"},{"__ref":"Paragraph:ffe028c3b946_64"},{"__ref":"Paragraph:ffe028c3b946_65"},{"__ref":"Paragraph:ffe028c3b946_66"},{"__ref":"Paragraph:ffe028c3b946_67"},{"__ref":"Paragraph:ffe028c3b946_68"},{"__ref":"Paragraph:ffe028c3b946_69"},{"__ref":"Paragraph:ffe028c3b946_70"},{"__ref":"Paragraph:ffe028c3b946_71"},{"__ref":"Paragraph:ffe028c3b946_72"},{"__ref":"Paragraph:ffe028c3b946_73"},{"__ref":"Paragraph:ffe028c3b946_74"},{"__ref":"Paragraph:ffe028c3b946_75"},{"__ref":"Paragraph:ffe028c3b946_76"},{"__ref":"Paragraph:ffe028c3b946_77"},{"__ref":"Paragraph:ffe028c3b946_78"},{"__ref":"Paragraph:ffe028c3b946_79"},{"__ref":"Paragraph:ffe028c3b946_80"},{"__ref":"Paragraph:ffe028c3b946_81"},{"__ref":"Paragraph:ffe028c3b946_82"},{"__ref":"Paragraph:ffe028c3b946_83"},{"__ref":"Paragraph:ffe028c3b946_84"},{"__ref":"Paragraph:ffe028c3b946_85"},{"__ref":"Paragraph:ffe028c3b946_86"},{"__ref":"Paragraph:ffe028c3b946_87"},{"__ref":"Paragraph:ffe028c3b946_88"},{"__ref":"Paragraph:ffe028c3b946_89"},{"__ref":"Paragraph:ffe028c3b946_90"},{"__ref":"Paragraph:ffe028c3b946_91"},{"__ref":"Paragraph:ffe028c3b946_92"},{"__ref":"Paragraph:ffe028c3b946_93"},{"__ref":"Paragraph:ffe028c3b946_94"},{"__ref":"Paragraph:ffe028c3b946_95"},{"__ref":"Paragraph:ffe028c3b946_96"},{"__ref":"Paragraph:ffe028c3b946_97"},{"__ref":"Paragraph:ffe028c3b946_98"},{"__ref":"Paragraph:ffe028c3b946_99"},{"__ref":"Paragraph:ffe028c3b946_100"},{"__ref":"Paragraph:ffe028c3b946_101"},{"__ref":"Paragraph:ffe028c3b946_102"},{"__ref":"Paragraph:ffe028c3b946_103"},{"__ref":"Paragraph:ffe028c3b946_104"},{"__ref":"Paragraph:ffe028c3b946_105"},{"__ref":"Paragraph:ffe028c3b946_106"},{"__ref":"Paragraph:ffe028c3b946_107"},{"__ref":"Paragraph:ffe028c3b946_108"},{"__ref":"Paragraph:ffe028c3b946_109"},{"__ref":"Paragraph:ffe028c3b946_110"},{"__ref":"Paragraph:ffe028c3b946_111"},{"__ref":"Paragraph:ffe028c3b946_112"},{"__ref":"Paragraph:ffe028c3b946_113"},{"__ref":"Paragraph:ffe028c3b946_114"},{"__ref":"Paragraph:ffe028c3b946_115"},{"__ref":"Paragraph:ffe028c3b946_116"},{"__ref":"Paragraph:ffe028c3b946_117"},{"__ref":"Paragraph:ffe028c3b946_118"},{"__ref":"Paragraph:ffe028c3b946_119"},{"__ref":"Paragraph:ffe028c3b946_120"},{"__ref":"Paragraph:ffe028c3b946_121"},{"__ref":"Paragraph:ffe028c3b946_122"},{"__ref":"Paragraph:ffe028c3b946_123"},{"__ref":"Paragraph:ffe028c3b946_124"},{"__ref":"Paragraph:ffe028c3b946_125"},{"__ref":"Paragraph:ffe028c3b946_126"},{"__ref":"Paragraph:ffe028c3b946_127"},{"__ref":"Paragraph:ffe028c3b946_128"},{"__ref":"Paragraph:ffe028c3b946_129"},{"__ref":"Paragraph:ffe028c3b946_130"},{"__ref":"Paragraph:ffe028c3b946_131"},{"__ref":"Paragraph:ffe028c3b946_132"},{"__ref":"Paragraph:ffe028c3b946_133"},{"__ref":"Paragraph:ffe028c3b946_134"},{"__ref":"Paragraph:ffe028c3b946_135"},{"__ref":"Paragraph:ffe028c3b946_136"},{"__ref":"Paragraph:ffe028c3b946_137"},{"__ref":"Paragraph:ffe028c3b946_138"},{"__ref":"Paragraph:ffe028c3b946_139"}],"sections":[{"__typename":"Section","name":"f382","startIndex":0,"textLayout":null,"imageLayout":null,"backgroundImage":null,"videoLayout":null,"backgroundVideo":null}]}},"creator":{"__ref":"User:e0fa815e608b"},"customStyleSheet":null,"firstPublishedAt":1601564224818,"isLocked":false,"isPublished":true,"isShortform":false,"layerCake":0,"primaryTopic":null,"title":"Announcing Flutter 1.22","readCreatorPostsCount":0,"mediumUrl":"https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210217042021\u002Fhttps:\u002F\u002Fmedium.com\u002Fflutter\u002Fannouncing-flutter-1-22-44f146009e5f","isLimitedState":false,"visibility":"PUBLIC","license":"CC_40_BY","allowResponses":true,"newsletterId":"","sequence":null,"tags":[{"__ref":"Tag:flutter"},{"__ref":"Tag:ios"},{"__ref":"Tag:android"},{"__ref":"Tag:announcements"},{"__ref":"Tag:mobile-app-development"}],"topics":[{"__typename":"Topic","topicId":"ab3d8f7f8eb1","name":"iOS Dev"},{"__typename":"Topic","topicId":"decb52b64abf","name":"Programming"}],"viewerClapCount":0,"showSubscribeToProfilePromo":false,"showSubscribeToCollectionNewsletterV3Promo":false,"inResponseToPostResult":null,"isNewsletter":false,"socialTitle":"","socialDek":"","metaDescription":"","latestPublishedAt":1601919877232,"readingTime":16.008490566037736,"previewContent":{"__typename":"PreviewContent","subtitle":"Supporting iOS 14 and Android 11, new i18n and l10n support, Google Maps and WebView plugins ready for production, a new App Size tool and…"},"previewImage":{"__ref":"ImageMetadata:0*luz0EiazQQqsAEC4"},"creatorPartnerProgramEnrollmentStatus":"PERMISSION_DENIED","clapCount":6798,"lockedSource":"LOCKED_POST_SOURCE_NONE","isSuspended":false,"pendingCollection":null,"statusForCollection":"APPROVED","pinnedAt":0,"pinnedByCreatorAt":0,"curationEligibleAt":0,"responseDistribution":"NOT_DISTRIBUTED","shareKey":null,"internalLinks({\"paging\":{\"limit\":8}})":{"__typename":"InternalLinksConnection","items":[{"__ref":"Post:b0aab1949b"},{"__ref":"Post:b12e575bd85c"},{"__ref":"Post:b06fcdf1260d"},{"__ref":"Post:b074ef4242de"},{"__ref":"Post:b036c772037"},{"__ref":"Post:b14d9fff20c3"},{"__ref":"Post:b0960f0bda64"},{"__ref":"Post:b082daa866b1"}]},"collaborators":[],"translationSourcePost":null,"inResponseToMediaResource":null,"isDistributionAlertDismissed":true,"audioVersionUrl":"","seoTitle":"Announcing Flutter 1.22 with iOS 14 support","updatedAt":1601919883462,"shortformType":"SHORTFORM_TYPE_LINK","structuredData":"","seoDescription":"We’re delighted to introduce our latest release of Flutter, with extensive support for iOS 14 and Android 11, new navigation, localization and Material support.","postResponses":{"__typename":"PostResponses","count":11},"latestPublishedVersion":"ffe028c3b946","isPublishToEmail":false,"readingList":"READING_LIST_NONE","voterCount":853,"recommenders":[]}}</script><script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/manifest.66214212.js"></script><script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/8247.8b14dd5f.js"></script><script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/main.f82521a2.js"></script><script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/5573.159bf40f.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/instrumentation.42411c75.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/reporting.54526183.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/1752.a348f767.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/4464.c01c0ad8.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/8342.6aa0b45e.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/5699.e60bcdf6.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/9692.ff42eea4.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/5064.4f9a6295.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/9274.5526dd29.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/2846.56b0e274.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/7012.5f00b75e.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/7993.113d64ba.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/9972.a29dd8d1.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/5127.810d9eac.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/9106.d3f8ce1c.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/8751.8157df04.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/9458.f28348f4.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/7131.5a03a881.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/8127.6aa442d7.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/463.b114d59d.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/1373.f33f1a0b.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/587.357e46e5.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/2514.597d2c66.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/3874.b21154a3.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/857.474a2698.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/8286.08280ee0.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/5429.770ff2e0.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/8831.2f4dede3.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/2450.88cac39f.chunk.js"></script> <script src="https://web.archive.org/web/20210217042021js_/https://cdn-client.medium.com/lite/static/js/Post.9074c401.chunk.js"></script><script>window.main();</script></body></html><!-- FILE ARCHIVED ON 04:20:21 Feb 17, 2021 AND RETRIEVED FROM THE INTERNET ARCHIVE ON 10:50:25 Dec 01, 2024. JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE. ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C. SECTION 108(a)(3)). --> <!-- playback timings (ms): captures_list: 0.592 exclusion.robots: 0.028 exclusion.robots.policy: 0.017 esindex: 0.011 cdx.remote: 8.905 LoadShardBlock: 117.483 (3) PetaboxLoader3.datanode: 292.289 (4) load_resource: 473.268 PetaboxLoader3.resolve: 55.017 -->