CINXE.COM
<!doctype html><html lang="en"><head><title data-rh="true">Seamless multi-platform app development with Flutter | by Google Play Apps & Games Team | Google Play Apps & Games | Medium</title><meta data-rh="true" charset="utf-8"/><meta data-rh="true" name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1,maximum-scale=1"/><meta data-rh="true" name="theme-color" content="#000000"/><meta data-rh="true" name="twitter:app:name:iphone" content="Medium"/><meta data-rh="true" name="twitter:app:id:iphone" content="828256236"/><meta data-rh="true" property="al:ios:app_name" content="Medium"/><meta data-rh="true" property="al:ios:app_store_id" content="828256236"/><meta data-rh="true" property="al:android:package" content="com.medium.reader"/><meta data-rh="true" property="fb:app_id" content="542599432471018"/><meta data-rh="true" property="og:site_name" content="Medium"/><meta data-rh="true" property="og:type" content="article"/><meta data-rh="true" property="article:published_time" content="2021-03-25T15:02:04.151Z"/><meta data-rh="true" name="title" content="Seamless multi-platform app development with Flutter | by Google Play Apps & Games Team | Google Play Apps & Games | Medium"/><meta data-rh="true" property="og:title" content="Seamless multi-platform app development with Flutter"/><meta data-rh="true" property="al:android:url" content="medium://p/ea0e8003b0f9"/><meta data-rh="true" property="al:ios:url" content="medium://p/ea0e8003b0f9"/><meta data-rh="true" property="al:android:app_name" content="Medium"/><meta data-rh="true" name="description" content="With its latest release of Flutter 2, Flutter’s goal as a multi-platform UI toolkit is to “fundamentally shift how developers think about building apps, starting not with the platform they’re…"/><meta data-rh="true" property="og:description" content="Discover how Flutter supports creating beautiful experiences on any device."/><meta data-rh="true" property="og:url" content="https://medium.com/googleplaydev/seamless-multi-platform-app-development-with-flutter-ea0e8003b0f9"/><meta data-rh="true" property="al:web:url" content="https://medium.com/googleplaydev/seamless-multi-platform-app-development-with-flutter-ea0e8003b0f9"/><meta data-rh="true" property="og:image" content="https://miro.medium.com/v2/resize:fit:1200/1*6wcA4tjbCPDYur5cJNPnTQ.png"/><meta data-rh="true" property="article:author" content="https://medium.com/@googleplayteam"/><meta data-rh="true" name="author" content="Google Play Apps & Games Team"/><meta data-rh="true" name="robots" content="index,noarchive,follow,max-image-preview:large"/><meta data-rh="true" name="referrer" content="unsafe-url"/><meta data-rh="true" property="twitter:title" content="Seamless multi-platform app development with Flutter"/><meta data-rh="true" name="twitter:site" content="@googleplaybiz"/><meta data-rh="true" name="twitter:app:url:iphone" content="medium://p/ea0e8003b0f9"/><meta data-rh="true" property="twitter:description" content="Discover how Flutter supports creating beautiful experiences on any device."/><meta data-rh="true" name="twitter:image:src" content="https://miro.medium.com/v2/resize:fit:1200/1*6wcA4tjbCPDYur5cJNPnTQ.png"/><meta data-rh="true" name="twitter:card" content="summary_large_image"/><meta data-rh="true" name="twitter:creator" content="@GooglePlayBiz"/><meta data-rh="true" name="twitter:label1" content="Reading time"/><meta data-rh="true" name="twitter:data1" content="8 min read"/><link data-rh="true" rel="icon" href="https://miro.medium.com/v2/5d8de952517e8160e40ef9841c781cdc14a5db313057fa3c3de41c6f5b494b19"/><link data-rh="true" rel="search" type="application/opensearchdescription+xml" title="Medium" href="/osd.xml"/><link data-rh="true" rel="apple-touch-icon" sizes="152x152" href="https://miro.medium.com/v2/resize:fill:304:304/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="120x120" href="https://miro.medium.com/v2/resize:fill:240:240/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="76x76" href="https://miro.medium.com/v2/resize:fill:152:152/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="60x60" href="https://miro.medium.com/v2/resize:fill:120:120/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="mask-icon" href="https://miro.medium.com/v2/resize:fill:1000:1000/7*GAOKVe--MXbEJmV9230oOQ.png" color="#171717"/><link data-rh="true" rel="preconnect" href="https://glyph.medium.com" crossOrigin=""/><link data-rh="true" id="glyph_preload_link" rel="preload" as="style" type="text/css" href="https://glyph.medium.com/css/unbound.css"/><link data-rh="true" id="glyph_link" rel="stylesheet" type="text/css" href="https://glyph.medium.com/css/unbound.css"/><link data-rh="true" rel="author" href="https://medium.com/@googleplayteam"/><link data-rh="true" rel="canonical" href="https://medium.com/googleplaydev/seamless-multi-platform-app-development-with-flutter-ea0e8003b0f9"/><link data-rh="true" rel="alternate" href="android-app://com.medium.reader/https/medium.com/p/ea0e8003b0f9"/><script data-rh="true" type="application/ld+json">{"@context":"http:\u002F\u002Fschema.org","@type":"NewsArticle","image":["https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1200\u002F1*6wcA4tjbCPDYur5cJNPnTQ.png"],"url":"https:\u002F\u002Fmedium.com\u002Fgoogleplaydev\u002Fseamless-multi-platform-app-development-with-flutter-ea0e8003b0f9","dateCreated":"2021-03-25T14:59:17.335Z","datePublished":"2021-03-25T14:59:17.335Z","dateModified":"2024-10-26T06:56:56.573Z","headline":"Seamless multi-platform app development with Flutter","name":"Seamless multi-platform app development with Flutter","description":"With its latest release of Flutter 2, Flutter’s goal as a multi-platform UI toolkit is to “fundamentally shift how developers think about building apps, starting not with the platform they’re…","identifier":"ea0e8003b0f9","author":{"@type":"Person","name":"Google Play Apps & Games Team","url":"https:\u002F\u002Fmedium.com\u002F@googleplayteam"},"creator":["Google Play Apps & Games Team"],"publisher":{"@type":"Organization","name":"Google Play Apps & Games","url":"https:\u002F\u002Fmedium.com\u002Fgoogleplaydev","logo":{"@type":"ImageObject","width":272,"height":60,"url":"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:544\u002F7*V1_7XP4snlmqrc_0Njontw.png"}},"mainEntityOfPage":"https:\u002F\u002Fmedium.com\u002Fgoogleplaydev\u002Fseamless-multi-platform-app-development-with-flutter-ea0e8003b0f9"}</script><style type="text/css" data-fela-rehydration="536" data-fela-type="STATIC">html{box-sizing:border-box;-webkit-text-size-adjust:100%}*, *:before, *:after{box-sizing:inherit}body{margin:0;padding:0;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;color:rgba(0,0,0,0.8);position:relative;min-height:100vh}h1, h2, h3, h4, h5, h6, dl, dd, ol, ul, menu, figure, blockquote, p, pre, form{margin:0}menu, ol, ul{padding:0;list-style:none;list-style-image:none}main{display:block}a{color:inherit;text-decoration:none}a, button, input{-webkit-tap-highlight-color:transparent}img, svg{vertical-align:middle}button{background:transparent;overflow:visible}button, input, optgroup, select, textarea{margin:0}:root{--reach-tabs:1;--reach-menu-button:1}#speechify-root{font-family:Sohne, sans-serif}div[data-popper-reference-hidden="true"]{visibility:hidden;pointer-events:none}.grecaptcha-badge{visibility:hidden} /*XCode style (c) Angel Garcia <angelgarcia.mail@gmail.com>*/.hljs {background: #fff;color: black; }/* Gray DOCTYPE selectors like WebKit */ .xml .hljs-meta {color: #c0c0c0; }.hljs-comment, .hljs-quote {color: #007400; }.hljs-tag, .hljs-attribute, .hljs-keyword, .hljs-selector-tag, .hljs-literal, .hljs-name {color: #aa0d91; }.hljs-variable, .hljs-template-variable {color: #3F6E74; }.hljs-code, .hljs-string, .hljs-meta .hljs-string {color: #c41a16; }.hljs-regexp, .hljs-link {color: #0E0EFF; }.hljs-title, .hljs-symbol, .hljs-bullet, .hljs-number {color: #1c00cf; }.hljs-section, .hljs-meta {color: #643820; }.hljs-title.class_, .hljs-class .hljs-title, .hljs-type, .hljs-built_in, .hljs-params {color: #5c2699; }.hljs-attr {color: #836C28; }.hljs-subst {color: #000; }.hljs-formula {background-color: #eee;font-style: italic; }.hljs-addition {background-color: #baeeba; }.hljs-deletion {background-color: #ffc8bd; }.hljs-selector-id, .hljs-selector-class {color: #9b703f; }.hljs-doctag, .hljs-strong {font-weight: bold; }.hljs-emphasis {font-style: italic; } </style><style type="text/css" data-fela-rehydration="536" data-fela-type="KEYFRAME">@-webkit-keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}@-moz-keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}@keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}</style><style type="text/css" data-fela-rehydration="536" data-fela-type="RULE">.a{font-family:medium-content-sans-serif-font, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif}.b{font-weight:400}.c{background-color:rgba(255, 255, 255, 1)}.l{display:block}.m{position:sticky}.n{top:0}.o{z-index:500}.p{padding:0 24px}.q{align-items:center}.r{border-bottom:solid 1px #F2F2F2}.y{height:41px}.z{line-height:20px}.ab{display:flex}.ac{height:57px}.ae{flex:1 0 auto}.af{color:inherit}.ag{fill:inherit}.ah{font-size:inherit}.ai{border:inherit}.aj{font-family:inherit}.ak{letter-spacing:inherit}.al{font-weight:inherit}.am{padding:0}.an{margin:0}.ao{cursor:pointer}.ap:disabled{cursor:not-allowed}.aq:disabled{color:#6B6B6B}.ar:disabled{fill:#6B6B6B}.au{width:auto}.av path{fill:#242424}.aw{height:25px}.ax{margin-left:16px}.ay{border:none}.az{border-radius:20px}.ba{width:240px}.bb{background:#F9F9F9}.bc path{fill:#6B6B6B}.be{outline:none}.bf{font-family:sohne, "Helvetica Neue", Helvetica, Arial, sans-serif}.bg{font-size:14px}.bh{width:100%}.bi{padding:10px 20px 10px 0}.bj{background-color:transparent}.bk{color:#242424}.bl::placeholder{color:#6B6B6B}.bm{display:inline-block}.bn{margin-left:12px}.bo{margin-right:12px}.bp{border-radius:4px}.bq{margin-left:24px}.br{height:24px}.bx{background-color:#F9F9F9}.by{border-radius:50%}.bz{height:32px}.ca{width:32px}.cb{justify-content:center}.ch{max-width:680px}.ci{min-width:0}.cj{animation:k1 1.2s ease-in-out infinite}.ck{height:100vh}.cl{margin-bottom:16px}.cm{margin-top:48px}.cn{align-items:flex-start}.co{flex-direction:column}.cp{justify-content:space-between}.cq{margin-bottom:24px}.cw{width:80%}.cx{background-color:#F2F2F2}.dd{height:44px}.de{width:44px}.df{margin:auto 0}.dg{margin-bottom:4px}.dh{height:16px}.di{width:120px}.dj{width:80px}.dp{margin-bottom:8px}.dq{width:96%}.dr{width:98%}.ds{width:81%}.dt{margin-left:8px}.du{color:#6B6B6B}.dv{font-size:13px}.dw{height:100%}.ep{color:#FFFFFF}.eq{fill:#FFFFFF}.er{background:rgba(66, 126, 255, 1)}.es{border-color:rgba(66, 126, 255, 1)}.ew:disabled{cursor:inherit !important}.ex:disabled{opacity:0.3}.ey:disabled:hover{background:rgba(66, 126, 255, 1)}.ez:disabled:hover{border-color:rgba(66, 126, 255, 1)}.fa{border-radius:99em}.fb{border-width:1px}.fc{border-style:solid}.fd{box-sizing:border-box}.fe{text-decoration:none}.ff{text-align:center}.fi{margin-right:32px}.fj{position:relative}.fk{fill:#6B6B6B}.fn{background:transparent}.fo svg{margin-left:4px}.fp svg{fill:#6B6B6B}.fr{box-shadow:inset 0 0 0 1px rgba(0, 0, 0, 0.05)}.fs{position:absolute}.fz{margin:0 24px}.gd{background:rgba(255, 255, 255, 1)}.ge{border:1px solid #F2F2F2}.gf{box-shadow:0 1px 4px #F2F2F2}.gg{max-height:100vh}.gh{overflow-y:auto}.gi{left:0}.gj{top:calc(100vh + 100px)}.gk{bottom:calc(100vh + 100px)}.gl{width:10px}.gm{pointer-events:none}.gn{word-break:break-word}.go{word-wrap:break-word}.gp:after{display:block}.gq:after{content:""}.gr:after{clear:both}.gs{clear:both}.gt{margin-top:0px}.gu{max-width:100%}.gv{height:auto}.gw{line-height:1.23}.gx{letter-spacing:0}.gy{font-style:normal}.gz{font-weight:700}.hu{margin-bottom:-0.27em}.hv{line-height:1.394}.iq{align-items:baseline}.ir{width:48px}.is{height:48px}.it{border:2px solid rgba(255, 255, 255, 1)}.iu{z-index:0}.iv{box-shadow:none}.iw{border:1px solid rgba(0, 0, 0, 0.05)}.ix{margin-left:-12px}.iy{width:28px}.iz{height:28px}.ja{z-index:1}.jb{width:24px}.jc{margin-bottom:2px}.jd{flex-wrap:nowrap}.je{font-size:16px}.jf{line-height:24px}.jh{margin:0 8px}.ji{display:inline}.jj{color:rgba(66, 126, 255, 1)}.jk{fill:rgba(66, 126, 255, 1)}.jn{flex:0 0 auto}.jq{flex-wrap:wrap}.jt{white-space:pre-wrap}.ju{margin-right:4px}.jv{overflow:hidden}.jw{max-height:20px}.jx{text-overflow:ellipsis}.jy{display:-webkit-box}.jz{-webkit-line-clamp:1}.ka{-webkit-box-orient:vertical}.kb{word-break:break-all}.kd{padding-left:8px}.ke{padding-right:8px}.lf> *{flex-shrink:0}.lg{overflow-x:scroll}.lh::-webkit-scrollbar{display:none}.li{scrollbar-width:none}.lj{-ms-overflow-style:none}.lk{width:74px}.ll{flex-direction:row}.lm{z-index:2}.lp{-webkit-user-select:none}.lq{border:0}.lr{fill:rgba(117, 117, 117, 1)}.lu{outline:0}.lv{user-select:none}.lw> svg{pointer-events:none}.mf{cursor:progress}.mg{opacity:1}.mh{padding:4px 0}.mk{width:16px}.mm{display:inline-flex}.ms{padding:8px 2px}.mt svg{color:#6B6B6B}.nk{line-height:1.58}.nl{letter-spacing:-0.004em}.nm{font-family:source-serif-pro, Georgia, Cambria, "Times New Roman", Times, serif}.of{margin-bottom:-0.46em}.og{text-decoration:underline}.oh{font-style:italic}.oi{line-height:1.12}.oj{letter-spacing:-0.022em}.ok{font-weight:600}.pd{margin-bottom:-0.28em}.pj{margin-left:auto}.pk{margin-right:auto}.pl{max-width:1600px}.ps{cursor:zoom-in}.pt{z-index:auto}.pv{margin-top:10px}.pw{max-width:728px}.pz{list-style-type:disc}.qa{margin-left:30px}.qb{padding-left:0px}.qh{margin-bottom:26px}.qi{margin-top:6px}.qj{margin-top:8px}.qk{margin-right:8px}.ql{padding:8px 16px}.qm{border-radius:100px}.qn{transition:background 300ms ease}.qp{white-space:nowrap}.qq{border-top:none}.qw{height:52px}.qx{max-height:52px}.qy{box-sizing:content-box}.qz{position:static}.rb{max-width:155px}.rh{margin-right:20px}.rn{margin-bottom:48px}.sb{border-radius:2px}.sd{height:64px}.se{width:64px}.sf{align-self:flex-end}.sg{flex:1 1 auto}.sm{padding-right:4px}.sn{font-weight:500}.ta{margin-top:16px}.tb{color:rgba(255, 255, 255, 1)}.tc{fill:rgba(255, 255, 255, 1)}.td{background:rgba(25, 25, 25, 1)}.te{border-color:rgba(25, 25, 25, 1)}.th:disabled{opacity:0.1}.ti:disabled:hover{background:rgba(25, 25, 25, 1)}.tj:disabled:hover{border-color:rgba(25, 25, 25, 1)}.tk{height:0px}.tl{border-bottom:solid 1px #E5E5E5}.tm{margin-top:56px}.tn{margin-top:72px}.to{padding:24px 0}.tp{margin-bottom:0px}.tq{margin-right:16px}.as:hover:not(:disabled){color:rgba(25, 25, 25, 1)}.at:hover:not(:disabled){fill:rgba(25, 25, 25, 1)}.et:hover{background:rgba(62, 110, 230, 1)}.eu:hover{border-color:rgba(62, 110, 230, 1)}.ev:hover{cursor:pointer}.fl:hover{color:#242424}.fm:hover{fill:#242424}.fq:hover svg{fill:#242424}.ft:hover{background-color:rgba(0, 0, 0, 0.1)}.jg:hover{text-decoration:underline}.jl:hover:not(:disabled){color:rgba(62, 110, 230, 1)}.jm:hover:not(:disabled){fill:rgba(62, 110, 230, 1)}.lt:hover{fill:rgba(8, 8, 8, 1)}.mi:hover{fill:#000000}.mj:hover p{color:#000000}.ml:hover{color:#000000}.mu:hover svg{color:#000000}.qo:hover{background-color:#F2F2F2}.sc:hover{background-color:none}.tf:hover{background:#000000}.tg:hover{border-color:#242424}.bd:focus-within path{fill:#242424}.ls:focus{fill:rgba(8, 8, 8, 1)}.mv:focus svg{color:#000000}.pu:focus{transform:scale(1.01)}.lx:active{border-style:none}</style><style type="text/css" data-fela-rehydration="536" data-fela-type="RULE" media="all and (min-width: 1080px)">.d{display:none}.bw{width:64px}.cg{margin:0 64px}.cv{height:48px}.dc{margin-bottom:52px}.do{margin-bottom:48px}.ef{font-size:14px}.eg{line-height:20px}.em{font-size:13px}.eo{padding:5px 12px}.fh{display:flex}.fy{margin-bottom:68px}.gc{max-width:680px}.hq{font-size:42px}.hr{margin-top:1em}.hs{line-height:52px}.ht{letter-spacing:-0.011em}.ii{font-size:22px}.ij{margin-top:0.92em}.ik{line-height:28px}.ip{align-items:center}.kr{border-top:solid 1px #F2F2F2}.ks{border-bottom:solid 1px #F2F2F2}.kt{margin:32px 0 0}.ku{padding:3px 8px}.ld> *{margin-right:24px}.le> :last-child{margin-right:0}.me{margin-top:0px}.mr{margin:0}.ob{font-size:20px}.oc{margin-top:2.14em}.od{line-height:32px}.oe{letter-spacing:-0.003em}.oz{font-size:24px}.pa{margin-top:1.95em}.pb{line-height:30px}.pc{letter-spacing:-0.016em}.pi{margin-top:0.94em}.pq{margin-top:56px}.qg{margin-top:1.14em}.qv{margin-bottom:88px}.rg{display:inline-block}.rm{padding-top:72px}.ro{flex-direction:row}.rr{margin-bottom:0}.rs{margin-right:20px}.sh{max-width:500px}.sy{line-height:24px}.sz{letter-spacing:0}</style><style type="text/css" data-fela-rehydration="536" data-fela-type="RULE" media="all and (max-width: 1079.98px)">.e{display:none}.md{margin-top:0px}.px{margin-left:auto}.py{text-align:center}.rf{display:inline-block}</style><style type="text/css" data-fela-rehydration="536" data-fela-type="RULE" media="all and (max-width: 903.98px)">.f{display:none}.mc{margin-top:0px}.re{display:inline-block}</style><style type="text/css" data-fela-rehydration="536" data-fela-type="RULE" media="all and (max-width: 727.98px)">.g{display:none}.ma{margin-top:0px}.mb{margin-right:0px}.rd{display:inline-block}</style><style type="text/css" data-fela-rehydration="536" data-fela-type="RULE" media="all and (max-width: 551.98px)">.h{display:none}.s{display:flex}.t{justify-content:space-between}.bs{width:24px}.cc{margin:0 24px}.cr{height:40px}.cy{margin-bottom:44px}.dk{margin-bottom:32px}.dx{font-size:13px}.dy{line-height:20px}.eh{padding:0px 8px 1px}.fu{margin-bottom:4px}.ha{font-size:32px}.hb{margin-top:1.01em}.hc{line-height:38px}.hd{letter-spacing:-0.014em}.hw{font-size:18px}.hx{margin-top:0.79em}.hy{line-height:24px}.il{align-items:flex-start}.jo{flex-direction:column}.jr{margin-bottom:2px}.kf{margin:24px -24px 0}.kg{padding:0}.kv> *{margin-right:8px}.kw> :last-child{margin-right:24px}.ln{margin-left:0px}.ly{margin-top:0px}.lz{margin-right:0px}.mn{margin:0}.mw{border:1px solid #F2F2F2}.mx{border-radius:99em}.my{padding:0px 16px 0px 12px}.mz{height:38px}.na{align-items:center}.nc svg{margin-right:8px}.nn{margin-top:1.56em}.no{line-height:28px}.np{letter-spacing:-0.003em}.ol{font-size:20px}.om{margin-top:1.2em}.on{letter-spacing:0}.pe{margin-top:0.67em}.pm{margin-top:40px}.qc{margin-top:1.34em}.qr{margin-bottom:80px}.rc{display:inline-block}.ri{padding-top:48px}.rz{margin-bottom:20px}.sa{margin-right:0}.sl{max-width:100%}.so{font-size:24px}.sp{line-height:30px}.sq{letter-spacing:-0.016em}.nb:hover{border-color:#E5E5E5}</style><style type="text/css" data-fela-rehydration="536" data-fela-type="RULE" media="all and (min-width: 904px) and (max-width: 1079.98px)">.i{display:none}.bv{width:64px}.cf{margin:0 64px}.cu{height:48px}.db{margin-bottom:52px}.dn{margin-bottom:48px}.ed{font-size:14px}.ee{line-height:20px}.ek{font-size:13px}.el{padding:5px 12px}.fg{display:flex}.fx{margin-bottom:68px}.gb{max-width:680px}.hm{font-size:42px}.hn{margin-top:1em}.ho{line-height:52px}.hp{letter-spacing:-0.011em}.if{font-size:22px}.ig{margin-top:0.92em}.ih{line-height:28px}.io{align-items:center}.kn{border-top:solid 1px #F2F2F2}.ko{border-bottom:solid 1px #F2F2F2}.kp{margin:32px 0 0}.kq{padding:3px 8px}.lb> *{margin-right:24px}.lc> :last-child{margin-right:0}.mq{margin:0}.nx{font-size:20px}.ny{margin-top:2.14em}.nz{line-height:32px}.oa{letter-spacing:-0.003em}.ov{font-size:24px}.ow{margin-top:1.95em}.ox{line-height:30px}.oy{letter-spacing:-0.016em}.ph{margin-top:0.94em}.pp{margin-top:56px}.qf{margin-top:1.14em}.qu{margin-bottom:88px}.rl{padding-top:72px}.rp{flex-direction:row}.rt{margin-bottom:0}.ru{margin-right:20px}.si{max-width:500px}.sw{line-height:24px}.sx{letter-spacing:0}</style><style type="text/css" data-fela-rehydration="536" data-fela-type="RULE" media="all and (min-width: 728px) and (max-width: 903.98px)">.j{display:none}.w{display:flex}.x{justify-content:space-between}.bu{width:64px}.ce{margin:0 48px}.ct{height:48px}.da{margin-bottom:52px}.dm{margin-bottom:48px}.eb{font-size:13px}.ec{line-height:20px}.ej{padding:0px 8px 1px}.fw{margin-bottom:68px}.ga{max-width:680px}.hi{font-size:42px}.hj{margin-top:1em}.hk{line-height:52px}.hl{letter-spacing:-0.011em}.ic{font-size:22px}.id{margin-top:0.92em}.ie{line-height:28px}.in{align-items:center}.kj{border-top:solid 1px #F2F2F2}.kk{border-bottom:solid 1px #F2F2F2}.kl{margin:32px 0 0}.km{padding:3px 8px}.kz> *{margin-right:24px}.la> :last-child{margin-right:0}.mp{margin:0}.nt{font-size:20px}.nu{margin-top:2.14em}.nv{line-height:32px}.nw{letter-spacing:-0.003em}.or{font-size:24px}.os{margin-top:1.95em}.ot{line-height:30px}.ou{letter-spacing:-0.016em}.pg{margin-top:0.94em}.po{margin-top:56px}.qe{margin-top:1.14em}.qt{margin-bottom:88px}.rk{padding-top:72px}.rq{flex-direction:row}.rv{margin-bottom:0}.rw{margin-right:20px}.sj{max-width:500px}.su{line-height:24px}.sv{letter-spacing:0}</style><style type="text/css" data-fela-rehydration="536" data-fela-type="RULE" media="all and (min-width: 552px) and (max-width: 727.98px)">.k{display:none}.u{display:flex}.v{justify-content:space-between}.bt{width:24px}.cd{margin:0 24px}.cs{height:40px}.cz{margin-bottom:44px}.dl{margin-bottom:32px}.dz{font-size:13px}.ea{line-height:20px}.ei{padding:0px 8px 1px}.fv{margin-bottom:4px}.he{font-size:32px}.hf{margin-top:1.01em}.hg{line-height:38px}.hh{letter-spacing:-0.014em}.hz{font-size:18px}.ia{margin-top:0.79em}.ib{line-height:24px}.im{align-items:flex-start}.jp{flex-direction:column}.js{margin-bottom:2px}.kh{margin:24px 0 0}.ki{padding:0}.kx> *{margin-right:8px}.ky> :last-child{margin-right:8px}.lo{margin-left:0px}.mo{margin:0}.nd{border:1px solid #F2F2F2}.ne{border-radius:99em}.nf{padding:0px 16px 0px 12px}.ng{height:38px}.nh{align-items:center}.nj svg{margin-right:8px}.nq{margin-top:1.56em}.nr{line-height:28px}.ns{letter-spacing:-0.003em}.oo{font-size:20px}.op{margin-top:1.2em}.oq{letter-spacing:0}.pf{margin-top:0.67em}.pn{margin-top:40px}.qd{margin-top:1.34em}.qs{margin-bottom:80px}.rj{padding-top:48px}.rx{margin-bottom:20px}.ry{margin-right:0}.sk{max-width:100%}.sr{font-size:24px}.ss{line-height:30px}.st{letter-spacing:-0.016em}.ni:hover{border-color:#E5E5E5}</style><style type="text/css" data-fela-rehydration="536" data-fela-type="RULE" media="print">.ra{display:none}</style><style type="text/css" data-fela-rehydration="536" data-fela-type="RULE" media="(orientation: landscape) and (max-width: 903.98px)">.kc{max-height:none}</style><style type="text/css" data-fela-rehydration="536" data-fela-type="RULE" media="(prefers-reduced-motion: no-preference)">.pr{transition:transform 300ms cubic-bezier(0.2, 0, 0.2, 1)}</style></head><body><div id="root"><div class="a b c"><div class="d e f g h i j k"></div><script>document.domain = document.domain;</script><div class="l c"><div class="l m n o c"><div class="p q r s t u v w x i d y z"><a class="du ag dv bf ak b am an ao ap aq ar as at s u w i d q dw z" href="https://rsci.app.link/?%24canonical_url=https%3A%2F%2Fmedium.com%2Fp%2Fea0e8003b0f9&%7Efeature=LoOpenInAppButton&%7Echannel=ShowPostUnderCollection&source=---top_nav_layout_nav----------------------------------" rel="noopener follow">Open in app<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" fill="none" viewBox="0 0 10 10" class="dt"><path fill="currentColor" d="M.985 8.485a.375.375 0 1 0 .53.53zM8.75 1.25h.375A.375.375 0 0 0 8.75.875zM8.375 6.5a.375.375 0 1 0 .75 0zM3.5.875a.375.375 0 1 0 0 .75zm-1.985 8.14 7.5-7.5-.53-.53-7.5 7.5zm6.86-7.765V6.5h.75V1.25zM3.5 1.625h5.25v-.75H3.5z"></path></svg></a><div class="ab q"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><button class="bf b dx dy eh dz ea ei eb ec ej ek ee el em eg eo ep eq er es et eu ev ew ex ey ez fa fb fc fd bm fe ff" data-testid="headerSignUpButton">Sign up</button></span></p><div class="ax l"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSignInButton" rel="noopener follow" href="/m/signin?operation=login&redirect=https%3A%2F%2Fmedium.com%2Fgoogleplaydev%2Fseamless-multi-platform-app-development-with-flutter-ea0e8003b0f9&source=post_page---top_nav_layout_nav-----------------------global_nav-----------">Sign in</a></span></p></div></div></div><div class="p q r ab ac"><div class="ab q ae"><a class="af ag ah ai aj ak al am an ao ap aq ar as at ab" aria-label="Homepage" data-testid="headerMediumLogo" rel="noopener follow" href="/?source=---top_nav_layout_nav----------------------------------"><svg xmlns="http://www.w3.org/2000/svg" width="719" height="160" fill="none" viewBox="0 0 719 160" class="au av aw"><path fill="#242424" d="m174.104 9.734.215-.047V8.02H130.39L89.6 103.89 48.81 8.021H1.472v1.666l.212.047c8.018 1.81 12.09 4.509 12.09 14.242V137.93c0 9.734-4.087 12.433-12.106 14.243l-.212.047v1.671h32.118v-1.665l-.213-.048c-8.018-1.809-12.089-4.509-12.089-14.242V30.586l52.399 123.305h2.972l53.925-126.743V140.75c-.687 7.688-4.721 10.062-11.982 11.701l-.215.05v1.652h55.948v-1.652l-.215-.05c-7.269-1.639-11.4-4.013-12.087-11.701l-.037-116.774h.037c0-9.733 4.071-12.432 12.087-14.242m25.555 75.488c.915-20.474 8.268-35.252 20.606-35.507 3.806.063 6.998 1.312 9.479 3.714 5.272 5.118 7.751 15.812 7.368 31.793zm-.553 5.77h65.573v-.275c-.186-15.656-4.721-27.834-13.466-36.196-7.559-7.227-18.751-11.203-30.507-11.203h-.263c-6.101 0-13.584 1.48-18.909 4.16-6.061 2.807-11.407 7.003-15.855 12.511-7.161 8.874-11.499 20.866-12.554 34.343q-.05.606-.092 1.212a50 50 0 0 0-.065 1.151 85.807 85.807 0 0 0-.094 5.689c.71 30.524 17.198 54.917 46.483 54.917 25.705 0 40.675-18.791 44.407-44.013l-1.886-.664c-6.557 13.556-18.334 21.771-31.738 20.769-18.297-1.369-32.314-19.922-31.042-42.395m139.722 41.359c-2.151 5.101-6.639 7.908-12.653 7.908s-11.513-4.129-15.418-11.63c-4.197-8.053-6.405-19.436-6.405-32.92 0-28.067 8.729-46.22 22.24-46.22 5.657 0 10.111 2.807 12.236 7.704zm43.499 20.008c-8.019-1.897-12.089-4.722-12.089-14.951V1.309l-48.716 14.353v1.757l.299-.024c6.72-.543 11.278.386 13.925 2.83 2.072 1.915 3.082 4.853 3.082 8.987v18.66c-4.803-3.067-10.516-4.56-17.448-4.56-14.059 0-26.909 5.92-36.176 16.672-9.66 11.205-14.767 26.518-14.767 44.278-.003 31.72 15.612 53.039 38.851 53.039 13.595 0 24.533-7.449 29.54-20.013v16.865h43.711v-1.746zM424.1 19.819c0-9.904-7.468-17.374-17.375-17.374-9.859 0-17.573 7.632-17.573 17.374s7.721 17.374 17.573 17.374c9.907 0 17.375-7.47 17.375-17.374m11.499 132.546c-8.019-1.897-12.089-4.722-12.089-14.951h-.035V43.635l-43.714 12.551v1.705l.263.024c9.458.842 12.047 4.1 12.047 15.152v81.086h43.751v-1.746zm112.013 0c-8.018-1.897-12.089-4.722-12.089-14.951V43.635l-41.621 12.137v1.71l.246.026c7.733.813 9.967 4.257 9.967 15.36v59.279c-2.578 5.102-7.415 8.131-13.274 8.336-9.503 0-14.736-6.419-14.736-18.073V43.638l-43.714 12.55v1.703l.262.024c9.459.84 12.05 4.097 12.05 15.152v50.17a56.3 56.3 0 0 0 .91 10.444l.787 3.423c3.701 13.262 13.398 20.197 28.59 20.197 12.868 0 24.147-7.966 29.115-20.43v17.311h43.714v-1.747zm169.818 1.788v-1.749l-.213-.05c-8.7-2.006-12.089-5.789-12.089-13.49v-63.79c0-19.89-11.171-31.761-29.883-31.761-13.64 0-25.141 7.882-29.569 20.16-3.517-13.01-13.639-20.16-28.606-20.16-13.146 0-23.449 6.938-27.869 18.657V43.643L545.487 55.68v1.715l.263.024c9.345.829 12.047 4.181 12.047 14.95v81.784h40.787v-1.746l-.215-.053c-6.941-1.631-9.181-4.606-9.181-12.239V66.998c1.836-4.289 5.537-9.37 12.853-9.37 9.086 0 13.692 6.296 13.692 18.697v77.828h40.797v-1.746l-.215-.053c-6.94-1.631-9.18-4.606-9.18-12.239V75.066a42 42 0 0 0-.578-7.26c1.947-4.661 5.86-10.177 13.475-10.177 9.214 0 13.691 6.114 13.691 18.696v77.828z"></path></svg></a><div class="ax h"><div class="ab ay az ba bb q bc bd"><div class="bm" aria-hidden="false" aria-describedby="searchResults" aria-labelledby="searchResults"></div><div class="bn bo ab"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M4.092 11.06a6.95 6.95 0 1 1 13.9 0 6.95 6.95 0 0 1-13.9 0m6.95-8.05a8.05 8.05 0 1 0 5.13 14.26l3.75 3.75a.56.56 0 1 0 .79-.79l-3.73-3.73A8.05 8.05 0 0 0 11.042 3z" clip-rule="evenodd"></path></svg></div><input role="combobox" aria-controls="searchResults" aria-expanded="false" aria-label="search" data-testid="headerSearchInput" tabindex="0" class="ay be bf bg z bh bi bj bk bl" placeholder="Search" value=""/></div></div></div><div class="h k w fg fh"><div class="fi ab"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerWriteButton" rel="noopener follow" href="/m/signin?operation=register&redirect=https%3A%2F%2Fmedium.com%2Fnew-story&source=---top_nav_layout_nav-----------------------new_post_topnav-----------"><div class="bf b bg z du fj fk ab q fl fm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24" aria-label="Write"><path fill="currentColor" d="M14 4a.5.5 0 0 0 0-1zm7 6a.5.5 0 0 0-1 0zm-7-7H4v1h10zM3 4v16h1V4zm1 17h16v-1H4zm17-1V10h-1v10zm-1 1a1 1 0 0 0 1-1h-1zM3 20a1 1 0 0 0 1 1v-1zM4 3a1 1 0 0 0-1 1h1z"></path><path stroke="currentColor" d="m17.5 4.5-8.458 8.458a.25.25 0 0 0-.06.098l-.824 2.47a.25.25 0 0 0 .316.316l2.47-.823a.25.25 0 0 0 .098-.06L19.5 6.5m-2-2 2.323-2.323a.25.25 0 0 1 .354 0l1.646 1.646a.25.25 0 0 1 0 .354L19.5 6.5m-2-2 2 2"></path></svg><div class="dt l">Write</div></div></a></span></div></div><div class="k j i d"><div class="fi ab"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSearchButton" rel="noopener follow" href="/search?source=---top_nav_layout_nav----------------------------------"><div class="bf b bg z du fj fk ab q fl fm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24" aria-label="Search"><path fill="currentColor" fill-rule="evenodd" d="M4.092 11.06a6.95 6.95 0 1 1 13.9 0 6.95 6.95 0 0 1-13.9 0m6.95-8.05a8.05 8.05 0 1 0 5.13 14.26l3.75 3.75a.56.56 0 1 0 .79-.79l-3.73-3.73A8.05 8.05 0 0 0 11.042 3z" clip-rule="evenodd"></path></svg></div></a></div></div><div class="fi h k j"><div class="ab q"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><button class="bf b dx dy eh dz ea ei eb ec ej ek ee el em eg eo ep eq er es et eu ev ew ex ey ez fa fb fc fd bm fe ff" data-testid="headerSignUpButton">Sign up</button></span></p><div class="ax l"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSignInButton" rel="noopener follow" href="/m/signin?operation=login&redirect=https%3A%2F%2Fmedium.com%2Fgoogleplaydev%2Fseamless-multi-platform-app-development-with-flutter-ea0e8003b0f9&source=post_page---top_nav_layout_nav-----------------------global_nav-----------">Sign in</a></span></p></div></div></div><div class="l" aria-hidden="false"><button class="ay fn am ab q ao fo fp fq" aria-label="user options menu" data-testid="headerUserIcon"><div class="l fj"><img alt="" class="l fd by bz ca cx" src="https://miro.medium.com/v2/resize:fill:64:64/1*dmbNkD5D-u45r44go_cf0g.png" width="32" height="32" loading="lazy" role="presentation"/><div class="fr by l bz ca fs n ay ft"></div></div></button></div></div></div><div class="l"><div class="fu fv fw fx fy l"><div class="ab cb"><div class="ci bh fz ga gb gc"></div></div><article><div class="l"><div class="l"><span class="l"></span><section><div><div class="fs gi gj gk gl gm"></div><div class="gn go gp gq gr"><div class="gs bh"><figure class="gt gs bh paragraph-image"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/1*6wcA4tjbCPDYur5cJNPnTQ.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*6wcA4tjbCPDYur5cJNPnTQ.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*6wcA4tjbCPDYur5cJNPnTQ.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*6wcA4tjbCPDYur5cJNPnTQ.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*6wcA4tjbCPDYur5cJNPnTQ.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*6wcA4tjbCPDYur5cJNPnTQ.png 1100w, https://miro.medium.com/v2/resize:fit:4800/format:webp/1*6wcA4tjbCPDYur5cJNPnTQ.png 4800w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 100vw" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/1*6wcA4tjbCPDYur5cJNPnTQ.png 640w, https://miro.medium.com/v2/resize:fit:720/1*6wcA4tjbCPDYur5cJNPnTQ.png 720w, https://miro.medium.com/v2/resize:fit:750/1*6wcA4tjbCPDYur5cJNPnTQ.png 750w, https://miro.medium.com/v2/resize:fit:786/1*6wcA4tjbCPDYur5cJNPnTQ.png 786w, https://miro.medium.com/v2/resize:fit:828/1*6wcA4tjbCPDYur5cJNPnTQ.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*6wcA4tjbCPDYur5cJNPnTQ.png 1100w, https://miro.medium.com/v2/resize:fit:4800/1*6wcA4tjbCPDYur5cJNPnTQ.png 4800w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 100vw"/><img alt="" class="bh gu gv c" width="2400" height="2507" loading="eager" role="presentation"/></picture></figure></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div><h1 id="a57b" class="pw-post-title gw gx gy bf gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu bk" data-testid="storyTitle">Seamless multi-platform app development with Flutter</h1></div><div><h2 id="6e3c" class="pw-subtitle-paragraph hv gx gy bf b hw hx hy hz ia ib ic id ie if ig ih ii ij ik cq du">Discover how Flutter supports creating beautiful experiences on any device.</h2><div><div class="speechify-ignore ab cp"><div class="speechify-ignore bh l"><div class="il im in io ip ab"><div><div class="ab iq"><div><div class="bm" aria-hidden="false"><a rel="noopener follow" href="/@googleplayteam?source=post_page---byline--ea0e8003b0f9--------------------------------"><div class="l ir is by it iu"><div class="l fj"><img alt="Google Play Apps & Games Team" class="l fd by dd de cx" src="https://miro.medium.com/v2/resize:fill:88:88/1*hlOhkSEII_3WbmUD6OkWmQ.png" width="44" height="44" loading="lazy" data-testid="authorPhoto"/><div class="iv by l dd de fs n iw ft"></div></div></div></a></div></div><div class="ix ab fj"><div><div class="bm" aria-hidden="false"><a href="https://medium.com/googleplaydev?source=post_page---byline--ea0e8003b0f9--------------------------------" rel="noopener follow"><div class="l iy iz by it ja"><div class="l fj"><img alt="Google Play Apps & Games" class="l fd by br jb cx" src="https://miro.medium.com/v2/resize:fill:48:48/1*PwgNVOb5tR6qM0jJxqrIkw.jpeg" width="24" height="24" loading="lazy" data-testid="publicationPhoto"/><div class="iv by l br jb fs n iw ft"></div></div></div></a></div></div></div></div></div><div class="bn bh l"><div class="ab"><div style="flex:1"><span class="bf b bg z bk"><div class="jc ab q"><div class="ab q jd"><div class="ab q"><div><div class="bm" aria-hidden="false"><p class="bf b je jf bk"><a class="af ag ah ai aj ak al am an ao ap aq ar jg" data-testid="authorName" rel="noopener follow" href="/@googleplayteam?source=post_page---byline--ea0e8003b0f9--------------------------------">Google Play Apps & Games Team</a></p></div></div></div><span class="jh ji" aria-hidden="true"><span class="bf b bg z du">·</span></span><p class="bf b je jf du"><span><a class="jj jk ah ai aj ak al am an ao ap aq ar ex jl jm" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fsubscribe%2Fuser%2Fa28469f5b06f&operation=register&redirect=https%3A%2F%2Fmedium.com%2Fgoogleplaydev%2Fseamless-multi-platform-app-development-with-flutter-ea0e8003b0f9&user=Google+Play+Apps+%26+Games+Team&userId=a28469f5b06f&source=post_page-a28469f5b06f--byline--ea0e8003b0f9---------------------post_header-----------">Follow</a></span></p></div></div></span></div></div><div class="l jn"><span class="bf b bg z du"><div class="ab cn jo jp jq"><div class="jr js ab"><div class="bf b bg z du ab jt"><span class="ju l jn">Published in</span><div><div class="l" aria-hidden="false"><a class="af ag ah ai aj ak al am an ao ap aq ar jg ab q" data-testid="publicationName" href="https://medium.com/googleplaydev?source=post_page---byline--ea0e8003b0f9--------------------------------" rel="noopener follow"><p class="bf b bg z jv jw jx jy jz ka kb kc bk">Google Play Apps & Games</p></a></div></div></div><div class="h k"><span class="jh ji" aria-hidden="true"><span class="bf b bg z du">·</span></span></div></div><span class="bf b bg z du"><div class="ab ae"><span data-testid="storyReadTime">8 min read</span><div class="kd ke l" aria-hidden="true"><span class="l" aria-hidden="true"><span class="bf b bg z du">·</span></span></div><span data-testid="storyPublishDate">Mar 25, 2021</span></div></span></div></span></div></div></div><div class="ab cp kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku"><div class="h k w fg fh q"><div class="lk l"><div class="ab q ll lm"><div class="pw-multi-vote-icon fj ju ln lo lp"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerClapButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Fgoogleplaydev%2Fea0e8003b0f9&operation=register&redirect=https%3A%2F%2Fmedium.com%2Fgoogleplaydev%2Fseamless-multi-platform-app-development-with-flutter-ea0e8003b0f9&user=Google+Play+Apps+%26+Games+Team&userId=a28469f5b06f&source=---header_actions--ea0e8003b0f9---------------------clap_footer-----------"><div><div class="bm" aria-hidden="false"><div class="lq ao lr ls lt lu am lv lw lx lp"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l ly lz ma mb mc md me"><p class="bf b dv z du"><span class="mf">--</span></p></div></div></div><div><div class="bm" aria-hidden="false"><button class="ao lq mg mh ab q fk mi mj" aria-label="responses"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" class="gt"><path d="M18.006 16.803c1.533-1.456 2.234-3.325 2.234-5.321C20.24 7.357 16.709 4 12.191 4S4 7.357 4 11.482c0 4.126 3.674 7.482 8.191 7.482.817 0 1.622-.111 2.393-.327.231.2.48.391.744.559 1.06.693 2.203 1.044 3.399 1.044.224-.008.4-.112.486-.287a.49.49 0 0 0-.042-.518c-.495-.67-.845-1.364-1.04-2.057a4 4 0 0 1-.125-.598zm-3.122 1.055-.067-.223-.315.096a8 8 0 0 1-2.311.338c-4.023 0-7.292-2.955-7.292-6.587 0-3.633 3.269-6.588 7.292-6.588 4.014 0 7.112 2.958 7.112 6.593 0 1.794-.608 3.469-2.027 4.72l-.195.168v.255c0 .056 0 .151.016.295.025.231.081.478.154.733.154.558.398 1.117.722 1.659a5.3 5.3 0 0 1-2.165-.845c-.276-.176-.714-.383-.941-.59z"></path></svg></button></div></div></div><div class="ab q kv kw kx ky kz la lb lc ld le lf lg lh li lj"><div class="mk k j i d"></div><div class="h k"><div><div class="bm" aria-hidden="false"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerBookmarkButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fbookmark%2Fp%2Fea0e8003b0f9&operation=register&redirect=https%3A%2F%2Fmedium.com%2Fgoogleplaydev%2Fseamless-multi-platform-app-development-with-flutter-ea0e8003b0f9&source=---header_actions--ea0e8003b0f9---------------------bookmark_footer-----------"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" fill="none" viewBox="0 0 25 25" class="du ml" aria-label="Add to list bookmark button"><path fill="currentColor" d="M18 2.5a.5.5 0 0 1 1 0V5h2.5a.5.5 0 0 1 0 1H19v2.5a.5.5 0 1 1-1 0V6h-2.5a.5.5 0 0 1 0-1H18zM7 7a1 1 0 0 1 1-1h3.5a.5.5 0 0 0 0-1H8a2 2 0 0 0-2 2v14a.5.5 0 0 0 .805.396L12.5 17l5.695 4.396A.5.5 0 0 0 19 21v-8.5a.5.5 0 0 0-1 0v7.485l-5.195-4.012a.5.5 0 0 0-.61 0L7 19.985z"></path></svg></a></span></div></div></div><div class="fd mm cn"><div class="l ae"><div class="ab cb"><div class="mn mo mp mq mr gu ci bh"><div class="ab"><div class="bm bh" aria-hidden="false"><div><div class="bm" aria-hidden="false"><button aria-label="Listen" data-testid="audioPlayButton" class="af fk ah ai aj ak al ms an ao ap ex mt mu mj mv mw mx my mz s na nb nc nd ne nf ng u nh ni nj"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M3 12a9 9 0 1 1 18 0 9 9 0 0 1-18 0m9-10C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2m3.376 10.416-4.599 3.066a.5.5 0 0 1-.777-.416V8.934a.5.5 0 0 1 .777-.416l4.599 3.066a.5.5 0 0 1 0 .832" clip-rule="evenodd"></path></svg><div class="j i d"><p class="bf b bg z du">Listen</p></div></button></div></div></div></div></div></div></div></div><div class="bm" aria-hidden="false" aria-describedby="postFooterSocialMenu" aria-labelledby="postFooterSocialMenu"><div><div class="bm" aria-hidden="false"><button aria-controls="postFooterSocialMenu" aria-expanded="false" aria-label="Share Post" data-testid="headerSocialShareButton" class="af fk ah ai aj ak al ms an ao ap ex mt mu mj mv mw mx my mz s na nb nc nd ne nf ng u nh ni nj"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M15.218 4.931a.4.4 0 0 1-.118.132l.012.006a.45.45 0 0 1-.292.074.5.5 0 0 1-.3-.13l-2.02-2.02v7.07c0 .28-.23.5-.5.5s-.5-.22-.5-.5v-7.04l-2 2a.45.45 0 0 1-.57.04h-.02a.4.4 0 0 1-.16-.3.4.4 0 0 1 .1-.32l2.8-2.8a.5.5 0 0 1 .7 0l2.8 2.79a.42.42 0 0 1 .068.498m-.106.138.008.004v-.01zM16 7.063h1.5a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-11c-1.1 0-2-.9-2-2v-10a2 2 0 0 1 2-2H8a.5.5 0 0 1 .35.15.5.5 0 0 1 .15.35.5.5 0 0 1-.15.35.5.5 0 0 1-.35.15H6.4c-.5 0-.9.4-.9.9v10.2a.9.9 0 0 0 .9.9h11.2c.5 0 .9-.4.9-.9v-10.2c0-.5-.4-.9-.9-.9H16a.5.5 0 0 1 0-1" clip-rule="evenodd"></path></svg><div class="j i d"><p class="bf b bg z du">Share</p></div></button></div></div></div></div></div></div></div></div></div><p id="b3a3" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">With its latest release of Flutter 2, Flutter’s goal as a multi-platform UI toolkit is to “fundamentally shift how developers think about building apps, starting not with the platform they’re targeting, but with the experience they want to create” as quoted by Tim Sneath, Product Director of Flutter & Dart at the <a class="af og" href="https://events.flutter.dev/" rel="noopener ugc nofollow" target="_blank">Flutter Engage</a> event earlier in March 2020.</p><p id="30b4" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">Prior to this latest release, Flutter had four pillars focused on being a beautiful, fast, open, and productive platform for building cross platform applications. With the release of Flutter 2, a new pillar was introduced: ‘<em class="oh">portable’</em>, which represents a major milestone for Flutter now having stable support for native applications on mobile, web, desktop, and embedded devices from a single codebase. Flutter truly is the first UI platform that is designed for an ambient computing world.</p><p id="202b" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">In this article, we explore what the portable pillar means to Flutter. We look at the features supporting web apps and multiple-screen form factors, and how Toyota is embracing Flutter for its vehicle infotainment systems.</p><h1 id="60cd" class="oi oj gy bf ok ol om hy on oo op ib oq or os ot ou ov ow ox oy oz pa pb pc pd bk">From mobile app to web app</h1><p id="1bb7" class="pw-post-body-paragraph nk nl gy nm b hw pe no np hz pf nr ns nt pg nv nw nx ph nz oa ob pi od oe of gn bk">Flutter started as a UI framework for building beautiful iOS and Android apps. However, the vision was always for Flutter to provide a portable framework that helps developers build natively compiled apps wherever their users may be. As almost every device has a web browser, targeting the web was the natural next step for Flutter.</p><p id="fc75" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">Flutter 2, delivers production-quality support for the web, meaning you can build beautiful performant applications for iOS, Android, and web browsers from a single code base. The emphasis is on creating web apps — installable progressive web apps and rich, interactive single-page apps — not static content websites for now, which gives Flutter developers a seamless path to go from their current mobile apps to a whole new user base on the web.</p><p id="2578" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">With Flutter 2, it’s like your apps get a free upgrade. The web is just another device target. Run Flutter Create, and it automatically generates a web directory with an index HTML file ready to run in your favorite browser.</p><p id="656c" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">As with mobile apps, there are 2 compilers for web apps. <em class="oh">dev_compiler</em> is used during development and <em class="oh">dart2js</em> for deployment. Separate compilers for development and deployment are optimized for dev cycle productivity on one hand, and performance for a production app that just runs fast. Flutter apps are compiled to native machine code meaning your finished application doesn’t have to go through a virtual machine or a JavaScript interpreter when live.</p><figure class="pm pn po pp pq gs pj pk paragraph-image"><div role="button" tabindex="0" class="pr ps fj pt bh pu"><div class="pj pk pl"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*EIMna2_MEEpEQcr7 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*EIMna2_MEEpEQcr7 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*EIMna2_MEEpEQcr7 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*EIMna2_MEEpEQcr7 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*EIMna2_MEEpEQcr7 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*EIMna2_MEEpEQcr7 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*EIMna2_MEEpEQcr7 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/0*EIMna2_MEEpEQcr7 640w, https://miro.medium.com/v2/resize:fit:720/0*EIMna2_MEEpEQcr7 720w, https://miro.medium.com/v2/resize:fit:750/0*EIMna2_MEEpEQcr7 750w, https://miro.medium.com/v2/resize:fit:786/0*EIMna2_MEEpEQcr7 786w, https://miro.medium.com/v2/resize:fit:828/0*EIMna2_MEEpEQcr7 828w, https://miro.medium.com/v2/resize:fit:1100/0*EIMna2_MEEpEQcr7 1100w, https://miro.medium.com/v2/resize:fit:1400/0*EIMna2_MEEpEQcr7 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/><img alt="" class="bh gu gv c" width="700" height="394" loading="lazy" role="presentation"/></picture></div></div></figure><p id="311a" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">The Flutter <em class="oh">dev_compiler</em> offers the same smart features offered by the JIT compile. So it only recompiles the code that was affected by changes and pushes the deltas, ensuring a fast development loop. However, unlike hot reload for mobile — which remembers your app’s state — for web apps you get a hot restart and re-create your state manually.</p><p id="b8c7" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">Just like with mobile apps built in Flutter, plugins enable apps to talk to a platform’s native libraries. Many existing Flutter plugins on pub.dev are already supporting the web. When running a Flutter app on the web, you can access JavaScript libraries through these plugins. To check if a plugin is supported, just go to pub.dev and search for it. Below the plugin listing are a set of labels indicating the supported platforms.</p><figure class="pm pn po pp pq gs pj pk paragraph-image"><div role="button" tabindex="0" class="pr ps fj pt bh pu"><div class="pj pk pl"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*sfJGayLfOR1xTRGb 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*sfJGayLfOR1xTRGb 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*sfJGayLfOR1xTRGb 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*sfJGayLfOR1xTRGb 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*sfJGayLfOR1xTRGb 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*sfJGayLfOR1xTRGb 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*sfJGayLfOR1xTRGb 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/0*sfJGayLfOR1xTRGb 640w, https://miro.medium.com/v2/resize:fit:720/0*sfJGayLfOR1xTRGb 720w, https://miro.medium.com/v2/resize:fit:750/0*sfJGayLfOR1xTRGb 750w, https://miro.medium.com/v2/resize:fit:786/0*sfJGayLfOR1xTRGb 786w, https://miro.medium.com/v2/resize:fit:828/0*sfJGayLfOR1xTRGb 828w, https://miro.medium.com/v2/resize:fit:1100/0*sfJGayLfOR1xTRGb 1100w, https://miro.medium.com/v2/resize:fit:1400/0*sfJGayLfOR1xTRGb 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/><img alt="" class="bh gu gv c" width="700" height="379" loading="lazy" role="presentation"/></picture></div></div><figcaption class="pv ff pw pj pk px py bf b bg z du">Source: <a class="af og" href="https://pub.dev/packages?q=url_launcher" rel="noopener ugc nofollow" target="_blank">pub.dev/packages?q=url_launcher</a></figcaption></figure><p id="87f7" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">If you have a plugin you want to update to provide web support, see the article <a class="af og" href="https://flutter.dev/docs/development/packages-and-plugins/developing-packages#add-support-for-platforms-in-an-existing-plugin-project" rel="noopener ugc nofollow" target="_blank">’add support for platforms in an existing plugin project</a>’ for details on how to do it.</p><p id="3322" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">While you can target the web with the same code you use for your mobile apps, you’ll want to optimize the experience for your users. You can add dynamic layout features using constraints to improve the user experience like switching a single column layout to two columns if the browser offers more screen real estate.</p><p id="a5c3" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">Similarly, you may consider adding web-specific navigation features, such as scroll bars, and mouse or keyboard interactions. For a better viewing experience on the web, you would want to wrap a ListView in a Scrollbar and have the mouse cursor display when you hover over a widget. There is even a shortcuts widget you can use to add keyboard shortcuts in your applications.</p><p id="f368" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">To learn more, visit <a class="af og" href="http://flutter.dev/web" rel="noopener ugc nofollow" target="_blank">flutter.dev/web</a>.</p><p id="3cf4" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk"><strong class="nm gz">Support for foldables and dual-screen devices</strong></p><p id="b41e" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">As we said before, Flutter is designed for an ambient computing world. There are many more screens than just mobile, web, and desktop emerging. From wearables to in home devices, smart appliances, and even foldable and dual-screen devices making their way into our daily lives. These new form factors are great for productivity as they can adapt to the user’s needs, whether they’re creating content, playing a game, watching a video, typing, reading, or browsing the web.</p><p id="4543" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">These form factors mean you have new scenarios and user experience possibilities to explore. Apps can run on two screens, with more screen real estate to display content and interact with users. When adapting your Flutter app to exist on two screens, you can use dual-screen design patterns, such as the List-Detail view, Companion Pane, and other ways to organize the app UI.</p><p id="97f4" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">The foldable form factor also provides opportunities for apps to share content with another app. For example, adding drag-and-drop functionality to your app so content can be moved between apps that are running side-by-side.</p><p id="a425" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">At Flutter Engage, <a class="af og" href="https://youtu.be/IdrCyS7EF8M?t=108" rel="noopener ugc nofollow" target="_blank">Microsoft announced</a> that they are collaborating with Google to bring foldable support to Flutter. Microsoft is contributing code to enable Flutter apps to take advantage of these new opportunities with devices such as the Surface Duo and even devices from manufacturers like Samsung,</p><p id="1452" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">With Flutter 2, foldable support is available in all the Flutter widgets. For example, when you use the dialogue, it is hinge aware and will display on the right or left pane.</p><figure class="pm pn po pp pq gs pj pk paragraph-image"><div role="button" tabindex="0" class="pr ps fj pt bh pu"><div class="pj pk pl"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*MGqGqLIV6ju5NET2 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*MGqGqLIV6ju5NET2 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*MGqGqLIV6ju5NET2 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*MGqGqLIV6ju5NET2 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*MGqGqLIV6ju5NET2 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*MGqGqLIV6ju5NET2 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*MGqGqLIV6ju5NET2 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/0*MGqGqLIV6ju5NET2 640w, https://miro.medium.com/v2/resize:fit:720/0*MGqGqLIV6ju5NET2 720w, https://miro.medium.com/v2/resize:fit:750/0*MGqGqLIV6ju5NET2 750w, https://miro.medium.com/v2/resize:fit:786/0*MGqGqLIV6ju5NET2 786w, https://miro.medium.com/v2/resize:fit:828/0*MGqGqLIV6ju5NET2 828w, https://miro.medium.com/v2/resize:fit:1100/0*MGqGqLIV6ju5NET2 1100w, https://miro.medium.com/v2/resize:fit:1400/0*MGqGqLIV6ju5NET2 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/><img alt="" class="bh gu gv c" width="700" height="338" loading="lazy" role="presentation"/></picture></div></div></figure><p id="61f5" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">There is also a new widget to help position assets: the two-pane widget. You can use this widget to place assets on the right or left pane. It also displays correctly on a single-screen phone or tablet-like device. The two-pane widget makes it easy to support the new form factors.</p><h1 id="f53d" class="oi oj gy bf ok ol om hy on oo op ib oq or os ot ou ov ow ox oy oz pa pb pc pd bk">Toyota’s in-vehicle user experience with Flutter</h1><p id="e6d2" class="pw-post-body-paragraph nk nl gy nm b hw pe no np hz pf nr ns nt pg nv nw nx ph nz oa ob pi od oe of gn bk">While Flutter 2 enables developers to create beautiful apps for mobile, web, desktop, and even emerging form factors, this isn’t the limit to Flutter’s flexibility. To be a truly portable platform that ships anywhere your users may be, Flutter also is building support for embedded devices. Toyota recently announced that the future of its vehicle infotainment systems would be powered by Flutter to bring a best-in-market digital experience to one of the largest car manufacturers in the world.</p><p id="edd5" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">Daniel Hall, Chief Engineer of Toyota Motor North America, spoke about this partnership and <a class="af og" href="https://youtu.be/IdrCyS7EF8M?t=237" rel="noopener ugc nofollow" target="_blank">why they chose Flutter</a> at Flutter Engage:</p><ul class=""><li id="f486" class="nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of pz qa qb bk">Toyota customers expect a high-performance in-vehicle user experience to match the overall quality of Toyota vehicles. Flutter’s rendering engine provides good performance in a constrained environment, and features such as AOT compilation give Toyota the consistency it’s looking for in an in-vehicle technology.</li><li id="59ed" class="nk nl gy nm b hw qc no np hz qd nr ns nt qe nv nw nx qf nz oa ob qg od oe of pz qa qb bk">Flutter enables Toyota to provide an in-vehicle user experience that is on par with what customers have come to expect from their smartphones. Flutter’s cross-platform mechanics, which Toyota believes has packaged touch mechanics that just feel right no matter where they run, helps Toyota avoid the sluggish performance and poor user experience typical of many embedded systems.</li><li id="245e" class="nk nl gy nm b hw qc no np hz qd nr ns nt qe nv nw nx qf nz oa ob qg od oe of pz qa qb bk">Toyota was also sold on Flutter’s developer experience. Although Toyota is releasing their apps on a single-target platform, the ability to hot-reload on the desktop and deliver to iOS and Android tablets has proven helpful for physical and digital user testing. These faster iteration cycles enable Toyota to collect and integrate feedback from its customers earlier and more often, which helps them create the best experience.</li></ul><p id="e1fe" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">Toyota uses Flutter’s Embedder API to take advantage of the technology in their automotive-grade Linux-powered infotainment systems. The Flutter engine’s architecture makes it easy to embed in their target environment by cross-compiling the engine and wrapping it in an embedder. The Embedder API is easy to use and enables Toyota to integrate Flutter apps with in-vehicle systems.</p><p id="f54b" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">Taking advantage of Dart’s language design and the Flutter SDK software design, Toyota has created several in-house tools that enhance Flutter’s developer ergonomics by extending them to include Toyota’s design process. Toyota’s goal is to have a workflow that enables design tools to generate code to run and validate software immediately. For example, Flutter’s approach to declarative UI and code as configuration enables Toyota to efficiently perform code generation based on designs without complicated or confusing middle tiers.</p><p id="c6cf" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">While developing these Toyota-specific tools, Flutter’s open-source principles and high-growth developer community have been critical to Toyota’s success. Without the support of the large and open ecosystem, Toyota believes that it wouldn’t have been able to extend Flutter to enable their in-vehicle use cases.</p><p id="9f73" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">Toyota, sees working with open-source software as a positive investment in their in-vehicle user experiences, and looks forward to playing a role in the open-source Flutter community.</p><h1 id="fd59" class="oi oj gy bf ok ol om hy on oo op ib oq or os ot ou ov ow ox oy oz pa pb pc pd bk">Flutter: build beautiful apps for any platform</h1><p id="070f" class="pw-post-body-paragraph nk nl gy nm b hw pe no np hz pf nr ns nt pg nv nw nx ph nz oa ob pi od oe of gn bk">From cars to web browsers, laptops to phones, desktops to tablets, and smart home devices, Flutter is a truly portable UI toolkit with a mature SDK that’s ready to go wherever you need to meet your users’ needs. It runs on the platforms that are important to you and works with the Google SDKs and services you already love using. It brings together beautiful, fast user experiences with a productive development environment that lends itself to exploration and iteration, all delivered open-source from Google with a vast global community of developers around the world contributing to its exponential growth over the past few years. There’s nothing quite like it.</p><p id="8d38" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">For more on Flutter head to <a class="af og" href="http://flutter.dev/" rel="noopener ugc nofollow" target="_blank">Flutter.dev</a>, follow the team <a class="af og" href="https://twitter.com/flutterdev" rel="noopener ugc nofollow" target="_blank">@flutterdev</a> on Twitter, and subscribe to their <a class="af og" href="https://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw" rel="noopener ugc nofollow" target="_blank">channel on YouTube</a> for fresh content and tutorials to further your developer journey.</p><p id="5019" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk"><strong class="nm gz">What do you think?</strong></p><p id="90b6" class="pw-post-body-paragraph nk nl gy nm b hw nn no np hz nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">Do you have thoughts on developing multi-platform apps with Flutter? Let us know in the comments below or tweet using <strong class="nm gz">#AskPlayDev</strong> and we’ll reply from<a class="af og" href="http://twitter.com/googleplaydev" rel="noopener ugc nofollow" target="_blank"> @GooglePlayDev</a>, where we regularly share news and tips on how to be successful on Google Play.</p></div></div></div></div></section></div></div></article></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="qh qi ab jq"><div class="qj ab"><a class="qk ay am ao" rel="noopener follow" href="/tag/flutter?source=post_page-----ea0e8003b0f9--------------------------------"><div class="ql fj cx qm ge qn qo bf b bg z bk qp">Flutter</div></a></div><div class="qj ab"><a class="qk ay am ao" rel="noopener follow" href="/tag/google-play?source=post_page-----ea0e8003b0f9--------------------------------"><div class="ql fj cx qm ge qn qo bf b bg z bk qp">Google Play</div></a></div><div class="qj ab"><a class="qk ay am ao" rel="noopener follow" href="/tag/featured?source=post_page-----ea0e8003b0f9--------------------------------"><div class="ql fj cx qm ge qn qo bf b bg z bk qp">Featured</div></a></div><div class="qj ab"><a class="qk ay am ao" rel="noopener follow" href="/tag/apps?source=post_page-----ea0e8003b0f9--------------------------------"><div class="ql fj cx qm ge qn qo bf b bg z bk qp">Apps</div></a></div><div class="qj ab"><a class="qk ay am ao" rel="noopener follow" href="/tag/mobile?source=post_page-----ea0e8003b0f9--------------------------------"><div class="ql fj cx qm ge qn qo bf b bg z bk qp">Mobile</div></a></div></div></div></div><div class="l"></div><footer class="qq qr qs qt qu qv qw qx qy ab q qz ja c"><div class="l ae"><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ab cp ra"><div class="ab q ll"><div class="rb l"><span class="l rc rd re e d"><div class="ab q ll lm"><div class="pw-multi-vote-icon fj ju ln lo lp"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerClapButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Fgoogleplaydev%2Fea0e8003b0f9&operation=register&redirect=https%3A%2F%2Fmedium.com%2Fgoogleplaydev%2Fseamless-multi-platform-app-development-with-flutter-ea0e8003b0f9&user=Google+Play+Apps+%26+Games+Team&userId=a28469f5b06f&source=---footer_actions--ea0e8003b0f9---------------------clap_footer-----------"><div><div class="bm" aria-hidden="false"><div class="lq ao lr ls lt lu am lv lw lx lp"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l ly lz ma mb mc md me"><p class="bf b dv z du"><span class="mf">--</span></p></div></div></span><span class="l h g f rf rg"><div class="ab q ll lm"><div class="pw-multi-vote-icon fj ju ln lo lp"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerClapButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Fgoogleplaydev%2Fea0e8003b0f9&operation=register&redirect=https%3A%2F%2Fmedium.com%2Fgoogleplaydev%2Fseamless-multi-platform-app-development-with-flutter-ea0e8003b0f9&user=Google+Play+Apps+%26+Games+Team&userId=a28469f5b06f&source=---footer_actions--ea0e8003b0f9---------------------clap_footer-----------"><div><div class="bm" aria-hidden="false"><div class="lq ao lr ls lt lu am lv lw lx lp"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l ly lz ma mb mc md me"><p class="bf b dv z du"><span class="mf">--</span></p></div></div></span></div><div class="bq ab"><div><div class="bm" aria-hidden="false"><button class="ao lq mg mh ab q fk mi mj" aria-label="responses"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" class="gt"><path d="M18.006 16.803c1.533-1.456 2.234-3.325 2.234-5.321C20.24 7.357 16.709 4 12.191 4S4 7.357 4 11.482c0 4.126 3.674 7.482 8.191 7.482.817 0 1.622-.111 2.393-.327.231.2.48.391.744.559 1.06.693 2.203 1.044 3.399 1.044.224-.008.4-.112.486-.287a.49.49 0 0 0-.042-.518c-.495-.67-.845-1.364-1.04-2.057a4 4 0 0 1-.125-.598zm-3.122 1.055-.067-.223-.315.096a8 8 0 0 1-2.311.338c-4.023 0-7.292-2.955-7.292-6.587 0-3.633 3.269-6.588 7.292-6.588 4.014 0 7.112 2.958 7.112 6.593 0 1.794-.608 3.469-2.027 4.72l-.195.168v.255c0 .056 0 .151.016.295.025.231.081.478.154.733.154.558.398 1.117.722 1.659a5.3 5.3 0 0 1-2.165-.845c-.276-.176-.714-.383-.941-.59z"></path></svg></button></div></div></div></div><div class="ab q"><div class="rh l jn"><div><div class="bm" aria-hidden="false"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerBookmarkButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fbookmark%2Fp%2Fea0e8003b0f9&operation=register&redirect=https%3A%2F%2Fmedium.com%2Fgoogleplaydev%2Fseamless-multi-platform-app-development-with-flutter-ea0e8003b0f9&source=---footer_actions--ea0e8003b0f9---------------------bookmark_footer-----------"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" fill="none" viewBox="0 0 25 25" class="du ml" aria-label="Add to list bookmark button"><path fill="currentColor" d="M18 2.5a.5.5 0 0 1 1 0V5h2.5a.5.5 0 0 1 0 1H19v2.5a.5.5 0 1 1-1 0V6h-2.5a.5.5 0 0 1 0-1H18zM7 7a1 1 0 0 1 1-1h3.5a.5.5 0 0 0 0-1H8a2 2 0 0 0-2 2v14a.5.5 0 0 0 .805.396L12.5 17l5.695 4.396A.5.5 0 0 0 19 21v-8.5a.5.5 0 0 0-1 0v7.485l-5.195-4.012a.5.5 0 0 0-.61 0L7 19.985z"></path></svg></a></span></div></div></div><div class="rh l jn"><div class="bm" aria-hidden="false" aria-describedby="postFooterSocialMenu" aria-labelledby="postFooterSocialMenu"><div><div class="bm" aria-hidden="false"><button aria-controls="postFooterSocialMenu" aria-expanded="false" aria-label="Share Post" data-testid="footerSocialShareButton" class="af fk ah ai aj ak al ms an ao ap ex mt mu mj mv"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M15.218 4.931a.4.4 0 0 1-.118.132l.012.006a.45.45 0 0 1-.292.074.5.5 0 0 1-.3-.13l-2.02-2.02v7.07c0 .28-.23.5-.5.5s-.5-.22-.5-.5v-7.04l-2 2a.45.45 0 0 1-.57.04h-.02a.4.4 0 0 1-.16-.3.4.4 0 0 1 .1-.32l2.8-2.8a.5.5 0 0 1 .7 0l2.8 2.79a.42.42 0 0 1 .068.498m-.106.138.008.004v-.01zM16 7.063h1.5a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-11c-1.1 0-2-.9-2-2v-10a2 2 0 0 1 2-2H8a.5.5 0 0 1 .35.15.5.5 0 0 1 .15.35.5.5 0 0 1-.15.35.5.5 0 0 1-.35.15H6.4c-.5 0-.9.4-.9.9v10.2a.9.9 0 0 0 .9.9h11.2c.5 0 .9-.4.9-.9v-10.2c0-.5-.4-.9-.9-.9H16a.5.5 0 0 1 0-1" clip-rule="evenodd"></path></svg></button></div></div></div></div></div></div></div></div></div></footer><div class="ri rj rk rl rm l bx"><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="rn l"><div class="ab ro rp rq jp jo"><div class="rr rs rt ru rv rw rx ry rz sa ab cp"><div class="h k"><a href="https://medium.com/googleplaydev?source=post_page---post_publication_info--ea0e8003b0f9--------------------------------" rel="noopener follow"><div class="fj ab"><img alt="Google Play Apps & Games" class="sb ir is cx" src="https://miro.medium.com/v2/resize:fill:96:96/1*PwgNVOb5tR6qM0jJxqrIkw.jpeg" width="48" height="48" loading="lazy"/><div class="sb l is ir fs n fr sc"></div></div></a></div><div class="j i d"><a href="https://medium.com/googleplaydev?source=post_page---post_publication_info--ea0e8003b0f9--------------------------------" rel="noopener follow"><div class="fj ab"><img alt="Google Play Apps & Games" class="sb se sd cx" src="https://miro.medium.com/v2/resize:fill:128:128/1*PwgNVOb5tR6qM0jJxqrIkw.jpeg" width="64" height="64" loading="lazy"/><div class="sb l sd se fs n fr sc"></div></div></a></div><div class="j i d sf jn"><div class="ab"></div></div></div><div class="ab co sg"><div class="sh si sj sk sl l"><a class="af ag ah aj ak al am an ao ap aq ar as at ab q" href="https://medium.com/googleplaydev?source=post_page---post_publication_info--ea0e8003b0f9--------------------------------" rel="noopener follow"><h2 class="pw-author-name bf sn so sp sq sr ss st nt su sv nx sw sx ob sy sz bk"><span class="gn sm">Published in <!-- -->Google Play Apps & Games</span></h2></a><div class="qj ab iq"><div class="l jn"><span class="pw-follower-count bf b bg z du"><a class="af ag ah ai aj ak al am an ao ap aq ar jg" rel="noopener follow" href="/googleplaydev/followers?source=post_page---post_publication_info--ea0e8003b0f9--------------------------------">28K Followers</a></span></div><div class="bf b bg z du ab jt"><span class="jh l" aria-hidden="true"><span class="bf b bg z du">·</span></span><a class="af ag ah ai aj ak al am an ao ap aq ar jg" rel="noopener follow" href="/googleplaydev/importance-of-building-your-game-community-in-southeast-asia-and-india-dc3aaa65902a?source=post_page---post_publication_info--ea0e8003b0f9--------------------------------">Last published <span>Dec 19, 2023</span></a></div></div><div class="ta l"><p class="bf b bg z bk"><span class="gn">Tips, trends, and industry thoughts for app and game developers building businesses on Google Play.</span></p></div></div></div><div class="h k"><div class="ab"></div></div></div></div><div class="ab ro rp rq jp jo"><div class="rr rs rt ru rv rw rx ry rz sa ab cp"><div class="h k"><a tabindex="0" rel="noopener follow" href="/@googleplayteam?source=post_page---post_author_info--ea0e8003b0f9--------------------------------"><div class="l fj"><img alt="Google Play Apps & Games Team" class="l fd by is ir cx" src="https://miro.medium.com/v2/resize:fill:96:96/1*hlOhkSEII_3WbmUD6OkWmQ.png" width="48" height="48" loading="lazy"/><div class="fr by l is ir fs n ay sc"></div></div></a></div><div class="j i d"><a tabindex="0" rel="noopener follow" href="/@googleplayteam?source=post_page---post_author_info--ea0e8003b0f9--------------------------------"><div class="l fj"><img alt="Google Play Apps & Games Team" class="l fd by sd se cx" src="https://miro.medium.com/v2/resize:fill:128:128/1*hlOhkSEII_3WbmUD6OkWmQ.png" width="64" height="64" loading="lazy"/><div class="fr by l sd se fs n ay sc"></div></div></a></div><div class="j i d sf jn"><div class="ab"><span><button class="bf b bg z tb ql tc td te tf tg ev ew th ti tj fa fb fc fd bm fe ff">Follow</button></span></div></div></div><div class="ab co sg"><div class="sh si sj sk sl l"><a class="af ag ah aj ak al am an ao ap aq ar as at ab q" rel="noopener follow" href="/@googleplayteam?source=post_page---post_author_info--ea0e8003b0f9--------------------------------"><h2 class="pw-author-name bf sn so sp sq sr ss st nt su sv nx sw sx ob sy sz bk"><span class="gn sm">Written by <!-- -->Google Play Apps & Games Team</span></h2></a><div class="qj ab iq"><div class="l jn"><span class="pw-follower-count bf b bg z du"><a class="af ag ah ai aj ak al am an ao ap aq ar jg" rel="noopener follow" href="/@googleplayteam/followers?source=post_page---post_author_info--ea0e8003b0f9--------------------------------">4.2K Followers</a></span></div><div class="bf b bg z du ab jt"><span class="jh l" aria-hidden="true"><span class="bf b bg z du">·</span></span><a class="af ag ah ai aj ak al am an ao ap aq ar jg" rel="noopener follow" href="/@googleplayteam/following?source=post_page---post_author_info--ea0e8003b0f9--------------------------------">20 Following</a></div></div><div class="ta l"></div></div></div><div class="h k"><div class="ab"><span><button class="bf b bg z tb ql tc td te tf tg ev ew th ti tj fa fb fc fd bm fe ff">Follow</button></span></div></div></div><div class="tk bh tl tm"></div></div></div><div class="h k j"><div class="tk bh tl tn"></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="to ab ll jq"><div class="tp tq l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://help.medium.com/hc/en-us?source=post_page-----ea0e8003b0f9--------------------------------" rel="noopener follow"><p class="bf b dv z du">Help</p></a></div><div class="tp tq l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://medium.statuspage.io/?source=post_page-----ea0e8003b0f9--------------------------------" rel="noopener follow"><p class="bf b dv z du">Status</p></a></div><div class="tp tq l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" rel="noopener follow" href="/about?autoplay=1&source=post_page-----ea0e8003b0f9--------------------------------"><p class="bf b dv z du">About</p></a></div><div class="tp tq l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" rel="noopener follow" href="/jobs-at-medium/work-at-medium-959d1a85284e?source=post_page-----ea0e8003b0f9--------------------------------"><p class="bf b dv z du">Careers</p></a></div><div class="tp tq l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="pressinquiries@medium.com?source=post_page-----ea0e8003b0f9--------------------------------" rel="noopener follow"><p class="bf b dv z du">Press</p></a></div><div class="tp tq l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://blog.medium.com/?source=post_page-----ea0e8003b0f9--------------------------------" rel="noopener follow"><p class="bf b dv z du">Blog</p></a></div><div class="tp tq l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://policy.medium.com/medium-privacy-policy-f03bf92035c9?source=post_page-----ea0e8003b0f9--------------------------------" rel="noopener follow"><p class="bf b dv z du">Privacy</p></a></div><div class="tp tq l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://policy.medium.com/medium-terms-of-service-9db0094a1e0f?source=post_page-----ea0e8003b0f9--------------------------------" rel="noopener follow"><p class="bf b dv z du">Terms</p></a></div><div class="tp tq l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://speechify.com/medium?source=post_page-----ea0e8003b0f9--------------------------------" rel="noopener follow"><p class="bf b dv z du">Text to speech</p></a></div><div class="tp l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" rel="noopener follow" href="/business?source=post_page-----ea0e8003b0f9--------------------------------"><p class="bf b dv z du">Teams</p></a></div></div></div></div></div></div></div></div></div></div><script>window.__BUILD_ID__="main-20241122-185319-7bcdc08639"</script><script>window.__GRAPHQL_URI__ = "https://medium.com/_/graphql"</script><script>window.__PRELOADED_STATE__ = {"algolia":{"queries":{}},"cache":{"experimentGroupSet":true,"reason":"","group":"enabled","tags":["group-edgeCachePosts","post-ea0e8003b0f9","user-a28469f5b06f","collection-1f8baa23933d"],"serverVariantState":"44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a","middlewareEnabled":true,"cacheStatus":"DYNAMIC","shouldUseCache":true,"vary":[],"lohpSummerUpsellEnabled":false,"publicationHierarchyEnabledWeb":false,"postBottomResponsesEnabled":false},"client":{"hydrated":false,"isUs":false,"isNativeMedium":false,"isSafariMobile":false,"isSafari":false,"isFirefox":false,"routingEntity":{"type":"DEFAULT","explicit":false},"viewerIsBot":false},"debug":{"requestId":"73e91a7d-c3fa-4892-ae6d-12d745f0adf7","hybridDevServices":[],"originalSpanCarrier":{"traceparent":"00-dcfa57777359878adbc58f082eb707ea-6451839a72b5ce4c-01"}},"multiVote":{"clapsPerPost":{}},"navigation":{"branch":{"show":null,"hasRendered":null,"blockedByCTA":false},"hideGoogleOneTap":false,"hasRenderedAlternateUserBanner":null,"currentLocation":"https:\u002F\u002Fmedium.com\u002Fgoogleplaydev\u002Fseamless-multi-platform-app-development-with-flutter-ea0e8003b0f9","host":"medium.com","hostname":"medium.com","referrer":"","hasSetReferrer":false,"susiModal":{"step":null,"operation":"register"},"postRead":false,"partnerProgram":{"selectedCountryCode":null},"queryString":"","currentHash":""},"config":{"nodeEnv":"production","version":"main-20241122-185319-7bcdc08639","target":"production","productName":"Medium","publicUrl":"https:\u002F\u002Fcdn-client.medium.com\u002Flite","authDomain":"medium.com","authGoogleClientId":"216296035834-k1k6qe060s2tp2a2jam4ljdcms00sttg.apps.googleusercontent.com","favicon":"production","glyphUrl":"https:\u002F\u002Fglyph.medium.com","branchKey":"key_live_ofxXr2qTrrU9NqURK8ZwEhknBxiI6KBm","algolia":{"appId":"MQ57UUUQZ2","apiKeySearch":"394474ced050e3911ae2249ecc774921","indexPrefix":"medium_","host":"-dsn.algolia.net"},"recaptchaKey":"6Lfc37IUAAAAAKGGtC6rLS13R1Hrw_BqADfS1LRk","recaptcha3Key":"6Lf8R9wUAAAAABMI_85Wb8melS7Zj6ziuf99Yot5","recaptchaEnterpriseKeyId":"6Le-uGgpAAAAAPprRaokM8AKthQ9KNGdoxaGUvVp","datadog":{"applicationId":"6702d87d-a7e0-42fe-bbcb-95b469547ea0","clientToken":"pub853ea8d17ad6821d9f8f11861d23dfed","rumToken":"pubf9cc52896502b9413b68ba36fc0c7162","context":{"deployment":{"target":"production","tag":"main-20241122-185319-7bcdc08639","commit":"7bcdc08639c179dc5172558201a3fd3abc1b5db6"}},"datacenter":"us"},"googleAnalyticsCode":"G-7JY7T788PK","googlePay":{"apiVersion":"2","apiVersionMinor":"0","merchantId":"BCR2DN6TV7EMTGBM","merchantName":"Medium","instanceMerchantId":"13685562959212738550"},"applePay":{"version":3},"signInWallCustomDomainCollectionIds":["3a8144eabfe3","336d898217ee","61061eb0c96b","138adf9c44c","819cc2aaeee0"],"mediumMastodonDomainName":"me.dm","mediumOwnedAndOperatedCollectionIds":["8a9336e5bb4","b7e45b22fec3","193b68bd4fba","8d6b8a439e32","54c98c43354d","3f6ecf56618","d944778ce714","92d2092dc598","ae2a65f35510","1285ba81cada","544c7006046e","fc8964313712","40187e704f1c","88d9857e584e","7b6769f2748b","bcc38c8f6edf","cef6983b292","cb8577c9149e","444d13b52878","713d7dbc99b0","ef8e90590e66","191186aaafa0","55760f21cdc5","9dc80918cc93","bdc4052bbdba","8ccfed20cbb2"],"tierOneDomains":["medium.com","thebolditalic.com","arcdigital.media","towardsdatascience.com","uxdesign.cc","codeburst.io","psiloveyou.xyz","writingcooperative.com","entrepreneurshandbook.co","prototypr.io","betterhumans.coach.me","theascent.pub"],"topicsToFollow":["d61cf867d93f","8a146bc21b28","1eca0103fff3","4d562ee63426","aef1078a3ef5","e15e46793f8d","6158eb913466","55f1c20aba7a","3d18b94f6858","4861fee224fd","63c6f1f93ee","1d98b3a9a871","decb52b64abf","ae5d4995e225","830cded25262"],"topicToTagMappings":{"accessibility":"accessibility","addiction":"addiction","android-development":"android-development","art":"art","artificial-intelligence":"artificial-intelligence","astrology":"astrology","basic-income":"basic-income","beauty":"beauty","biotech":"biotech","blockchain":"blockchain","books":"books","business":"business","cannabis":"cannabis","cities":"cities","climate-change":"climate-change","comics":"comics","coronavirus":"coronavirus","creativity":"creativity","cryptocurrency":"cryptocurrency","culture":"culture","cybersecurity":"cybersecurity","data-science":"data-science","design":"design","digital-life":"digital-life","disability":"disability","economy":"economy","education":"education","equality":"equality","family":"family","feminism":"feminism","fiction":"fiction","film":"film","fitness":"fitness","food":"food","freelancing":"freelancing","future":"future","gadgets":"gadgets","gaming":"gaming","gun-control":"gun-control","health":"health","history":"history","humor":"humor","immigration":"immigration","ios-development":"ios-development","javascript":"javascript","justice":"justice","language":"language","leadership":"leadership","lgbtqia":"lgbtqia","lifestyle":"lifestyle","machine-learning":"machine-learning","makers":"makers","marketing":"marketing","math":"math","media":"media","mental-health":"mental-health","mindfulness":"mindfulness","money":"money","music":"music","neuroscience":"neuroscience","nonfiction":"nonfiction","outdoors":"outdoors","parenting":"parenting","pets":"pets","philosophy":"philosophy","photography":"photography","podcasts":"podcast","poetry":"poetry","politics":"politics","privacy":"privacy","product-management":"product-management","productivity":"productivity","programming":"programming","psychedelics":"psychedelics","psychology":"psychology","race":"race","relationships":"relationships","religion":"religion","remote-work":"remote-work","san-francisco":"san-francisco","science":"science","self":"self","self-driving-cars":"self-driving-cars","sexuality":"sexuality","social-media":"social-media","society":"society","software-engineering":"software-engineering","space":"space","spirituality":"spirituality","sports":"sports","startups":"startup","style":"style","technology":"technology","transportation":"transportation","travel":"travel","true-crime":"true-crime","tv":"tv","ux":"ux","venture-capital":"venture-capital","visual-design":"visual-design","work":"work","world":"world","writing":"writing"},"defaultImages":{"avatar":{"imageId":"1*dmbNkD5D-u45r44go_cf0g.png","height":150,"width":150},"orgLogo":{"imageId":"7*V1_7XP4snlmqrc_0Njontw.png","height":110,"width":500},"postLogo":{"imageId":"bd978bb536350a710e8efb012513429cabdc4c28700604261aeda246d0f980b7","height":810,"width":1440},"postPreviewImage":{"imageId":"1*hn4v1tCaJy7cWMyb0bpNpQ.png","height":386,"width":579}},"collectionStructuredData":{"8d6b8a439e32":{"name":"Elemental","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F980\u002F1*9ygdqoKprhwuTVKUM0DLPA@2x.png","width":980,"height":159}}},"3f6ecf56618":{"name":"Forge","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F596\u002F1*uULpIlImcO5TDuBZ6lm7Lg@2x.png","width":596,"height":183}}},"ae2a65f35510":{"name":"GEN","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F264\u002F1*RdVZMdvfV3YiZTw6mX7yWA.png","width":264,"height":140}}},"88d9857e584e":{"name":"LEVEL","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*JqYMhNX6KNNb2UlqGqO2WQ.png","width":540,"height":108}}},"7b6769f2748b":{"name":"Marker","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F383\u002F1*haCUs0wF6TgOOvfoY-jEoQ@2x.png","width":383,"height":92}}},"444d13b52878":{"name":"OneZero","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*cw32fIqCbRWzwJaoQw6BUg.png","width":540,"height":123}}},"8ccfed20cbb2":{"name":"Zora","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*tZUQqRcCCZDXjjiZ4bDvgQ.png","width":540,"height":106}}}},"embeddedPostIds":{"coronavirus":"cd3010f9d81f"},"sharedCdcMessaging":{"COVID_APPLICABLE_TAG_SLUGS":[],"COVID_APPLICABLE_TOPIC_NAMES":[],"COVID_APPLICABLE_TOPIC_NAMES_FOR_TOPIC_PAGE":[],"COVID_MESSAGES":{"tierA":{"text":"For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":66,"end":73,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"tierB":{"text":"Anyone can publish on Medium per our Policies, but we don’t fact-check every story. For more info about the coronavirus, see cdc.gov.","markups":[{"start":37,"end":45,"href":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Fcategories\u002F201931128-Policies-Safety"},{"start":125,"end":132,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"paywall":{"text":"This article has been made free for everyone, thanks to Medium Members. For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":56,"end":70,"href":"https:\u002F\u002Fmedium.com\u002Fmembership"},{"start":138,"end":145,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"unbound":{"text":"This article is free for everyone, thanks to Medium Members. For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":45,"end":59,"href":"https:\u002F\u002Fmedium.com\u002Fmembership"},{"start":127,"end":134,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]}},"COVID_BANNER_POST_ID_OVERRIDE_WHITELIST":["3b31a67bff4a"]},"sharedVoteMessaging":{"TAGS":["politics","election-2020","government","us-politics","election","2020-presidential-race","trump","donald-trump","democrats","republicans","congress","republican-party","democratic-party","biden","joe-biden","maga"],"TOPICS":["politics","election"],"MESSAGE":{"text":"Find out more about the U.S. election results here.","markups":[{"start":46,"end":50,"href":"https:\u002F\u002Fcookpolitical.com\u002F2020-national-popular-vote-tracker"}]},"EXCLUDE_POSTS":["397ef29e3ca5"]},"embedPostRules":[],"recircOptions":{"v1":{"limit":3},"v2":{"limit":8}},"braintreeClientKey":"production_zjkj96jm_m56f8fqpf7ngnrd4","braintree":{"enabled":true,"merchantId":"m56f8fqpf7ngnrd4","merchantAccountId":{"usd":"AMediumCorporation_instant","eur":"amediumcorporation_EUR","cad":"amediumcorporation_CAD"},"publicKey":"ds2nn34bg2z7j5gd","braintreeEnvironment":"production","dashboardUrl":"https:\u002F\u002Fwww.braintreegateway.com\u002Fmerchants","gracePeriodDurationInDays":14,"mediumMembershipPlanId":{"monthly":"ce105f8c57a3","monthlyV2":"e8a5e126-792b-4ee6-8fba-d574c1b02fc5","monthlyWithTrial":"d5ee3dbe3db8","monthlyPremium":"fa741a9b47a2","yearly":"a40ad4a43185","yearlyV2":"3815d7d6-b8ca-4224-9b8c-182f9047866e","yearlyStaff":"d74fb811198a","yearlyWithTrial":"b3bc7350e5c7","yearlyPremium":"e21bd2c12166","monthlyOneYearFree":"e6c0637a-2bad-4171-ab4f-3c268633d83c","monthly25PercentOffFirstYear":"235ecc62-0cdb-49ae-9378-726cd21c504b","monthly20PercentOffFirstYear":"ba518864-9c13-4a99-91ca-411bf0cac756","monthly15PercentOffFirstYear":"594c029b-9f89-43d5-88f8-8173af4e070e","monthly10PercentOffFirstYear":"c6c7bc9a-40f2-4b51-8126-e28511d5bdb0","monthlyForStudents":"629ebe51-da7d-41fd-8293-34cd2f2030a8","yearlyOneYearFree":"78ba7be9-0d9f-4ece-aa3e-b54b826f2bf1","yearly25PercentOffFirstYear":"2dbb010d-bb8f-4eeb-ad5c-a08509f42d34","yearly20PercentOffFirstYear":"47565488-435b-47f8-bf93-40d5fbe0ebc8","yearly15PercentOffFirstYear":"8259809b-0881-47d9-acf7-6c001c7f720f","yearly10PercentOffFirstYear":"9dd694fb-96e1-472c-8d9e-3c868d5c1506","yearlyForStudents":"e29345ef-ab1c-4234-95c5-70e50fe6bc23","monthlyCad":"p52orjkaceei","yearlyCad":"h4q9g2up9ktt"},"braintreeDiscountId":{"oneMonthFree":"MONTHS_FREE_01","threeMonthsFree":"MONTHS_FREE_03","sixMonthsFree":"MONTHS_FREE_06","fiftyPercentOffOneYear":"FIFTY_PERCENT_OFF_ONE_YEAR"},"3DSecureVersion":"2","defaultCurrency":"usd","providerPlanIdCurrency":{"4ycw":"usd","rz3b":"usd","3kqm":"usd","jzw6":"usd","c2q2":"usd","nnsw":"usd","q8qw":"usd","d9y6":"usd","fx7w":"cad","nwf2":"cad"}},"paypalClientId":"AXj1G4fotC2GE8KzWX9mSxCH1wmPE3nJglf4Z2ig_amnhvlMVX87otaq58niAg9iuLktVNF_1WCMnN7v","paypal":{"host":"https:\u002F\u002Fapi.paypal.com:443","clientMode":"production","serverMode":"live","webhookId":"4G466076A0294510S","monthlyPlan":{"planId":"P-9WR0658853113943TMU5FDQA","name":"Medium Membership (Monthly) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"yearlyPlan":{"planId":"P-7N8963881P8875835MU5JOPQ","name":"Medium Membership (Annual) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"oneYearGift":{"name":"Medium Membership (1 Year, Digital Gift Code)","description":"Unlimited access to the best and brightest stories on Medium. Gift codes can be redeemed at medium.com\u002Fredeem.","price":"50.00","currency":"USD","sku":"membership-gift-1-yr"},"oldMonthlyPlan":{"planId":"P-96U02458LM656772MJZUVH2Y","name":"Medium Membership (Monthly)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"oldYearlyPlan":{"planId":"P-59P80963JF186412JJZU3SMI","name":"Medium Membership (Annual)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"monthlyPlanWithTrial":{"planId":"P-66C21969LR178604GJPVKUKY","name":"Medium Membership (Monthly) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"yearlyPlanWithTrial":{"planId":"P-6XW32684EX226940VKCT2MFA","name":"Medium Membership (Annual) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"oldMonthlyPlanNoSetupFee":{"planId":"P-4N046520HR188054PCJC7LJI","name":"Medium Membership (Monthly)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"oldYearlyPlanNoSetupFee":{"planId":"P-7A4913502Y5181304CJEJMXQ","name":"Medium Membership (Annual)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"sdkUrl":"https:\u002F\u002Fwww.paypal.com\u002Fsdk\u002Fjs"},"stripePublishableKey":"pk_live_7FReX44VnNIInZwrIIx6ghjl","log":{"json":true,"level":"info"},"imageUploadMaxSizeMb":25,"staffPicks":{"title":"Staff Picks","catalogId":"c7bc6e1ee00f"}},"session":{"xsrf":""}}</script><script>window.__APOLLO_STATE__ = {"ROOT_QUERY":{"__typename":"Query","viewer":null,"collectionByDomainOrSlug({\"domainOrSlug\":\"googleplaydev\"})":{"__ref":"Collection:1f8baa23933d"},"postResult({\"id\":\"ea0e8003b0f9\"})":{"__ref":"Post:ea0e8003b0f9"}},"ImageMetadata:":{"__typename":"ImageMetadata","id":""},"Collection:1f8baa23933d":{"__typename":"Collection","id":"1f8baa23933d","favicon":{"__ref":"ImageMetadata:"},"customStyleSheet":null,"colorPalette":{"__typename":"ColorPalette","highlightSpectrum":{"__typename":"ColorSpectrum","backgroundColor":"#FFFFFFFF","colorPoints":[{"__typename":"ColorPoint","color":"#FFE5F4FF","point":0},{"__typename":"ColorPoint","color":"#FFE0F2FF","point":0.1},{"__typename":"ColorPoint","color":"#FFDBF0FF","point":0.2},{"__typename":"ColorPoint","color":"#FFD6EEFF","point":0.3},{"__typename":"ColorPoint","color":"#FFD1EDFF","point":0.4},{"__typename":"ColorPoint","color":"#FFCBEBFF","point":0.5},{"__typename":"ColorPoint","color":"#FFC6E9FF","point":0.6},{"__typename":"ColorPoint","color":"#FFC0E7FF","point":0.7},{"__typename":"ColorPoint","color":"#FFBAE5FF","point":0.8},{"__typename":"ColorPoint","color":"#FFB4E3FF","point":0.9},{"__typename":"ColorPoint","color":"#FFAEE1FF","point":1}]},"defaultBackgroundSpectrum":{"__typename":"ColorSpectrum","backgroundColor":"#FFFFFFFF","colorPoints":[{"__typename":"ColorPoint","color":"#FF427EFF","point":0},{"__typename":"ColorPoint","color":"#FF4076FF","point":0.1},{"__typename":"ColorPoint","color":"#FF3E6EE6","point":0.2},{"__typename":"ColorPoint","color":"#FF3B65CE","point":0.3},{"__typename":"ColorPoint","color":"#FF375CB6","point":0.4},{"__typename":"ColorPoint","color":"#FF33539E","point":0.5},{"__typename":"ColorPoint","color":"#FF2E4987","point":0.6},{"__typename":"ColorPoint","color":"#FF293E71","point":0.7},{"__typename":"ColorPoint","color":"#FF22335B","point":0.8},{"__typename":"ColorPoint","color":"#FF1A2744","point":0.9},{"__typename":"ColorPoint","color":"#FF111A2E","point":1}]},"tintBackgroundSpectrum":{"__typename":"ColorSpectrum","backgroundColor":"#FF2861FF","colorPoints":[{"__typename":"ColorPoint","color":"#FF2861FF","point":0},{"__typename":"ColorPoint","color":"#FF4177FF","point":0.1},{"__typename":"ColorPoint","color":"#FF588AFF","point":0.2},{"__typename":"ColorPoint","color":"#FF6E9BFF","point":0.3},{"__typename":"ColorPoint","color":"#FF83ABFF","point":0.4},{"__typename":"ColorPoint","color":"#FF97BBFF","point":0.5},{"__typename":"ColorPoint","color":"#FFABC9FF","point":0.6},{"__typename":"ColorPoint","color":"#FFBED7FF","point":0.7},{"__typename":"ColorPoint","color":"#FFD0E5FF","point":0.8},{"__typename":"ColorPoint","color":"#FFE3F3FF","point":0.9},{"__typename":"ColorPoint","color":"#FFF5FFFF","point":1}]}},"domain":null,"slug":"googleplaydev","googleAnalyticsId":null,"editors":[{"__typename":"CollectionMastheadUserItem","user":{"__ref":"User:ff0b1fb4e6b6"}},{"__typename":"CollectionMastheadUserItem","user":{"__ref":"User:bb14a9d3cf19"}},{"__typename":"CollectionMastheadUserItem","user":{"__ref":"User:a28469f5b06f"}},{"__typename":"CollectionMastheadUserItem","user":{"__ref":"User:25ffc910ae35"}},{"__typename":"CollectionMastheadUserItem","user":{"__ref":"User:5cc27268fdd8"}}],"name":"Google Play Apps & Games","avatar":{"__ref":"ImageMetadata:1*PwgNVOb5tR6qM0jJxqrIkw.jpeg"},"description":"Tips, trends, and industry thoughts for app and game developers building businesses on Google Play.","subscriberCount":28361,"latestPostsConnection({\"paging\":{\"limit\":1}})":{"__typename":"PostConnection","posts":[{"__ref":"Post:dc3aaa65902a"}]},"viewerEdge":{"__ref":"CollectionViewerEdge:collectionId:1f8baa23933d-viewerId:lo_34fcd8cf3a47"},"twitterUsername":"googleplaybiz","facebookPageId":null,"logo":{"__ref":"ImageMetadata:1*g0aLqgJDhirtGQEiD6KPZA.png"}},"User:ff0b1fb4e6b6":{"__typename":"User","id":"ff0b1fb4e6b6"},"User:bb14a9d3cf19":{"__typename":"User","id":"bb14a9d3cf19"},"User:a28469f5b06f":{"__typename":"User","id":"a28469f5b06f","customDomainState":null,"hasSubdomain":false,"username":"googleplayteam","name":"Google Play Apps & Games Team","newsletterV3":{"__ref":"NewsletterV3:ceec26830078"},"linkedAccounts":{"__ref":"LinkedAccounts:a28469f5b06f"},"isSuspended":false,"imageId":"1*hlOhkSEII_3WbmUD6OkWmQ.png","mediumMemberAt":0,"verifications":{"__typename":"VerifiedInfo","isBookAuthor":false},"socialStats":{"__typename":"SocialStats","followerCount":4259,"followingCount":15,"collectionFollowingCount":5},"bio":"","isPartnerProgramEnrolled":false,"viewerEdge":{"__ref":"UserViewerEdge:userId:a28469f5b06f-viewerId:lo_34fcd8cf3a47"},"viewerIsUser":false,"postSubscribeMembershipUpsellShownAt":0,"membership":null,"allowNotes":true,"twitterScreenName":"GooglePlayBiz"},"User:25ffc910ae35":{"__typename":"User","id":"25ffc910ae35"},"User:5cc27268fdd8":{"__typename":"User","id":"5cc27268fdd8"},"ImageMetadata:1*PwgNVOb5tR6qM0jJxqrIkw.jpeg":{"__typename":"ImageMetadata","id":"1*PwgNVOb5tR6qM0jJxqrIkw.jpeg"},"Post:dc3aaa65902a":{"__typename":"Post","id":"dc3aaa65902a","firstPublishedAt":1703005263457,"creator":{"__ref":"User:a28469f5b06f"},"collection":{"__ref":"Collection:1f8baa23933d"},"isSeries":false,"mediumUrl":"https:\u002F\u002Fmedium.com\u002Fgoogleplaydev\u002Fimportance-of-building-your-game-community-in-southeast-asia-and-india-dc3aaa65902a","sequence":null,"uniqueSlug":"importance-of-building-your-game-community-in-southeast-asia-and-india-dc3aaa65902a"},"LinkedAccounts:a28469f5b06f":{"__typename":"LinkedAccounts","mastodon":null,"id":"a28469f5b06f"},"UserViewerEdge:userId:a28469f5b06f-viewerId:lo_34fcd8cf3a47":{"__typename":"UserViewerEdge","id":"userId:a28469f5b06f-viewerId:lo_34fcd8cf3a47","isFollowing":false,"isUser":false,"isMuting":false},"NewsletterV3:ceec26830078":{"__typename":"NewsletterV3","id":"ceec26830078","type":"NEWSLETTER_TYPE_AUTHOR","slug":"a28469f5b06f","name":"a28469f5b06f","collection":null,"user":{"__ref":"User:a28469f5b06f"}},"Topic:decb52b64abf":{"__typename":"Topic","slug":"programming","id":"decb52b64abf","name":"Programming"},"ImageMetadata:1*6wcA4tjbCPDYur5cJNPnTQ.png":{"__typename":"ImageMetadata","id":"1*6wcA4tjbCPDYur5cJNPnTQ.png","originalHeight":2507,"originalWidth":8419,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:fa017b987193_0":{"__typename":"Paragraph","id":"fa017b987193_0","name":"8252","type":"IMG","href":null,"layout":"FULL_WIDTH","metadata":{"__ref":"ImageMetadata:1*6wcA4tjbCPDYur5cJNPnTQ.png"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_1":{"__typename":"Paragraph","id":"fa017b987193_1","name":"a57b","type":"H3","href":null,"layout":null,"metadata":null,"text":"Seamless multi-platform app development with Flutter","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_2":{"__typename":"Paragraph","id":"fa017b987193_2","name":"6e3c","type":"H4","href":null,"layout":null,"metadata":null,"text":"Discover how Flutter supports creating beautiful experiences on any device.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_3":{"__typename":"Paragraph","id":"fa017b987193_3","name":"b3a3","type":"P","href":null,"layout":null,"metadata":null,"text":"With its latest release of Flutter 2, Flutter’s goal as a multi-platform UI toolkit is to “fundamentally shift how developers think about building apps, starting not with the platform they’re targeting, but with the experience they want to create” as quoted by Tim Sneath, Product Director of Flutter & Dart at the Flutter Engage event earlier in March 2020.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":315,"end":329,"href":"https:\u002F\u002Fevents.flutter.dev\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_4":{"__typename":"Paragraph","id":"fa017b987193_4","name":"30b4","type":"P","href":null,"layout":null,"metadata":null,"text":"Prior to this latest release, Flutter had four pillars focused on being a beautiful, fast, open, and productive platform for building cross platform applications. With the release of Flutter 2, a new pillar was introduced: ‘portable’, which represents a major milestone for Flutter now having stable support for native applications on mobile, web, desktop, and embedded devices from a single codebase. Flutter truly is the first UI platform that is designed for an ambient computing world.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"EM","start":224,"end":233,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_5":{"__typename":"Paragraph","id":"fa017b987193_5","name":"202b","type":"P","href":null,"layout":null,"metadata":null,"text":"In this article, we explore what the portable pillar means to Flutter. We look at the features supporting web apps and multiple-screen form factors, and how Toyota is embracing Flutter for its vehicle infotainment systems.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_6":{"__typename":"Paragraph","id":"fa017b987193_6","name":"60cd","type":"H3","href":null,"layout":null,"metadata":null,"text":"From mobile app to web app","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_7":{"__typename":"Paragraph","id":"fa017b987193_7","name":"1bb7","type":"P","href":null,"layout":null,"metadata":null,"text":"Flutter started as a UI framework for building beautiful iOS and Android apps. However, the vision was always for Flutter to provide a portable framework that helps developers build natively compiled apps wherever their users may be. As almost every device has a web browser, targeting the web was the natural next step for Flutter.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_8":{"__typename":"Paragraph","id":"fa017b987193_8","name":"fc75","type":"P","href":null,"layout":null,"metadata":null,"text":"Flutter 2, delivers production-quality support for the web, meaning you can build beautiful performant applications for iOS, Android, and web browsers from a single code base. The emphasis is on creating web apps — installable progressive web apps and rich, interactive single-page apps — not static content websites for now, which gives Flutter developers a seamless path to go from their current mobile apps to a whole new user base on the web.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_9":{"__typename":"Paragraph","id":"fa017b987193_9","name":"2578","type":"P","href":null,"layout":null,"metadata":null,"text":"With Flutter 2, it’s like your apps get a free upgrade. The web is just another device target. Run Flutter Create, and it automatically generates a web directory with an index HTML file ready to run in your favorite browser.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_10":{"__typename":"Paragraph","id":"fa017b987193_10","name":"656c","type":"P","href":null,"layout":null,"metadata":null,"text":"As with mobile apps, there are 2 compilers for web apps. dev_compiler is used during development and dart2js for deployment. Separate compilers for development and deployment are optimized for dev cycle productivity on one hand, and performance for a production app that just runs fast. Flutter apps are compiled to native machine code meaning your finished application doesn’t have to go through a virtual machine or a JavaScript interpreter when live.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"EM","start":57,"end":69,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":101,"end":108,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*EIMna2_MEEpEQcr7":{"__typename":"ImageMetadata","id":"0*EIMna2_MEEpEQcr7","originalHeight":900,"originalWidth":1600,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:fa017b987193_11":{"__typename":"Paragraph","id":"fa017b987193_11","name":"a792","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*EIMna2_MEEpEQcr7"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_12":{"__typename":"Paragraph","id":"fa017b987193_12","name":"311a","type":"P","href":null,"layout":null,"metadata":null,"text":"The Flutter dev_compiler offers the same smart features offered by the JIT compile. So it only recompiles the code that was affected by changes and pushes the deltas, ensuring a fast development loop. However, unlike hot reload for mobile — which remembers your app’s state — for web apps you get a hot restart and re-create your state manually.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"EM","start":12,"end":24,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_13":{"__typename":"Paragraph","id":"fa017b987193_13","name":"b8c7","type":"P","href":null,"layout":null,"metadata":null,"text":"Just like with mobile apps built in Flutter, plugins enable apps to talk to a platform’s native libraries. Many existing Flutter plugins on pub.dev are already supporting the web. When running a Flutter app on the web, you can access JavaScript libraries through these plugins. To check if a plugin is supported, just go to pub.dev and search for it. Below the plugin listing are a set of labels indicating the supported platforms.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*sfJGayLfOR1xTRGb":{"__typename":"ImageMetadata","id":"0*sfJGayLfOR1xTRGb","originalHeight":866,"originalWidth":1600,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:fa017b987193_14":{"__typename":"Paragraph","id":"fa017b987193_14","name":"7974","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*sfJGayLfOR1xTRGb"},"text":"Source: pub.dev\u002Fpackages?q=url_launcher","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":8,"end":39,"href":"https:\u002F\u002Fpub.dev\u002Fpackages?q=url_launcher","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_15":{"__typename":"Paragraph","id":"fa017b987193_15","name":"87f7","type":"P","href":null,"layout":null,"metadata":null,"text":"If you have a plugin you want to update to provide web support, see the article ’add support for platforms in an existing plugin project’ for details on how to do it.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":80,"end":136,"href":"https:\u002F\u002Fflutter.dev\u002Fdocs\u002Fdevelopment\u002Fpackages-and-plugins\u002Fdeveloping-packages#add-support-for-platforms-in-an-existing-plugin-project","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_16":{"__typename":"Paragraph","id":"fa017b987193_16","name":"3322","type":"P","href":null,"layout":null,"metadata":null,"text":"While you can target the web with the same code you use for your mobile apps, you’ll want to optimize the experience for your users. You can add dynamic layout features using constraints to improve the user experience like switching a single column layout to two columns if the browser offers more screen real estate.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_17":{"__typename":"Paragraph","id":"fa017b987193_17","name":"a5c3","type":"P","href":null,"layout":null,"metadata":null,"text":"Similarly, you may consider adding web-specific navigation features, such as scroll bars, and mouse or keyboard interactions. For a better viewing experience on the web, you would want to wrap a ListView in a Scrollbar and have the mouse cursor display when you hover over a widget. There is even a shortcuts widget you can use to add keyboard shortcuts in your applications.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_18":{"__typename":"Paragraph","id":"fa017b987193_18","name":"f368","type":"P","href":null,"layout":null,"metadata":null,"text":"To learn more, visit flutter.dev\u002Fweb.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":21,"end":36,"href":"http:\u002F\u002Fflutter.dev\u002Fweb","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_19":{"__typename":"Paragraph","id":"fa017b987193_19","name":"3cf4","type":"P","href":null,"layout":null,"metadata":null,"text":"Support for foldables and dual-screen devices","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":45,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_20":{"__typename":"Paragraph","id":"fa017b987193_20","name":"b41e","type":"P","href":null,"layout":null,"metadata":null,"text":"As we said before, Flutter is designed for an ambient computing world. There are many more screens than just mobile, web, and desktop emerging. From wearables to in home devices, smart appliances, and even foldable and dual-screen devices making their way into our daily lives. These new form factors are great for productivity as they can adapt to the user’s needs, whether they’re creating content, playing a game, watching a video, typing, reading, or browsing the web.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_21":{"__typename":"Paragraph","id":"fa017b987193_21","name":"4543","type":"P","href":null,"layout":null,"metadata":null,"text":"These form factors mean you have new scenarios and user experience possibilities to explore. Apps can run on two screens, with more screen real estate to display content and interact with users. When adapting your Flutter app to exist on two screens, you can use dual-screen design patterns, such as the List-Detail view, Companion Pane, and other ways to organize the app UI.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_22":{"__typename":"Paragraph","id":"fa017b987193_22","name":"97f4","type":"P","href":null,"layout":null,"metadata":null,"text":"The foldable form factor also provides opportunities for apps to share content with another app. For example, adding drag-and-drop functionality to your app so content can be moved between apps that are running side-by-side.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_23":{"__typename":"Paragraph","id":"fa017b987193_23","name":"a425","type":"P","href":null,"layout":null,"metadata":null,"text":"At Flutter Engage, Microsoft announced that they are collaborating with Google to bring foldable support to Flutter. Microsoft is contributing code to enable Flutter apps to take advantage of these new opportunities with devices such as the Surface Duo and even devices from manufacturers like Samsung,","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":19,"end":38,"href":"https:\u002F\u002Fyoutu.be\u002FIdrCyS7EF8M?t=108","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_24":{"__typename":"Paragraph","id":"fa017b987193_24","name":"1452","type":"P","href":null,"layout":null,"metadata":null,"text":"With Flutter 2, foldable support is available in all the Flutter widgets. For example, when you use the dialogue, it is hinge aware and will display on the right or left pane.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*MGqGqLIV6ju5NET2":{"__typename":"ImageMetadata","id":"0*MGqGqLIV6ju5NET2","originalHeight":772,"originalWidth":1600,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:fa017b987193_25":{"__typename":"Paragraph","id":"fa017b987193_25","name":"c0da","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*MGqGqLIV6ju5NET2"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_26":{"__typename":"Paragraph","id":"fa017b987193_26","name":"61f5","type":"P","href":null,"layout":null,"metadata":null,"text":"There is also a new widget to help position assets: the two-pane widget. You can use this widget to place assets on the right or left pane. It also displays correctly on a single-screen phone or tablet-like device. The two-pane widget makes it easy to support the new form factors.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_27":{"__typename":"Paragraph","id":"fa017b987193_27","name":"f53d","type":"H3","href":null,"layout":null,"metadata":null,"text":"Toyota’s in-vehicle user experience with Flutter","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_28":{"__typename":"Paragraph","id":"fa017b987193_28","name":"e6d2","type":"P","href":null,"layout":null,"metadata":null,"text":"While Flutter 2 enables developers to create beautiful apps for mobile, web, desktop, and even emerging form factors, this isn’t the limit to Flutter’s flexibility. To be a truly portable platform that ships anywhere your users may be, Flutter also is building support for embedded devices. Toyota recently announced that the future of its vehicle infotainment systems would be powered by Flutter to bring a best-in-market digital experience to one of the largest car manufacturers in the world.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_29":{"__typename":"Paragraph","id":"fa017b987193_29","name":"edd5","type":"P","href":null,"layout":null,"metadata":null,"text":"Daniel Hall, Chief Engineer of Toyota Motor North America, spoke about this partnership and why they chose Flutter at Flutter Engage:","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":92,"end":114,"href":"https:\u002F\u002Fyoutu.be\u002FIdrCyS7EF8M?t=237","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_30":{"__typename":"Paragraph","id":"fa017b987193_30","name":"f486","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Toyota customers expect a high-performance in-vehicle user experience to match the overall quality of Toyota vehicles. Flutter’s rendering engine provides good performance in a constrained environment, and features such as AOT compilation give Toyota the consistency it’s looking for in an in-vehicle technology.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_31":{"__typename":"Paragraph","id":"fa017b987193_31","name":"59ed","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Flutter enables Toyota to provide an in-vehicle user experience that is on par with what customers have come to expect from their smartphones. Flutter’s cross-platform mechanics, which Toyota believes has packaged touch mechanics that just feel right no matter where they run, helps Toyota avoid the sluggish performance and poor user experience typical of many embedded systems.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_32":{"__typename":"Paragraph","id":"fa017b987193_32","name":"245e","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Toyota was also sold on Flutter’s developer experience. Although Toyota is releasing their apps on a single-target platform, the ability to hot-reload on the desktop and deliver to iOS and Android tablets has proven helpful for physical and digital user testing. These faster iteration cycles enable Toyota to collect and integrate feedback from its customers earlier and more often, which helps them create the best experience.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_33":{"__typename":"Paragraph","id":"fa017b987193_33","name":"e1fe","type":"P","href":null,"layout":null,"metadata":null,"text":"Toyota uses Flutter’s Embedder API to take advantage of the technology in their automotive-grade Linux-powered infotainment systems. The Flutter engine’s architecture makes it easy to embed in their target environment by cross-compiling the engine and wrapping it in an embedder. The Embedder API is easy to use and enables Toyota to integrate Flutter apps with in-vehicle systems.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_34":{"__typename":"Paragraph","id":"fa017b987193_34","name":"f54b","type":"P","href":null,"layout":null,"metadata":null,"text":"Taking advantage of Dart’s language design and the Flutter SDK software design, Toyota has created several in-house tools that enhance Flutter’s developer ergonomics by extending them to include Toyota’s design process. Toyota’s goal is to have a workflow that enables design tools to generate code to run and validate software immediately. For example, Flutter’s approach to declarative UI and code as configuration enables Toyota to efficiently perform code generation based on designs without complicated or confusing middle tiers.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_35":{"__typename":"Paragraph","id":"fa017b987193_35","name":"c6cf","type":"P","href":null,"layout":null,"metadata":null,"text":"While developing these Toyota-specific tools, Flutter’s open-source principles and high-growth developer community have been critical to Toyota’s success. Without the support of the large and open ecosystem, Toyota believes that it wouldn’t have been able to extend Flutter to enable their in-vehicle use cases.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_36":{"__typename":"Paragraph","id":"fa017b987193_36","name":"9f73","type":"P","href":null,"layout":null,"metadata":null,"text":"Toyota, sees working with open-source software as a positive investment in their in-vehicle user experiences, and looks forward to playing a role in the open-source Flutter community.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_37":{"__typename":"Paragraph","id":"fa017b987193_37","name":"fd59","type":"H3","href":null,"layout":null,"metadata":null,"text":"Flutter: build beautiful apps for any platform","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_38":{"__typename":"Paragraph","id":"fa017b987193_38","name":"070f","type":"P","href":null,"layout":null,"metadata":null,"text":"From cars to web browsers, laptops to phones, desktops to tablets, and smart home devices, Flutter is a truly portable UI toolkit with a mature SDK that’s ready to go wherever you need to meet your users’ needs. It runs on the platforms that are important to you and works with the Google SDKs and services you already love using. It brings together beautiful, fast user experiences with a productive development environment that lends itself to exploration and iteration, all delivered open-source from Google with a vast global community of developers around the world contributing to its exponential growth over the past few years. There’s nothing quite like it.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_39":{"__typename":"Paragraph","id":"fa017b987193_39","name":"8d38","type":"P","href":null,"layout":null,"metadata":null,"text":"For more on Flutter head to Flutter.dev, follow the team @flutterdev on Twitter, and subscribe to their channel on YouTube for fresh content and tutorials to further your developer journey.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":28,"end":39,"href":"http:\u002F\u002Fflutter.dev\u002F","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":57,"end":68,"href":"https:\u002F\u002Ftwitter.com\u002Fflutterdev","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":104,"end":122,"href":"https:\u002F\u002Fwww.youtube.com\u002Fchannel\u002FUCwXdFgeE9KYzlDdR7TG9cMw","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_40":{"__typename":"Paragraph","id":"fa017b987193_40","name":"5019","type":"P","href":null,"layout":null,"metadata":null,"text":"What do you think?","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":18,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:fa017b987193_41":{"__typename":"Paragraph","id":"fa017b987193_41","name":"90b6","type":"P","href":null,"layout":null,"metadata":null,"text":"Do you have thoughts on developing multi-platform apps with Flutter? Let us know in the comments below or tweet using #AskPlayDev and we’ll reply from @GooglePlayDev, where we regularly share news and tips on how to be successful on Google Play.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":150,"end":165,"href":"http:\u002F\u002Ftwitter.com\u002Fgoogleplaydev","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":118,"end":129,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"CollectionViewerEdge:collectionId:1f8baa23933d-viewerId:lo_34fcd8cf3a47":{"__typename":"CollectionViewerEdge","id":"collectionId:1f8baa23933d-viewerId:lo_34fcd8cf3a47","isEditor":false,"isMuting":false},"ImageMetadata:1*g0aLqgJDhirtGQEiD6KPZA.png":{"__typename":"ImageMetadata","id":"1*g0aLqgJDhirtGQEiD6KPZA.png","originalWidth":266,"originalHeight":56},"PostViewerEdge:postId:ea0e8003b0f9-viewerId:lo_34fcd8cf3a47":{"__typename":"PostViewerEdge","shouldIndexPostForExternalSearch":true,"id":"postId:ea0e8003b0f9-viewerId:lo_34fcd8cf3a47"},"Tag:flutter":{"__typename":"Tag","id":"flutter","displayTitle":"Flutter","normalizedTagSlug":"flutter"},"Tag:google-play":{"__typename":"Tag","id":"google-play","displayTitle":"Google Play","normalizedTagSlug":"google-play"},"Tag:featured":{"__typename":"Tag","id":"featured","displayTitle":"Featured","normalizedTagSlug":"featured"},"Tag:apps":{"__typename":"Tag","id":"apps","displayTitle":"Apps","normalizedTagSlug":"apps"},"Tag:mobile":{"__typename":"Tag","id":"mobile","displayTitle":"Mobile","normalizedTagSlug":"mobile"},"Post:ea0e8003b0f9":{"__typename":"Post","id":"ea0e8003b0f9","collection":{"__ref":"Collection:1f8baa23933d"},"content({\"postMeteringOptions\":{}})":{"__typename":"PostContent","isLockedPreviewOnly":false,"bodyModel":{"__typename":"RichText","sections":[{"__typename":"Section","name":"c808","startIndex":0,"textLayout":null,"imageLayout":null,"backgroundImage":null,"videoLayout":null,"backgroundVideo":null}],"paragraphs":[{"__ref":"Paragraph:fa017b987193_0"},{"__ref":"Paragraph:fa017b987193_1"},{"__ref":"Paragraph:fa017b987193_2"},{"__ref":"Paragraph:fa017b987193_3"},{"__ref":"Paragraph:fa017b987193_4"},{"__ref":"Paragraph:fa017b987193_5"},{"__ref":"Paragraph:fa017b987193_6"},{"__ref":"Paragraph:fa017b987193_7"},{"__ref":"Paragraph:fa017b987193_8"},{"__ref":"Paragraph:fa017b987193_9"},{"__ref":"Paragraph:fa017b987193_10"},{"__ref":"Paragraph:fa017b987193_11"},{"__ref":"Paragraph:fa017b987193_12"},{"__ref":"Paragraph:fa017b987193_13"},{"__ref":"Paragraph:fa017b987193_14"},{"__ref":"Paragraph:fa017b987193_15"},{"__ref":"Paragraph:fa017b987193_16"},{"__ref":"Paragraph:fa017b987193_17"},{"__ref":"Paragraph:fa017b987193_18"},{"__ref":"Paragraph:fa017b987193_19"},{"__ref":"Paragraph:fa017b987193_20"},{"__ref":"Paragraph:fa017b987193_21"},{"__ref":"Paragraph:fa017b987193_22"},{"__ref":"Paragraph:fa017b987193_23"},{"__ref":"Paragraph:fa017b987193_24"},{"__ref":"Paragraph:fa017b987193_25"},{"__ref":"Paragraph:fa017b987193_26"},{"__ref":"Paragraph:fa017b987193_27"},{"__ref":"Paragraph:fa017b987193_28"},{"__ref":"Paragraph:fa017b987193_29"},{"__ref":"Paragraph:fa017b987193_30"},{"__ref":"Paragraph:fa017b987193_31"},{"__ref":"Paragraph:fa017b987193_32"},{"__ref":"Paragraph:fa017b987193_33"},{"__ref":"Paragraph:fa017b987193_34"},{"__ref":"Paragraph:fa017b987193_35"},{"__ref":"Paragraph:fa017b987193_36"},{"__ref":"Paragraph:fa017b987193_37"},{"__ref":"Paragraph:fa017b987193_38"},{"__ref":"Paragraph:fa017b987193_39"},{"__ref":"Paragraph:fa017b987193_40"},{"__ref":"Paragraph:fa017b987193_41"}]},"validatedShareKey":"","shareKeyCreator":null},"creator":{"__ref":"User:a28469f5b06f"},"inResponseToEntityType":null,"isLocked":false,"isMarkedPaywallOnly":false,"lockedSource":"LOCKED_POST_SOURCE_NONE","mediumUrl":"https:\u002F\u002Fmedium.com\u002Fgoogleplaydev\u002Fseamless-multi-platform-app-development-with-flutter-ea0e8003b0f9","primaryTopic":{"__ref":"Topic:decb52b64abf"},"topics":[{"__typename":"Topic","slug":"programming"}],"isPublished":true,"latestPublishedVersion":"fa017b987193","visibility":"PUBLIC","postResponses":{"__typename":"PostResponses","count":0},"clapCount":386,"allowResponses":true,"isLimitedState":false,"title":"Seamless multi-platform app development with Flutter","isSeries":false,"sequence":null,"uniqueSlug":"seamless-multi-platform-app-development-with-flutter-ea0e8003b0f9","socialTitle":"","socialDek":"","canonicalUrl":"","metaDescription":"","latestPublishedAt":1616684524151,"readingTime":7.254716981132075,"previewContent":{"__typename":"PreviewContent","subtitle":"Discover how Flutter supports creating beautiful experiences on any device."},"previewImage":{"__ref":"ImageMetadata:1*6wcA4tjbCPDYur5cJNPnTQ.png"},"isShortform":false,"seoTitle":"","firstPublishedAt":1616684357335,"updatedAt":1729925816573,"shortformType":"SHORTFORM_TYPE_LINK","seoDescription":"","viewerEdge":{"__ref":"PostViewerEdge:postId:ea0e8003b0f9-viewerId:lo_34fcd8cf3a47"},"isSuspended":false,"license":"ALL_RIGHTS_RESERVED","tags":[{"__ref":"Tag:flutter"},{"__ref":"Tag:google-play"},{"__ref":"Tag:featured"},{"__ref":"Tag:apps"},{"__ref":"Tag:mobile"}],"isNewsletter":false,"statusForCollection":"APPROVED","pendingCollection":null,"detectedLanguage":"en","wordCount":1737,"layerCake":3,"responsesLocked":false}}</script><script>window.__MIDDLEWARE_STATE__={"session":{"xsrf":""},"cache":{"cacheStatus":"MISS"}}</script><script src="https://cdn-client.medium.com/lite/static/js/manifest.b2314f6d.js"></script><script src="https://cdn-client.medium.com/lite/static/js/9865.1496d74a.js"></script><script src="https://cdn-client.medium.com/lite/static/js/main.24534aeb.js"></script><script src="https://cdn-client.medium.com/lite/static/js/instrumentation.d9108df7.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/reporting.ff22a7a5.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/9120.5df29668.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5049.d1ead72d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/4810.6318add7.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6618.db187378.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2707.b0942613.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/9977.5b3eb23a.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8599.1ab63137.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5250.9f9e01d2.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6349.b071a958.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2648.26563adf.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8393.826a25fb.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/7079.67349d50.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/3735.afb7e926.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5642.a2d9f6a1.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6546.cd03f950.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6834.08de95de.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/7346.72622eb9.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2420.2a5e2d95.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/839.ca7937c2.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/7975.d195c6f1.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2106.21ff89d3.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/7394.3d049572.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2961.00a48598.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8204.c4082863.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/4391.59acaed3.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/PostPage.MainContent.c8a11795.chunk.js"></script><script>window.main();</script><script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'8e78b9a0bf1f4bb6',t:'MTczMjQ0NDI0Mi4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body></html>