CINXE.COM

Flutter - Medium

<!DOCTYPE html><html xmlns:cc="http://creativecommons.org/ns#"><head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# medium-com: http://ogp.me/ns/fb/medium-com#"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=contain"><title>Flutter - Medium</title><link rel="canonical" href="https://medium.com/flutter"><link id="feedLink" rel="alternate" type="application/rss+xml" title="RSS" href="https://medium.com/feed/flutter"><meta name="robots" content="index,follow"><meta name="title" content="Flutter - Medium"><meta name="referrer" content="unsafe-url"><meta name="description" content="Flutter is Google&#39;s UI framework for crafting high-quality native interfaces on iOS, Android, web, and desktop. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source. Learn more at https://flutter.dev."><meta name="keywords" content="MOBILE APP DEVELOPMENT, FLUTTER, GOOGLE, IOS APP DEVELOPMENT, ANDROID APP DEVELOPMENT"><meta name="theme-color" content="#000000"><meta property="og:title" content="Flutter – Medium"><meta property="twitter:title" content="Flutter – Medium"><meta property="og:url" content="https://medium.com/flutter"><meta property="og:image" content="https://cdn-images-1.medium.com/max/1200/1*5-aoK8IBmXve5whBQM90GA.png"><meta property="fb:app_id" content="542599432471018"><meta property="og:description" content="Flutter is Google&#39;s UI framework for crafting high-quality native interfaces on iOS, Android, web, and desktop. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source. Learn more at https://flutter.dev."><meta name="twitter:description" content="Flutter is Google&#39;s UI framework for crafting high-quality native interfaces on iOS, Android, web, and desktop. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source. Learn more at https://flutter.dev."><meta name="twitter:image:src" content="https://cdn-images-1.medium.com/max/1200/1*5-aoK8IBmXve5whBQM90GA.png"><meta property="og:type" content="medium-com:collection"><meta name="twitter:card" content="summary_large_image"><meta property="medium-com:creator" content="https://medium.com/@flutterblog"><meta name="twitter:site" content="@Medium"><meta property="og:site_name" content="Medium"><meta name="twitter:app:name:iphone" content="Medium"><meta name="twitter:app:id:iphone" content="828256236"><meta name="twitter:app:url:iphone" content="medium://flutter"><meta property="al:ios:app_name" content="Medium"><meta property="al:ios:app_store_id" content="828256236"><meta property="al:android:package" content="com.medium.reader"><meta property="al:android:app_name" content="Medium"><meta property="al:ios:url" content="medium://flutter"><meta property="al:android:url" content="medium://flutter"><meta property="al:web:url" content="https://medium.com/flutter"><link rel="search" type="application/opensearchdescription+xml" title="Medium" href="/osd.xml" /><link rel="alternate" href="android-app://com.medium.reader/https/medium.com/flutter" /><script type="application/ld+json">{"@context": "http://schema.org", "@graph": [{"@type": "WebSite", "url": "https:\/\/medium.com", "name": "Medium", "alternateName": "Medium is a community of readers and writers offering unique perspectives on ideas large and small."},{"@type": "Organization", "url": "https:\/\/medium.com\/flutter", "name": "Flutter"}]}</script><link rel="stylesheet" href="https://cdn-static-1.medium.com/_/fp/css/main-branding-base.ouwh4uMviI3QQWIjxRhkHA.12.css"><script>!function(n,e){var t,o,i,c=[],f={passive:!0,capture:!0},r=new Date,a="pointerup",u="pointercancel";function p(n,c){t||(t=c,o=n,i=new Date,w(e),s())}function s(){o>=0&&o<i-r&&(c.forEach(function(n){n(o,t)}),c=[])}function l(t){if(t.cancelable){var o=(t.timeStamp>1e12?new Date:performance.now())-t.timeStamp;"pointerdown"==t.type?function(t,o){function i(){p(t,o),r()}function c(){r()}function r(){e(a,i,f),e(u,c,f)}n(a,i,f),n(u,c,f)}(o,t):p(o,t)}}function w(n){["click","mousedown","keydown","touchstart","pointerdown"].forEach(function(e){n(e,l,f)})}w(n),self.perfMetrics=self.perfMetrics||{},self.perfMetrics.onFirstInputDelay=function(n){c.push(n),s()}}(addEventListener,removeEventListener);</script><script>document.domain = document.domain;</script><script>if (window.top !== window.self) window.location = 'about:blank';var OB_startTime = new Date().getTime(); var OB_loadErrors = []; function _onerror(e) { OB_loadErrors.push(e) }; if (document.addEventListener) document.addEventListener("error", _onerror, true); else if (document.attachEvent) document.attachEvent("onerror", _onerror); function _asyncScript(u) {var d = document, f = d.getElementsByTagName("script")[0], s = d.createElement("script"); s.type = "text/javascript"; s.async = true; s.src = u; f.parentNode.insertBefore(s, f);}function _asyncStyles(u) {var d = document, f = d.getElementsByTagName("script")[0], s = d.createElement("link"); s.rel = "stylesheet"; s.href = u; f.parentNode.insertBefore(s, f); return s}(new Image()).src = "/_/stat?event=pixel.load&origin=" + encodeURIComponent(location.origin);</script><script>window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date; ga("create", "G-7JY7T788PK", "auto", {"allowLinker": true, "legacyCookieDomain": window.location.hostname});ga("send", "pageview");</script><script async src="https://www.google-analytics.com/analytics.js"></script><script>(function () {var height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; var width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; document.write("<style>section.section-image--fullBleed.is-backgrounded {padding-top: " + Math.round(1.1 * height) + "px;}section.section-image--fullScreen.is-backgrounded, section.section-image--coverFade.is-backgrounded {min-height: " + height + "px; padding-top: " + Math.round(0.5 * height) + "px;}.u-height100vh {height: " + height + "px !important;}.u-height110vh {height: " + Math.round(1.1 * height) + "px !important;}.u-minHeight100vh {min-height: " + height + "px !important;}.u-maxHeight100vh {max-height: " + height + "px !important;}section.section-image--coverFade {height: " + height + "px;}.section-aspectRatioViewportPlaceholder, .section-aspectRatioViewportCropPlaceholder {max-height: " + height + "px;}.section-aspectRatioViewportBottomSpacer, .section-aspectRatioViewportBottomPlaceholder {max-height: " + Math.round(0.5 * height) + "px;}.zoomable:before {top: " + (-1 * height) + "px; left: " + (-1 * width) + "px; padding: " + height + "px " + width + "px;}</style>");})()</script><!--[if lt IE 9]><script charset="UTF-8" src="https://cdn-static-1.medium.com/_/fp/js/shiv.RI2ePTZ5gFmMgLzG5bEVAA.12.js"></script><![endif]--><link rel="icon" href="https://miro.medium.com/v2/5d8de952517e8160e40ef9841c781cdc14a5db313057fa3c3de41c6f5b494b19" class="js-favicon"><link rel="apple-touch-icon" sizes="152x152" href="https://cdn-images-1.medium.com/fit/c/304/304/1*5-aoK8IBmXve5whBQM90GA.png"><link rel="apple-touch-icon" sizes="120x120" href="https://cdn-images-1.medium.com/fit/c/240/240/1*5-aoK8IBmXve5whBQM90GA.png"><link rel="apple-touch-icon" sizes="76x76" href="https://cdn-images-1.medium.com/fit/c/152/152/1*5-aoK8IBmXve5whBQM90GA.png"><link rel="apple-touch-icon" sizes="60x60" href="https://cdn-images-1.medium.com/fit/c/120/120/1*5-aoK8IBmXve5whBQM90GA.png"><link rel="mask-icon" href="https://cdn-static-1.medium.com/_/fp/icons/monogram-mask.KPLCSFEZviQN0jQ7veN2RQ.12.svg" color="#171717"></head><body itemscope class=" browser-ie os-windows v-unbound v-glyph v-glyph--m2-unbound-source-serif-pro is-noJs"><script>document.body.className = document.body.className.replace(/(^|\s)is-noJs(\s|$)/, "$1is-js$2")</script><div class="site-main" id="container"><div class="butterBar butterBar--error"></div><div class="surface"><div id="prerendered" class="screenContent"><div class="metabar u-clearfix u-textColorTransparentWhiteDarker u-tintBgColor u-tintSpectrum js-metabar"><div class="branch-journeys-top"></div><div class="js-metabarMiddle metabar-inner u-marginAuto u-maxWidth1032 u-flexCenter u-justifyContentSpaceBetween u-height65 u-xs-height56 u-paddingHorizontal20"><div class="metabar-block u-flex1 u-flexCenter"><div class="js-metabarLogoLeft"><a href="https://medium.com/" data-log-event="home" class="siteNav-logo u-fillWhite u-flex0 u-flexCenter u-paddingTop0"><span class="svgIcon svgIcon--wordmarkMedium svgIcon--120x26px u-flex"><svg class="svgIcon-use" width="120" height="26" ><path d="M29.57 1.404l.036-.008V1.12h-7.27l-6.75 15.979-6.75-15.98H1.003v.278l.035.008c1.327.302 2 .752 2 2.374v18.993c0 1.623-.676 2.073-2.003 2.374L1 25.153v.279h5.315v-.278l-.035-.008c-1.327-.302-2-.751-2-2.374V4.88l8.67 20.552h.492l8.924-21.125V23.24c-.114 1.282-.782 1.677-1.983 1.95l-.036.009v.275h9.259V25.2l-.036-.008c-1.203-.274-1.886-.67-2-1.95l-.006-19.464h.006c0-1.622.674-2.072 2-2.374zm4.23 12.582c.15-3.412 1.367-5.875 3.41-5.918.629.01 1.157.219 1.568.62.872.852 1.282 2.634 1.219 5.298h-6.198zm-.092.962h10.85v-.046c-.03-2.61-.78-4.64-2.228-6.033-1.25-1.204-3.103-1.867-5.048-1.867h-.043c-1.01 0-2.248.246-3.13.693a7.316 7.316 0 00-2.623 2.086c-1.185 1.479-1.903 3.477-2.078 5.724a13.717 13.717 0 00-.04.755c-.004.195-.005.39-.001.587.117 5.087 2.846 9.153 7.692 9.153 4.254 0 6.73-3.132 7.348-7.336l-.312-.11c-1.085 2.259-3.034 3.628-5.252 3.461-3.028-.228-5.347-3.32-5.137-7.066m23.122 6.893c-.356.85-1.099 1.319-2.094 1.319-.995 0-1.905-.689-2.552-1.939-.694-1.342-1.06-3.24-1.06-5.487 0-4.678 1.445-7.704 3.68-7.704.937 0 1.674.468 2.026 1.284v12.527zm7.198 3.335c-1.327-.316-2-.787-2-2.492V0l-8.062 2.392v.293l.05-.004c1.111-.09 1.866.064 2.304.472.343.32.51.809.51 1.498v3.11C56.033 7.25 55.088 7 53.94 7c-2.326 0-4.453.987-5.986 2.779-1.599 1.867-2.444 4.42-2.444 7.38 0 5.287 2.584 8.84 6.43 8.84 2.25 0 4.06-1.242 4.888-3.336v2.811h7.233v-.29l-.035-.008zM70.94 3.085c0-1.65-1.236-2.896-2.875-2.896-1.632 0-2.908 1.272-2.908 2.896 0 1.624 1.278 2.896 2.908 2.896 1.64 0 2.875-1.245 2.875-2.896zm1.903 22.092c-1.327-.316-2-.787-2-2.492h-.006V7.055l-7.234 2.092v.284l.043.004c1.566.14 1.994.683 1.994 2.525v13.515h7.24v-.29l-.037-.008zm18.536 0c-1.327-.316-2-.787-2-2.492V7.055L82.49 9.078v.285l.04.004c1.28.136 1.65.71 1.65 2.56v9.88c-.426.85-1.227 1.356-2.196 1.39-1.573 0-2.439-1.07-2.439-3.012V7.055l-7.234 2.092v.284l.044.004c1.565.14 1.994.683 1.994 2.525v8.362a9.443 9.443 0 00.15 1.741l.13.57C75.243 24.845 76.848 26 79.362 26c2.129 0 3.996-1.328 4.818-3.405v2.885h7.233v-.291l-.034-.012zm28.102.298v-.291l-.035-.009c-1.44-.334-2.001-.964-2.001-2.248V12.295C117.445 8.98 115.597 7 112.5 7c-2.257 0-4.16 1.314-4.893 3.36-.582-2.168-2.257-3.36-4.734-3.36-2.175 0-3.88 1.156-4.612 3.11V7.056l-7.233 2.006v.286l.043.004c1.547.138 1.994.697 1.994 2.492v13.631h6.75v-.29l-.037-.01c-1.148-.271-1.519-.767-1.519-2.04V10.95c.304-.715.917-1.562 2.127-1.562 1.504 0 2.266 1.05 2.266 3.116v12.972h6.751v-.29l-.035-.01c-1.149-.271-1.52-.767-1.52-2.04V12.294a7.107 7.107 0 00-.095-1.21c.322-.777.97-1.696 2.23-1.696 1.524 0 2.265 1.02 2.265 3.116v12.972h7.233z"/></svg></span><span class="u-textScreenReader">Homepage</span></a></div><div class="u-paddingLeft10 u-sm-show r-paddingRight10"><a href="https://rsci.app.link/?%24canonical_url=https%3A%2F%2Fmedium.com/flutter%3F~feature=LoMobileNavBar&~channel=ShowCollectionHome&~stage=m2">Open in app</a></div></div><div class="metabar-block u-flex0 u-flexCenter"><div class="u-flexCenter u-height65 u-xs-height56"><div class="buttonSet buttonSet--wide u-lineHeightInherit"><a class="button button--primary button--light button--chromeless u-accentColor--buttonNormal is-inSiteNavBar u-xs-hide js-signInButton" href="https://medium.com/m/signin?redirect=https%3A%2F%2Fmedium.com%2Fflutter%3Fsource%3Duser_profile_page---------1-------------a6d788faa5e5---------------&amp;source=--------------------------nav_reg&amp;operation=login" data-action="sign-in-prompt" data-redirect="https://medium.com/flutter?source=user_profile_page---------1-------------a6d788faa5e5---------------" data-action-source="--------------------------nav_reg">Sign in</a><a class="button button--primary button--light button--withChrome u-accentColor--buttonNormal is-inSiteNavBar js-signUpButton" href="https://medium.com/m/signin?redirect=https%3A%2F%2Fmedium.com%2Fflutter%3Fsource%3Duser_profile_page---------1-------------a6d788faa5e5---------------&amp;source=--------------------------nav_reg&amp;operation=register" data-action="sign-up-prompt" data-redirect="https://medium.com/flutter?source=user_profile_page---------1-------------a6d788faa5e5---------------" data-action-source="--------------------------nav_reg">Get started</a></div></div></div></div></div><div class="metabar metabar--spacer js-metabarSpacer u-tintBgColor u-height65 u-xs-height56"></div><div class="collectionHeader js-collectionHeaderContainer u-relative collectionHeader--layoutMedium collectionHeader--alignmentLeft collectionHeader--withLogo collectionHeader--withoutBackground collectionHeader--colorBehaviorBold collectionHeader--withNavigation collectionHeader--editorLayoutTitleAndLogo is-modeView u-tintBgColor"><div class="collectionHeader-aspectRatioTable"><div class="collectionHeader-aspectRatioContent u-backgroundSizeCover js-collectionHeaderBackground"><div class="collectionHeader-overlayBackground u-height100vh"></div><header class="collectionHeader-heroAndInlineNav u-borderBox u-maxWidth1072 u-paddingLeft20 u-paddingRight20 u-marginAuto u-foreground js-collectionHeader"><div class="collectionHeader-hero js-collectionHeaderHero u-clearfix u-tintSpectrum"><div class="collectionHeader-heroInner"><div class="collectionHeader-logo js-collectionHeaderLogo" style="width: 87px; float: left; padding-right: 20px; margin-right: 0;"><a class="link u-baseColor--link" href="https://medium.com/flutter" title="Go to Flutter" aria-label="Go to Flutter"><div class="u-relative u-marginAuto"><div style="padding-bottom: 105.45%"></div><img class="collectionHeader-logoImage js-collectionHeaderLogoImage" src="https://cdn-images-1.medium.com/max/174/1*XrbUBnZb-Vp9jRDGqU-BXQ@2x.png" data-image-id="1*XrbUBnZb-Vp9jRDGqU-BXQ@2x.png" data-width="2000" data-height="2109" /></div></a></div><div class="collectionHeader-nameAndDescription"><a class="link link--noUnderline u-baseColor--link" href="https://medium.com/flutter" title="Go to Flutter" aria-label="Go to Flutter"><h1 class="collectionHeader-name js-collectionName u-foreground u-baseColor--textDark u-paddingBottom4 u-lineHeightTightest u-contentSansBold u-fontSize40 u-xs-fontSize32">Flutter</h1></a><h2 class="collectionHeader-description js-collectionDescription u-foreground u-baseColor--textNormal u-contentSansRegular u-fontSize24 u-xs-fontSize18">Build beautiful native apps in record time</h2></div></div></div></header></div><div class="collectionHeader-aspectRatioCell"><div class="collectionHeader-aspectRatioFullWidth"></div></div></div><div class="collectionHeader-blockNav"><div class="u-borderBox u-maxWidth1072 u-paddingLeft20 u-paddingRight20 u-marginAuto"><nav class="collectionHeader-nav u-clearfix js-collectionHeaderNav u-lineHeight40 u-overflowHiddenY u-tintSpectrum"><div class="buttonSet u-flex1 u-noWrap u-overflowX u-paddingBottom100 u-xs-marginRight15"><li class="collectionHeader-navItem js-collectionNavItem u-inlineBlock u-fontSize13 u-textUppercase u-letterSpacing1px u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0"><a class="link link--darken u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://medium.com/flutter/tagged/announcements">Announcements</a></li><li class="collectionHeader-navItem js-collectionNavItem u-inlineBlock u-fontSize13 u-textUppercase u-letterSpacing1px u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0"><a class="link link--darken u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://medium.com/flutter/tagged/performance">Performance</a></li><li class="collectionHeader-navItem js-collectionNavItem u-inlineBlock u-fontSize13 u-textUppercase u-letterSpacing1px u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0"><a class="link link--darken u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://medium.com/flutter/tagged/material-design">Material Design</a></li><li class="collectionHeader-navItem js-collectionNavItem u-inlineBlock u-fontSize13 u-textUppercase u-letterSpacing1px u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0"><a class="link link--darken u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://medium.com/flutter/tagged/web-development">Web Development</a></li><span class="u-borderLeft1 u-paddingLeft22 u-xs-paddingLeft12 u-baseColor--borderLight"></span><li class="collectionHeader-navItem js-collectionNavItem u-inlineBlock u-fontSize13 u-textUppercase u-letterSpacing1px u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0 is-external"><a class="link link--darkenOnHover u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://flutter.dev/" rel="nofollow noopener" target="_blank">flutter.dev</a></li></div><div class="buttonSet u-textAlignRight u-marginLeft18 u-flex0 u-noWrap"><label class="button button--small button--chromeless button--withIcon button--withSvgIcon inputGroup u-sm-hide metabar-predictiveSearch u-baseColor--buttonNormal u-baseColor--placeholderNormal" title="Search Flutter"><span class="svgIcon svgIcon--search svgIcon--25px u-baseColor--iconLight"><svg class="svgIcon-use" width="25" height="25" ><path d="M20.067 18.933l-4.157-4.157a6 6 0 10-.884.884l4.157 4.157a.624.624 0 10.884-.884zM6.5 11c0-2.62 2.13-4.75 4.75-4.75S16 8.38 16 11s-2.13 4.75-4.75 4.75S6.5 13.62 6.5 11z"/></svg></span><input class="js-predictiveSearchInput textInput textInput--rounded textInput--darkText u-baseColor--textNormal textInput--transparent" type="search" placeholder="Search Flutter" required="true" data-collection-id="4da7dfd21a33" /></label><a class="button button--light button--chromeless is-touchIconBlackPulse u-baseColor--buttonLight button--withIcon button--withSvgIcon button--chromeless u-verticalAlignMiddle" href="https://twitter.com/flutterdev" title="Visit “Flutter” on X" aria-label="Visit “Flutter” on X" rel="me" target="_blank"><span class="button-defaultState"><span class="svgIcon svgIcon--twitter svgIcon--25px"><svg class="svgIcon-use" width="25" height="25" fill="none" ><path d="M14.215 11.3l5.764-6.7h-1.366l-5.005 5.818L9.611 4.6H5l6.045 8.798L5 20.424h1.366l5.286-6.144 4.221 6.144h4.61L14.216 11.3zm-1.871 2.175l-.612-.876-4.874-6.97h2.098l3.933 5.625.613.876 5.112 7.312h-2.098l-4.172-5.966z" fill="#242424"/></svg></span></span></a><button class="button button--primary button--smallest u-noUserSelect button--withChrome u-accentColor--buttonNormal js-relationshipButton is-smallPill" data-action="sign-up-prompt" data-sign-in-action="toggle-follow-collection" data-requires-token="true" data-redirect="https://medium.com/_/subscribe/collection/flutter" data-action-source="pub_header----4da7dfd21a33----------------------follow_pub" data-collection-id="4da7dfd21a33"><span class="button-label js-buttonLabel">Follow</span></button></div></nav></div></div></div><div class="u-marginBottom40 js-collectionStream"><div class="streamItem streamItem--section js-streamItem"><section class="u-marginTop30 u-xs-margin0 u-marginBottom15 u-maxWidth1032 u-sm-paddingLeft20 u-sm-paddingRight20 u-borderBox u-marginAuto"><div class="row u-marginTop30 u-marginLeftNegative12 u-marginRightNegative12"><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight15 u-size8of12" data-source="collection_home---4------0-----------------------" data-post-id="204b7d20c45d" data-index="0"><div class="u-lineHeightBase postItem u-marginRight3"><a href="https://medium.com/flutter/flutter-3-24-dart-3-5-204b7d20c45d?source=collection_home---4------0-----------------------" data-action="open-post" data-action-value="https://medium.com/flutter/flutter-3-24-dart-3-5-204b7d20c45d?source=collection_home---4------0-----------------------" class="u-block u-xs-height170 u-height350 u-width100pct u-floatLeft u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/2000/1*jzRGig761LnPlvokq2FaVA.gif&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">Announcing Flutter 3.24 and Dart 3.5</span></a></div></div><div class="col u-xs-marginBottom10 u-paddingLeft9 u-paddingRight12 u-paddingTop0 u-sm-paddingTop20 u-paddingBottom25 u-size4of12 u-xs-size12of12 u-marginBottom30"><a class="" href="https://medium.com/flutter/flutter-3-24-dart-3-5-204b7d20c45d?source=collection_home---4------0-----------------------" data-action-source="collection_home---4------0-----------------------" data-post-id="204b7d20c45d"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp4 u-fontSize30 u-size12of12 u-xs-size12of12 u-xs-fontSize24">Announcing Flutter 3.24 and Dart 3.5</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">An early look at Flutter GPU, web enhancements, and more!</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://medium.com/@mit.mit" data-action="show-user-card" data-action-value="a6d788faa5e5" data-action-type="hover" data-user-id="a6d788faa5e5" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/0*Y_CFLc1qadgr3tPK." class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Michael Thomsen"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://medium.com/@mit.mit" data-action="show-user-card" data-action-value="a6d788faa5e5" data-action-type="hover" data-user-id="a6d788faa5e5" dir="auto">Michael Thomsen</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-08-06T18:00:29.358Z">Aug 6</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="5 min read"></span></div></div></div></div></div></div></section></div><div class="streamItem streamItem--section js-streamItem"><section class="u-marginTop30 u-xs-margin0 u-marginBottom15 u-maxWidth1032 u-sm-paddingLeft20 u-sm-paddingRight20 u-borderBox u-marginAuto"><div class="row u-marginTop30 u-marginLeftNegative12 u-marginRightNegative12"><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------0-----------------------" data-post-id="71377810fd26" data-index="0"><div class="u-lineHeightBase postItem"><a href="https://medium.com/flutter/prospera-using-flutter-to-bring-ai-to-the-frontline-of-sales-71377810fd26?source=collection_home---4------0-----------------------" data-action="open-post" data-action-value="https://medium.com/flutter/prospera-using-flutter-to-bring-ai-to-the-frontline-of-sales-71377810fd26?source=collection_home---4------0-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/1*rV1FMqYeyrHsOvtSUIOnOA.png&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">Prospera: using Flutter to bring AI to the frontline of sales</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://medium.com/flutter/prospera-using-flutter-to-bring-ai-to-the-frontline-of-sales-71377810fd26?source=collection_home---4------0-----------------------" data-action-source="collection_home---4------0-----------------------" data-post-id="71377810fd26"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Prospera: using Flutter to bring AI to the frontline of sales</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Developers around the world are using Google’s Gemini models to tackle real-world challenges, and one of the most exciting applications…</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://medium.com/@tvolkert" data-action="show-user-card" data-action-value="3a7a2a067927" data-action-type="hover" data-user-id="3a7a2a067927" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/0*EUSBYlBzvqL9j_Xr." class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Todd Volkert"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://medium.com/@tvolkert" data-action="show-user-card" data-action-value="3a7a2a067927" data-action-type="hover" data-user-id="3a7a2a067927" dir="auto">Todd Volkert</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-21T17:32:03.271Z">Nov 21</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="3 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------1-----------------------" data-post-id="f33d497b7c11" data-index="1"><div class="u-lineHeightBase postItem"><a href="https://medium.com/flutter/getting-started-with-flutter-gpu-f33d497b7c11?source=collection_home---4------1-----------------------" data-action="open-post" data-action-value="https://medium.com/flutter/getting-started-with-flutter-gpu-f33d497b7c11?source=collection_home---4------1-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/1*jfeUgpEP9AgAz94yVxVW1g.gif&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">Getting started with Flutter GPU</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://medium.com/flutter/getting-started-with-flutter-gpu-f33d497b7c11?source=collection_home---4------1-----------------------" data-action-source="collection_home---4------1-----------------------" data-post-id="f33d497b7c11"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Getting started with Flutter GPU</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Build custom renderers and render 3D scenes in Flutter.</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://medium.com/@algebrandon" data-action="show-user-card" data-action-value="9a1282e0b0ee" data-action-type="hover" data-user-id="9a1282e0b0ee" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/0*Jzj4ct7CmcvOiR3g." class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Brandon DeRosier"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://medium.com/@algebrandon" data-action="show-user-card" data-action-value="9a1282e0b0ee" data-action-type="hover" data-user-id="9a1282e0b0ee" dir="auto">Brandon DeRosier</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-08-06T18:02:39.237Z">Aug 6</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="17 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------2-----------------------" data-post-id="6c040f87d1e4" data-index="2"><div class="u-lineHeightBase postItem"><a href="https://medium.com/flutter/whats-new-in-flutter-3-24-6c040f87d1e4?source=collection_home---4------2-----------------------" data-action="open-post" data-action-value="https://medium.com/flutter/whats-new-in-flutter-3-24-6c040f87d1e4?source=collection_home---4------2-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/0*bdcb6KGonosfPZ6m&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">What’s new in Flutter 3.24</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://medium.com/flutter/whats-new-in-flutter-3-24-6c040f87d1e4?source=collection_home---4------2-----------------------" data-action-source="collection_home---4------2-----------------------" data-post-id="6c040f87d1e4"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">What’s new in Flutter 3.24</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Unleashing Flutter GPU, Multi-View Embedding, and More</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://medium.com/@kevinchisholm" data-action="show-user-card" data-action-value="7cb43f46877f" data-action-type="hover" data-user-id="7cb43f46877f" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*HEfsynQuQpVrGR-qdGeSvg.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Kevin Chisholm"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://medium.com/@kevinchisholm" data-action="show-user-card" data-action-value="7cb43f46877f" data-action-type="hover" data-user-id="7cb43f46877f" dir="auto">Kevin Chisholm</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-08-06T18:00:06.984Z">Aug 6</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="12 min read"></span></div></div></div></div></div></div></div><div class="row u-marginTop30 u-marginLeftNegative12 u-marginRightNegative12"><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------3-----------------------" data-post-id="2210e39b04b9" data-index="3"><div class="u-lineHeightBase postItem"><a href="https://medium.com/flutter/how-we-built-it-creating-the-i-o-crossword-puzzle-powered-by-ai-2210e39b04b9?source=collection_home---4------3-----------------------" data-action="open-post" data-action-value="https://medium.com/flutter/how-we-built-it-creating-the-i-o-crossword-puzzle-powered-by-ai-2210e39b04b9?source=collection_home---4------3-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/0*4ylubp836_tc4Nni&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">How we built it: Creating the I/O Crossword puzzle, powered by AI</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://medium.com/flutter/how-we-built-it-creating-the-i-o-crossword-puzzle-powered-by-ai-2210e39b04b9?source=collection_home---4------3-----------------------" data-action-source="collection_home---4------3-----------------------" data-post-id="2210e39b04b9"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">How we built it: Creating the I/O Crossword puzzle, powered by AI</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Adding a fun, helpful twist to a classic word game with Flutter, Firebase Genkit, and the Gemini API</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://medium.com/@vgv_team" data-action="show-user-card" data-action-value="7781c543301e" data-action-type="hover" data-user-id="7781c543301e" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*XUX_mTFnhm4BKyT9q9sOUQ.png" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Very Good Ventures Team"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://medium.com/@vgv_team" data-action="show-user-card" data-action-value="7781c543301e" data-action-type="hover" data-user-id="7781c543301e" dir="auto">Very Good Ventures Team</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-06-26T17:01:39.029Z">Jun 26</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="6 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------4-----------------------" data-post-id="7c963c064f8d" data-index="4"><div class="u-lineHeightBase postItem"><a href="https://medium.com/flutter/all-the-flutter-news-from-a-busy-google-i-o-2024-7c963c064f8d?source=collection_home---4------4-----------------------" data-action="open-post" data-action-value="https://medium.com/flutter/all-the-flutter-news-from-a-busy-google-i-o-2024-7c963c064f8d?source=collection_home---4------4-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/1*--DvqdXSA38rPuqMK5c0tQ.png&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">All the Flutter news from a busy Google I/O 2024</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://medium.com/flutter/all-the-flutter-news-from-a-busy-google-i-o-2024-7c963c064f8d?source=collection_home---4------4-----------------------" data-action-source="collection_home---4------4-----------------------" data-post-id="7c963c064f8d"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">All the Flutter news from a busy Google I/O 2024</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Catch up on all the big product updates, new resources, and success stories announced at Google I/O 2024</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://medium.com/@mit.mit" data-action="show-user-card" data-action-value="a6d788faa5e5" data-action-type="hover" data-user-id="a6d788faa5e5" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/0*Y_CFLc1qadgr3tPK." class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Michael Thomsen"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://medium.com/@mit.mit" data-action="show-user-card" data-action-value="a6d788faa5e5" data-action-type="hover" data-user-id="a6d788faa5e5" dir="auto">Michael Thomsen</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-05-30T15:37:07.488Z">May 30</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="3 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------5-----------------------" data-post-id="1ccf4d271226" data-index="5"><div class="u-lineHeightBase postItem"><a href="https://medium.com/flutter/announcing-the-winners-of-the-global-gamers-challenge-1ccf4d271226?source=collection_home---4------5-----------------------" data-action="open-post" data-action-value="https://medium.com/flutter/announcing-the-winners-of-the-global-gamers-challenge-1ccf4d271226?source=collection_home---4------5-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/0*S_bBN0WiR_Q5F08J&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">Announcing the winners of the Global Gamers Challenge</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://medium.com/flutter/announcing-the-winners-of-the-global-gamers-challenge-1ccf4d271226?source=collection_home---4------5-----------------------" data-action-source="collection_home---4------5-----------------------" data-post-id="1ccf4d271226"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Announcing the winners of the Global Gamers Challenge</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Our 10 top projects, and how to stay involved with sustainability games</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://medium.com/@kkboateng" data-action="show-user-card" data-action-value="aa31f520c7ec" data-action-type="hover" data-user-id="aa31f520c7ec" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/0*IxpUINuAJhraX2My" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Kelvin Boateng"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://medium.com/@kkboateng" data-action="show-user-card" data-action-value="aa31f520c7ec" data-action-type="hover" data-user-id="aa31f520c7ec" dir="auto">Kelvin Boateng</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-05-14T20:36:18.962Z">May 14</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="6 min read"></span></div></div></div></div></div></div></div><div class="row u-marginTop30 u-marginLeftNegative12 u-marginRightNegative12"><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------6-----------------------" data-post-id="fbde6c164fe3" data-index="6"><div class="u-lineHeightBase postItem"><a href="https://medium.com/flutter/whats-new-in-flutter-3-22-fbde6c164fe3?source=collection_home---4------6-----------------------" data-action="open-post" data-action-value="https://medium.com/flutter/whats-new-in-flutter-3-22-fbde6c164fe3?source=collection_home---4------6-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/1*hf9CEzGh0uhxnzVZi2Kk4g.png&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">What’s new in Flutter 3.22</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://medium.com/flutter/whats-new-in-flutter-3-22-fbde6c164fe3?source=collection_home---4------6-----------------------" data-action-source="collection_home---4------6-----------------------" data-post-id="fbde6c164fe3"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">What’s new in Flutter 3.22</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">WebAssembly, Graphics rendering enhancements, and more options for AI integration</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://medium.com/@kevinchisholm" data-action="show-user-card" data-action-value="7cb43f46877f" data-action-type="hover" data-user-id="7cb43f46877f" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*HEfsynQuQpVrGR-qdGeSvg.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Kevin Chisholm"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://medium.com/@kevinchisholm" data-action="show-user-card" data-action-value="7cb43f46877f" data-action-type="hover" data-user-id="7cb43f46877f" dir="auto">Kevin Chisholm</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-05-14T20:34:30.980Z">May 14</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="12 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------7-----------------------" data-post-id="5e211f708a37" data-index="7"><div class="u-lineHeightBase postItem"><a href="https://medium.com/flutter/io24-5e211f708a37?source=collection_home---4------7-----------------------" data-action="open-post" data-action-value="https://medium.com/flutter/io24-5e211f708a37?source=collection_home---4------7-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/1*Mq-Uj8c8l7rrpPxYQ6Gemw.gif&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">Landing Flutter 3.22 and Dart 3.4 at Google I/O 2024</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://medium.com/flutter/io24-5e211f708a37?source=collection_home---4------7-----------------------" data-action-source="collection_home---4------7-----------------------" data-post-id="5e211f708a37"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Landing Flutter 3.22 and Dart 3.4 at Google I/O 2024</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Major milestones for Flutter web apps, graphics performance upgrades, productivity experiments, and more</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://medium.com/@mit.mit" data-action="show-user-card" data-action-value="a6d788faa5e5" data-action-type="hover" data-user-id="a6d788faa5e5" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/0*Y_CFLc1qadgr3tPK." class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Michael Thomsen"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://medium.com/@mit.mit" data-action="show-user-card" data-action-value="a6d788faa5e5" data-action-type="hover" data-user-id="a6d788faa5e5" dir="auto">Michael Thomsen</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-05-14T20:33:38.614Z">May 14</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="7 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------8-----------------------" data-post-id="597d4f3b450c" data-index="8"><div class="u-lineHeightBase postItem"><a href="https://medium.com/flutter/cross-platform-development-with-flutter-how-google-classroom-gets-teachers-and-students-on-the-597d4f3b450c?source=collection_home---4------8-----------------------" data-action="open-post" data-action-value="https://medium.com/flutter/cross-platform-development-with-flutter-how-google-classroom-gets-teachers-and-students-on-the-597d4f3b450c?source=collection_home---4------8-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/1*-u0y5vTqoC_sCyOHpvUnNA.png&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">Cross Platform development with Flutter — How Google Classroom gets teachers and students on the…</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://medium.com/flutter/cross-platform-development-with-flutter-how-google-classroom-gets-teachers-and-students-on-the-597d4f3b450c?source=collection_home---4------8-----------------------" data-action-source="collection_home---4------8-----------------------" data-post-id="597d4f3b450c"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Cross Platform development with Flutter — How Google Classroom gets teachers and students on the…</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Google’s Classroom app, which originally launched in 2014, is used by 150 million educators and students around the world to organize…</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://medium.com/@craiglabenz_78472" data-action="show-user-card" data-action-value="7014d6220229" data-action-type="hover" data-user-id="7014d6220229" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*xu-sgiT2AZrrzBVu1oYnoQ.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Craig Labenz"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://medium.com/@craiglabenz_78472" data-action="show-user-card" data-action-value="7014d6220229" data-action-type="hover" data-user-id="7014d6220229" dir="auto">Craig Labenz</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-05-07T15:02:03.788Z">May 7</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="8 min read"></span></div></div></div></div></div></div></div></section></div></div><style class="js-collectionStyle"> .u-accentColor--borderLight {border-color: #498BD1 !important;} .u-accentColor--borderNormal {border-color: #498BD1 !important;} .u-accentColor--borderDark {border-color: #4477AF !important;} .u-accentColor--iconLight .svgIcon,.u-accentColor--iconLight.svgIcon {fill: #498BD1 !important;} .u-accentColor--iconNormal .svgIcon,.u-accentColor--iconNormal.svgIcon {fill: #498BD1 !important;} .u-accentColor--iconDark .svgIcon,.u-accentColor--iconDark.svgIcon {fill: #4477AF !important;} .u-accentColor--textNormal {color: #4477AF !important;} .u-accentColor--hoverTextNormal:hover {color: #4477AF !important;} .u-accentColor--textNormal.u-accentColor--textDarken:hover {color: #416D9E !important;} .u-accentColor--textDark {color: #416D9E !important;} .u-accentColor--backgroundLight {background-color: #498BD1 !important;} .u-accentColor--backgroundNormal {background-color: #498BD1 !important;} .u-accentColor--backgroundDark {background-color: #4477AF !important;} .u-accentColor--buttonDark {border-color: #4477AF !important; color: #416D9E !important;} .u-accentColor--buttonDark:hover {border-color: #416D9E !important;} .u-accentColor--buttonDark .icon:before,.u-accentColor--buttonDark .svgIcon{color: #4477AF !important; fill: #4477AF !important;} .u-accentColor--buttonNormal:not(.clapButton--largePill) {border-color: #498BD1 !important; color: #4477AF !important;} .u-accentColor--buttonNormal:hover {border-color: #4477AF !important;} .u-accentColor--buttonNormal .icon:before,.u-accentColor--buttonNormal .svgIcon{color: #498BD1 !important; fill: #498BD1 !important;} .u-accentColor--buttonNormal.button--filled .icon:before,.u-accentColor--buttonNormal.button--filled .svgIcon{color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-accentColor--buttonDark.button--filled,.u-accentColor--buttonDark.button--withChrome.is-active,.u-accentColor--fillWhenActive.is-active {background-color: #4477AF !important; border-color: #4477AF !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-accentColor--buttonNormal.button--filled:not(.clapButton--largePill),.u-accentColor--buttonNormal.button--withChrome.is-active:not(.clapButton--largePill) {background-color: #498BD1 !important; border-color: #498BD1 !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .postArticle.is-withAccentColors .markup--user,.postArticle.is-withAccentColors .markup--query {color: #4477AF !important;}.u-tintBgColor {background-color: rgba(1, 87, 155, 1) !important;}.u-tintBgColor .u-fadeLeft:before {background-image: linear-gradient(to right, rgba(1, 87, 155, 1) 0%, rgba(1, 87, 155, 0) 100%) !important;}.u-tintBgColor .u-fadeRight:after {background-image: linear-gradient(to right, rgba(1, 87, 155, 0) 0%, rgba(1, 87, 155, 1) 100%) !important;} .u-tintSpectrum .u-baseColor--borderLight {border-color: #92B4DC !important;} .u-tintSpectrum .u-baseColor--borderNormal {border-color: #BCD3F1 !important;} .u-tintSpectrum .u-baseColor--borderDark {border-color: #E3F2FF !important;} .u-tintSpectrum .u-baseColor--iconLight .svgIcon,.u-tintSpectrum .u-baseColor--iconLight.svgIcon {fill: #92B4DC !important;} .u-tintSpectrum .u-baseColor--iconNormal .svgIcon,.u-tintSpectrum .u-baseColor--iconNormal.svgIcon {fill: #BCD3F1 !important;} .u-tintSpectrum .u-baseColor--iconDark .svgIcon,.u-tintSpectrum .u-baseColor--iconDark.svgIcon {fill: #E3F2FF !important;} .u-tintSpectrum .u-baseColor--textNormal {color: #BCD3F1 !important;} .u-tintSpectrum .u-baseColor--textNormal.u-baseColor--textDarken:hover {color: #F7FFFF !important;} .u-tintSpectrum .u-baseColor--textDark {color: #F7FFFF !important;} .u-tintSpectrum .u-baseColor--textDarker {color: #F7FFFF !important;} .u-tintSpectrum .u-baseColor--backgroundLight {background-color: #92B4DC !important;} .u-tintSpectrum .u-baseColor--backgroundNormal {background-color: #BCD3F1 !important;} .u-tintSpectrum .u-baseColor--backgroundDark {background-color: #E3F2FF !important;} .u-tintSpectrum .u-baseColor--buttonLight {border-color: #92B4DC !important; color: #92B4DC !important;} .u-tintSpectrum .u-baseColor--buttonLight:hover {border-color: #92B4DC !important;} .u-tintSpectrum .u-baseColor--buttonLight .icon:before,.u-tintSpectrum .u-baseColor--buttonLight .svgIcon {color: #92B4DC !important; fill: #92B4DC !important;} .u-tintSpectrum .u-baseColor--buttonDark {border-color: #E3F2FF !important; color: #F7FFFF !important;} .u-tintSpectrum .u-baseColor--buttonDark:hover {border-color: #F7FFFF !important;} .u-tintSpectrum .u-baseColor--buttonDark .icon:before,.u-tintSpectrum .u-baseColor--buttonDark .svgIcon {color: #E3F2FF !important; fill: #E3F2FF !important;} .u-tintSpectrum .u-baseColor--buttonNormal {border-color: #BCD3F1 !important; color: #BCD3F1 !important;} .u-tintSpectrum .u-baseColor--buttonNormal:hover {border-color: #E3F2FF !important;} .u-tintSpectrum .u-baseColor--buttonNormal .icon:before,.u-tintSpectrum .u-baseColor--buttonNormal .svgIcon {color: #BCD3F1 !important; fill: #BCD3F1 !important;} .u-tintSpectrum .u-baseColor--buttonDark.button--filled,.u-tintSpectrum .u-baseColor--buttonDark.button--withChrome.is-active {background-color: #E3F2FF !important; border-color: #E3F2FF !important; color: rgba(1, 87, 155, 1) !important; fill: rgba(1, 87, 155, 1) !important;} .u-tintSpectrum .u-baseColor--buttonNormal.button--filled,.u-tintSpectrum .u-baseColor--buttonNormal.button--withChrome.is-active {background-color: #BCD3F1 !important; border-color: #BCD3F1 !important; color: rgba(1, 87, 155, 1) !important; fill: rgba(1, 87, 155, 1) !important;} .u-tintSpectrum .u-baseColor--link {color: #BCD3F1 !important;} .u-tintSpectrum .u-baseColor--link.link--darkenOnHover:hover {color: #F7FFFF !important;} .u-tintSpectrum .u-baseColor--link.link--darken:hover,.u-tintSpectrum .u-baseColor--link.link--darken:focus,.u-tintSpectrum .u-baseColor--link.link--darken:active {color: #F7FFFF !important;} .u-tintSpectrum .u-baseColor--link.link--dark {color: #F7FFFF !important;} .u-tintSpectrum .u-baseColor--link.link--dark.link--darken:hover,.u-tintSpectrum .u-baseColor--link.link--dark.link--darken:focus,.u-tintSpectrum .u-baseColor--link.link--dark.link--darken:active {color: #F7FFFF !important;} .u-tintSpectrum .u-baseColor--link.link--darker {color: #F7FFFF !important;} .u-tintSpectrum .u-baseColor--placeholderNormal ::-webkit-input-placeholder {color: #92B4DC;} .u-tintSpectrum .u-baseColor--placeholderNormal ::-moz-placeholder {color: #92B4DC;} .u-tintSpectrum .u-baseColor--placeholderNormal :-ms-input-placeholder {color: #92B4DC;} .u-tintSpectrum .ui-h1,.u-tintSpectrum .ui-h2,.u-tintSpectrum .ui-h3,.u-tintSpectrum .ui-h4,.u-tintSpectrum .ui-brand1,.u-tintSpectrum .ui-brand2,.u-tintSpectrum .ui-captionStrong {color: #F7FFFF !important; fill: #F7FFFF !important;} .u-tintSpectrum .ui-body,.u-tintSpectrum .ui-caps {color: #F7FFFF !important; fill: #F7FFFF !important;} .u-tintSpectrum .ui-summary,.u-tintSpectrum .ui-caption {color: #92B4DC !important; fill: #92B4DC !important;} .u-tintSpectrum .u-accentColor--borderLight {border-color: #92B4DC !important;} .u-tintSpectrum .u-accentColor--borderNormal {border-color: #BCD3F1 !important;} .u-tintSpectrum .u-accentColor--borderDark {border-color: #E3F2FF !important;} .u-tintSpectrum .u-accentColor--iconLight .svgIcon,.u-tintSpectrum .u-accentColor--iconLight.svgIcon {fill: #92B4DC !important;} .u-tintSpectrum .u-accentColor--iconNormal .svgIcon,.u-tintSpectrum .u-accentColor--iconNormal.svgIcon {fill: #BCD3F1 !important;} .u-tintSpectrum .u-accentColor--iconDark .svgIcon,.u-tintSpectrum .u-accentColor--iconDark.svgIcon {fill: #E3F2FF !important;} .u-tintSpectrum .u-accentColor--textNormal {color: #BCD3F1 !important;} .u-tintSpectrum .u-accentColor--hoverTextNormal:hover {color: #BCD3F1 !important;} .u-tintSpectrum .u-accentColor--textNormal.u-accentColor--textDarken:hover {color: #F7FFFF !important;} .u-tintSpectrum .u-accentColor--textDark {color: #F7FFFF !important;} .u-tintSpectrum .u-accentColor--backgroundLight {background-color: #92B4DC !important;} .u-tintSpectrum .u-accentColor--backgroundNormal {background-color: #BCD3F1 !important;} .u-tintSpectrum .u-accentColor--backgroundDark {background-color: #E3F2FF !important;} .u-tintSpectrum .u-accentColor--buttonDark {border-color: #E3F2FF !important; color: #F7FFFF !important;} .u-tintSpectrum .u-accentColor--buttonDark:hover {border-color: #F7FFFF !important;} .u-tintSpectrum .u-accentColor--buttonDark .icon:before,.u-tintSpectrum .u-accentColor--buttonDark .svgIcon{color: #E3F2FF !important; fill: #E3F2FF !important;} .u-tintSpectrum .u-accentColor--buttonNormal:not(.clapButton--largePill) {border-color: #BCD3F1 !important; color: #BCD3F1 !important;} .u-tintSpectrum .u-accentColor--buttonNormal:hover {border-color: #E3F2FF !important;} .u-tintSpectrum .u-accentColor--buttonNormal .icon:before,.u-tintSpectrum .u-accentColor--buttonNormal .svgIcon{color: #BCD3F1 !important; fill: #BCD3F1 !important;} .u-tintSpectrum .u-accentColor--buttonNormal.button--filled .icon:before,.u-tintSpectrum .u-accentColor--buttonNormal.button--filled .svgIcon{color: rgba(1, 87, 155, 1) !important; fill: rgba(1, 87, 155, 1) !important;} .u-tintSpectrum .u-accentColor--buttonDark.button--filled,.u-tintSpectrum .u-accentColor--buttonDark.button--withChrome.is-active,.u-tintSpectrum .u-accentColor--fillWhenActive.is-active {background-color: #E3F2FF !important; border-color: #E3F2FF !important; color: rgba(1, 87, 155, 1) !important; fill: rgba(1, 87, 155, 1) !important;} .u-tintSpectrum .u-accentColor--buttonNormal.button--filled:not(.clapButton--largePill),.u-tintSpectrum .u-accentColor--buttonNormal.button--withChrome.is-active:not(.clapButton--largePill) {background-color: #BCD3F1 !important; border-color: #BCD3F1 !important; color: rgba(1, 87, 155, 1) !important; fill: rgba(1, 87, 155, 1) !important;} .u-tintSpectrum .postArticle.is-withAccentColors .markup--user,.u-tintSpectrum .postArticle.is-withAccentColors .markup--query {color: #BCD3F1 !important;} .u-accentColor--highlightFaint {background-color: rgba(227, 243, 255, 1) !important;} .u-accentColor--highlightStrong.is-active .svgIcon {fill: rgba(182, 230, 255, 1) !important;} .postArticle.is-withAccentColors .markup--quote.is-other {background-color: rgba(227, 243, 255, 1) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .markup--quote.is-other {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(227, 243, 255, 1), rgba(227, 243, 255, 1));} .postArticle.is-withAccentColors .markup--quote.is-me {background-color: rgba(203, 236, 255, 1) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .markup--quote.is-me {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(203, 236, 255, 1), rgba(203, 236, 255, 1));} .postArticle.is-withAccentColors .markup--quote.is-targeted {background-color: rgba(182, 230, 255, 1) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .markup--quote.is-targeted {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(182, 230, 255, 1), rgba(182, 230, 255, 1));} .postArticle.is-withAccentColors .markup--quote.is-selected {background-color: rgba(182, 230, 255, 1) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .markup--quote.is-selected {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(182, 230, 255, 1), rgba(182, 230, 255, 1));} .postArticle.is-withAccentColors .markup--highlight {background-color: rgba(182, 230, 255, 1) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .markup--highlight {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(182, 230, 255, 1), rgba(182, 230, 255, 1));}</style><style class="js-collectionStyleConstant">.u-imageBgColor {background-color: rgba(0, 0, 0, 0.24705882352941178);} .u-imageSpectrum .u-baseColor--borderLight {border-color: rgba(255, 255, 255, 0.6980392156862745) !important;} .u-imageSpectrum .u-baseColor--borderNormal {border-color: rgba(255, 255, 255, 0.8980392156862745) !important;} .u-imageSpectrum .u-baseColor--borderDark {border-color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--iconLight .svgIcon,.u-imageSpectrum .u-baseColor--iconLight.svgIcon {fill: rgba(255, 255, 255, 0.8) !important;} .u-imageSpectrum .u-baseColor--iconNormal .svgIcon,.u-imageSpectrum .u-baseColor--iconNormal.svgIcon {fill: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--iconDark .svgIcon,.u-imageSpectrum .u-baseColor--iconDark.svgIcon {fill: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--textNormal {color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--textNormal.u-baseColor--textDarken:hover {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--textDark {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--textDarker {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--backgroundLight {background-color: rgba(255, 255, 255, 0.8980392156862745) !important;} .u-imageSpectrum .u-baseColor--backgroundNormal {background-color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--backgroundDark {background-color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--buttonLight {border-color: rgba(255, 255, 255, 0.6980392156862745) !important; color: rgba(255, 255, 255, 0.8) !important;} .u-imageSpectrum .u-baseColor--buttonLight:hover {border-color: rgba(255, 255, 255, 0.6980392156862745) !important;} .u-imageSpectrum .u-baseColor--buttonLight .icon:before,.u-imageSpectrum .u-baseColor--buttonLight .svgIcon {color: rgba(255, 255, 255, 0.8) !important; fill: rgba(255, 255, 255, 0.8) !important;} .u-imageSpectrum .u-baseColor--buttonDark {border-color: rgba(255, 255, 255, 0.9490196078431372) !important; color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--buttonDark:hover {border-color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--buttonDark .icon:before,.u-imageSpectrum .u-baseColor--buttonDark .svgIcon {color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--buttonNormal {border-color: rgba(255, 255, 255, 0.8980392156862745) !important; color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--buttonNormal:hover {border-color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--buttonNormal .icon:before,.u-imageSpectrum .u-baseColor--buttonNormal .svgIcon {color: rgba(255, 255, 255, 0.9490196078431372) !important; fill: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--buttonDark.button--filled,.u-imageSpectrum .u-baseColor--buttonDark.button--withChrome.is-active {background-color: rgba(255, 255, 255, 1) !important; border-color: rgba(255, 255, 255, 1) !important; color: rgba(0, 0, 0, 0.24705882352941178) !important; fill: rgba(0, 0, 0, 0.24705882352941178) !important;} .u-imageSpectrum .u-baseColor--buttonNormal.button--filled,.u-imageSpectrum .u-baseColor--buttonNormal.button--withChrome.is-active {background-color: rgba(255, 255, 255, 0.9490196078431372) !important; border-color: rgba(255, 255, 255, 0.9490196078431372) !important; color: rgba(0, 0, 0, 0.24705882352941178) !important; fill: rgba(0, 0, 0, 0.24705882352941178) !important;} .u-imageSpectrum .u-baseColor--link {color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--link.link--darkenOnHover:hover {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--link.link--darken:hover,.u-imageSpectrum .u-baseColor--link.link--darken:focus,.u-imageSpectrum .u-baseColor--link.link--darken:active {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--link.link--dark {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--link.link--dark.link--darken:hover,.u-imageSpectrum .u-baseColor--link.link--dark.link--darken:focus,.u-imageSpectrum .u-baseColor--link.link--dark.link--darken:active {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--link.link--darker {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--placeholderNormal ::-webkit-input-placeholder {color: rgba(255, 255, 255, 0.8);} .u-imageSpectrum .u-baseColor--placeholderNormal ::-moz-placeholder {color: rgba(255, 255, 255, 0.8);} .u-imageSpectrum .u-baseColor--placeholderNormal :-ms-input-placeholder {color: rgba(255, 255, 255, 0.8);} .u-imageSpectrum .ui-h1,.u-imageSpectrum .ui-h2,.u-imageSpectrum .ui-h3,.u-imageSpectrum .ui-h4,.u-imageSpectrum .ui-brand1,.u-imageSpectrum .ui-brand2,.u-imageSpectrum .ui-captionStrong {color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .ui-body,.u-imageSpectrum .ui-caps {color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .ui-summary,.u-imageSpectrum .ui-caption {color: rgba(255, 255, 255, 0.8) !important; fill: rgba(255, 255, 255, 0.8) !important;} .u-imageSpectrum .u-accentColor--borderLight {border-color: rgba(255, 255, 255, 0.6980392156862745) !important;} .u-imageSpectrum .u-accentColor--borderNormal {border-color: rgba(255, 255, 255, 0.8980392156862745) !important;} .u-imageSpectrum .u-accentColor--borderDark {border-color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--iconLight .svgIcon,.u-imageSpectrum .u-accentColor--iconLight.svgIcon {fill: rgba(255, 255, 255, 0.8) !important;} .u-imageSpectrum .u-accentColor--iconNormal .svgIcon,.u-imageSpectrum .u-accentColor--iconNormal.svgIcon {fill: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--iconDark .svgIcon,.u-imageSpectrum .u-accentColor--iconDark.svgIcon {fill: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--textNormal {color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--hoverTextNormal:hover {color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--textNormal.u-accentColor--textDarken:hover {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--textDark {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--backgroundLight {background-color: rgba(255, 255, 255, 0.8980392156862745) !important;} .u-imageSpectrum .u-accentColor--backgroundNormal {background-color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--backgroundDark {background-color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--buttonDark {border-color: rgba(255, 255, 255, 0.9490196078431372) !important; color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--buttonDark:hover {border-color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--buttonDark .icon:before,.u-imageSpectrum .u-accentColor--buttonDark .svgIcon{color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--buttonNormal:not(.clapButton--largePill) {border-color: rgba(255, 255, 255, 0.8980392156862745) !important; color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--buttonNormal:hover {border-color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--buttonNormal .icon:before,.u-imageSpectrum .u-accentColor--buttonNormal .svgIcon{color: rgba(255, 255, 255, 0.9490196078431372) !important; fill: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--buttonNormal.button--filled .icon:before,.u-imageSpectrum .u-accentColor--buttonNormal.button--filled .svgIcon{color: rgba(0, 0, 0, 0.24705882352941178) !important; fill: rgba(0, 0, 0, 0.24705882352941178) !important;} .u-imageSpectrum .u-accentColor--buttonDark.button--filled,.u-imageSpectrum .u-accentColor--buttonDark.button--withChrome.is-active,.u-imageSpectrum .u-accentColor--fillWhenActive.is-active {background-color: rgba(255, 255, 255, 1) !important; border-color: rgba(255, 255, 255, 1) !important; color: rgba(0, 0, 0, 0.24705882352941178) !important; fill: rgba(0, 0, 0, 0.24705882352941178) !important;} .u-imageSpectrum .u-accentColor--buttonNormal.button--filled:not(.clapButton--largePill),.u-imageSpectrum .u-accentColor--buttonNormal.button--withChrome.is-active:not(.clapButton--largePill) {background-color: rgba(255, 255, 255, 0.9490196078431372) !important; border-color: rgba(255, 255, 255, 0.9490196078431372) !important; color: rgba(0, 0, 0, 0.24705882352941178) !important; fill: rgba(0, 0, 0, 0.24705882352941178) !important;} .u-imageSpectrum .postArticle.is-withAccentColors .markup--user,.u-imageSpectrum .postArticle.is-withAccentColors .markup--query {color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--highlightFaint {background-color: rgba(255, 255, 255, 0.2) !important;} .u-imageSpectrum .u-accentColor--highlightStrong.is-active .svgIcon {fill: rgba(255, 255, 255, 0.6) !important;} .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-other {background-color: rgba(255, 255, 255, 0.2) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-other {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.2));} .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-me {background-color: rgba(255, 255, 255, 0.4) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-me {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 0.4));} .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-targeted {background-color: rgba(255, 255, 255, 0.6) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-targeted {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.6), rgba(255, 255, 255, 0.6));} .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-selected {background-color: rgba(255, 255, 255, 0.6) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-selected {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.6), rgba(255, 255, 255, 0.6));} .postArticle.is-withAccentColors .u-imageSpectrum .markup--highlight {background-color: rgba(255, 255, 255, 0.6) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .u-imageSpectrum .markup--highlight {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.6), rgba(255, 255, 255, 0.6));}.u-resetSpectrum .u-tintBgColor {background-color: rgba(255, 255, 255, 1) !important;}.u-resetSpectrum .u-tintBgColor .u-fadeLeft:before {background-image: linear-gradient(to right, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%) !important;}.u-resetSpectrum .u-tintBgColor .u-fadeRight:after {background-image: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 100%) !important;} .u-resetSpectrum .u-baseColor--borderLight {border-color: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-baseColor--borderNormal {border-color: rgba(0, 0, 0, 0.4980392156862745) !important;} .u-resetSpectrum .u-baseColor--borderDark {border-color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--iconLight .svgIcon,.u-resetSpectrum .u-baseColor--iconLight.svgIcon {fill: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-baseColor--iconNormal .svgIcon,.u-resetSpectrum .u-baseColor--iconNormal.svgIcon {fill: rgba(0, 0, 0, 0.4980392156862745) !important;} .u-resetSpectrum .u-baseColor--iconDark .svgIcon,.u-resetSpectrum .u-baseColor--iconDark.svgIcon {fill: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--textNormal {color: rgba(0, 0, 0, 0.4980392156862745) !important;} .u-resetSpectrum .u-baseColor--textNormal.u-baseColor--textDarken:hover {color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--textDark {color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--textDarker {color: rgba(0, 0, 0, 0.8) !important;} .u-resetSpectrum .u-baseColor--backgroundLight {background-color: rgba(0, 0, 0, 0.09803921568627451) !important;} .u-resetSpectrum .u-baseColor--backgroundNormal {background-color: rgba(0, 0, 0, 0.2) !important;} .u-resetSpectrum .u-baseColor--backgroundDark {background-color: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-baseColor--buttonLight {border-color: rgba(0, 0, 0, 0.2980392156862745) !important; color: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-baseColor--buttonLight:hover {border-color: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-baseColor--buttonLight .icon:before,.u-resetSpectrum .u-baseColor--buttonLight .svgIcon {color: rgba(0, 0, 0, 0.2980392156862745) !important; fill: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-baseColor--buttonDark {border-color: rgba(0, 0, 0, 0.6) !important; color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--buttonDark:hover {border-color: rgba(0, 0, 0, 0.8) !important;} .u-resetSpectrum .u-baseColor--buttonDark .icon:before,.u-resetSpectrum .u-baseColor--buttonDark .svgIcon {color: rgba(0, 0, 0, 0.6) !important; fill: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--buttonNormal {border-color: rgba(0, 0, 0, 0.4980392156862745) !important; color: rgba(0, 0, 0, 0.4980392156862745) !important;} .u-resetSpectrum .u-baseColor--buttonNormal:hover {border-color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--buttonNormal .icon:before,.u-resetSpectrum .u-baseColor--buttonNormal .svgIcon {color: rgba(0, 0, 0, 0.4980392156862745) !important; fill: rgba(0, 0, 0, 0.4980392156862745) !important;} .u-resetSpectrum .u-baseColor--buttonDark.button--filled,.u-resetSpectrum .u-baseColor--buttonDark.button--withChrome.is-active {background-color: rgba(0, 0, 0, 0.2980392156862745) !important; border-color: rgba(0, 0, 0, 0.2980392156862745) !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-resetSpectrum .u-baseColor--buttonNormal.button--filled,.u-resetSpectrum .u-baseColor--buttonNormal.button--withChrome.is-active {background-color: rgba(0, 0, 0, 0.2) !important; border-color: rgba(0, 0, 0, 0.2) !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-resetSpectrum .u-baseColor--link {color: rgba(0, 0, 0, 0.4980392156862745) !important;} .u-resetSpectrum .u-baseColor--link.link--darkenOnHover:hover {color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--link.link--darken:hover,.u-resetSpectrum .u-baseColor--link.link--darken:focus,.u-resetSpectrum .u-baseColor--link.link--darken:active {color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--link.link--dark {color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--link.link--dark.link--darken:hover,.u-resetSpectrum .u-baseColor--link.link--dark.link--darken:focus,.u-resetSpectrum .u-baseColor--link.link--dark.link--darken:active {color: rgba(0, 0, 0, 0.8) !important;} .u-resetSpectrum .u-baseColor--link.link--darker {color: rgba(0, 0, 0, 0.8) !important;} .u-resetSpectrum .u-baseColor--placeholderNormal ::-webkit-input-placeholder {color: rgba(0, 0, 0, 0.2980392156862745);} .u-resetSpectrum .u-baseColor--placeholderNormal ::-moz-placeholder {color: rgba(0, 0, 0, 0.2980392156862745);} .u-resetSpectrum .u-baseColor--placeholderNormal :-ms-input-placeholder {color: rgba(0, 0, 0, 0.2980392156862745);} .u-resetSpectrum .ui-h1,.u-resetSpectrum .ui-h2,.u-resetSpectrum .ui-h3,.u-resetSpectrum .ui-h4,.u-resetSpectrum .ui-brand1,.u-resetSpectrum .ui-brand2,.u-resetSpectrum .ui-captionStrong {color: rgba(0, 0, 0, 0.8) !important; fill: rgba(0, 0, 0, 0.8) !important;} .u-resetSpectrum .ui-body,.u-resetSpectrum .ui-caps {color: rgba(0, 0, 0, 0.6) !important; fill: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .ui-summary,.u-resetSpectrum .ui-caption {color: rgba(0, 0, 0, 0.2980392156862745) !important; fill: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-accentColor--borderLight {border-color: rgba(26, 137, 23, 1) !important;} .u-resetSpectrum .u-accentColor--borderNormal {border-color: rgba(26, 137, 23, 1) !important;} .u-resetSpectrum .u-accentColor--borderDark {border-color: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--iconLight .svgIcon,.u-resetSpectrum .u-accentColor--iconLight.svgIcon {fill: rgba(26, 137, 23, 1) !important;} .u-resetSpectrum .u-accentColor--iconNormal .svgIcon,.u-resetSpectrum .u-accentColor--iconNormal.svgIcon {fill: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--iconDark .svgIcon,.u-resetSpectrum .u-accentColor--iconDark.svgIcon {fill: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--textNormal {color: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--hoverTextNormal:hover {color: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--textNormal.u-accentColor--textDarken:hover {color: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--textDark {color: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--backgroundLight {background-color: rgba(26, 137, 23, 1) !important;} .u-resetSpectrum .u-accentColor--backgroundNormal {background-color: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--backgroundDark {background-color: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--buttonDark {border-color: rgba(17, 128, 14, 1) !important; color: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--buttonDark:hover {border-color: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--buttonDark .icon:before,.u-resetSpectrum .u-accentColor--buttonDark .svgIcon{color: rgba(15, 115, 12, 1) !important; fill: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--buttonNormal:not(.clapButton--largePill) {border-color: rgba(26, 137, 23, 1) !important; color: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--buttonNormal:hover {border-color: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--buttonNormal .icon:before,.u-resetSpectrum .u-accentColor--buttonNormal .svgIcon{color: rgba(17, 128, 14, 1) !important; fill: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--buttonNormal.button--filled .icon:before,.u-resetSpectrum .u-accentColor--buttonNormal.button--filled .svgIcon{color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-resetSpectrum .u-accentColor--buttonDark.button--filled,.u-resetSpectrum .u-accentColor--buttonDark.button--withChrome.is-active,.u-resetSpectrum .u-accentColor--fillWhenActive.is-active {background-color: rgba(15, 115, 12, 1) !important; border-color: rgba(15, 115, 12, 1) !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-resetSpectrum .u-accentColor--buttonNormal.button--filled:not(.clapButton--largePill),.u-resetSpectrum .u-accentColor--buttonNormal.button--withChrome.is-active:not(.clapButton--largePill) {background-color: rgba(17, 128, 14, 1) !important; border-color: rgba(17, 128, 14, 1) !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-resetSpectrum .postArticle.is-withAccentColors .markup--user,.u-resetSpectrum .postArticle.is-withAccentColors .markup--query {color: rgba(17, 128, 14, 1) !important;}</style><div class="js-collectionFooter u-tintBgColor u-hide"><div class="container u-maxWidth1040"><div class="u-marginTop10 u-paddingTop10 u-paddingBottom30 u-tintSpectrum"><div class="linkSet u-clearfix"><div class="u-floatRight u-textColorNormal u-baseColor--textNormal u-xs-floatLeft"><a class="button button--chromeless u-baseColor--buttonNormal u-marginLeft15 u-lineHeight35 u-xs-block u-xs-marginLeft0" href="https://medium.com/flutter/about" title="About Flutter" aria-label="About Flutter">About Flutter</a><span class="middotDivider u-xs-hide"></span><a class="button button--chromeless u-baseColor--buttonNormal u-lineHeight35 u-xs-block" href="https://medium.com/flutter/latest" title="Latest Stories for Flutter" aria-label="Latest Stories for Flutter">Latest Stories</a><span class="middotDivider u-xs-hide"></span><a class="button button--chromeless u-baseColor--buttonNormal u-lineHeight35 u-xs-block" href="https://medium.com/flutter/archive" title="Archive for Flutter" aria-label="Archive for Flutter">Archive</a><span class="middotDivider u-xs-hide"></span><a class="button button--chromeless u-baseColor--buttonNormal u-lineHeight35 u-xs-block" href="https://medium.com/about">About Medium</a><span class="middotDivider u-xs-hide"></span><a class="button button--chromeless u-baseColor--buttonNormal u-lineHeight35 u-xs-block" href="https://policy.medium.com/medium-terms-of-service-9db0094a1e0f">Terms</a><span class="middotDivider u-xs-hide"></span><a class="button button--chromeless u-baseColor--buttonNormal u-lineHeight35 u-xs-block" href="https://policy.medium.com/medium-privacy-policy-f03bf92035c9">Privacy</a><span class="middotDivider u-xs-hide"></span><a class="button button--chromeless u-baseColor--buttonNormal u-lineHeight35 u-xs-block" href="https://medium.com/business">Teams</a></div></div></div></div></div></div></div></div><div class="loadingBar"></div><script>// <![CDATA[ window["obvInit"] = function (opt_embedded) {window["obvInit"]["embedded"] = opt_embedded; window["obvInit"]["ready"] = true;} // ]]></script><script>// <![CDATA[ var GLOBALS = {"audioUrl":"https://d1fcbxp97j4nb2.cloudfront.net","baseUrl":"https://medium.com","buildLabel":"20241126-1740-root","currentUser":{"userId":"lo_febd3d2b490f","isVerified":false,"subscriberEmail":"","hasPastMemberships":false,"isEnrolledInHightower":false,"isEligibleForHightower":true,"hightowerLastLockedAt":0,"isWriterProgramEnrolled":true,"isWriterProgramInvited":false,"isWriterProgramOptedOut":false,"writerProgramVersion":0,"writerProgramEnrolledAt":0,"friendLinkOnboarding":0,"hasAdditionalUnlocks":false,"hasApiAccess":false,"writerProgramDistributionSettingOptedIn":false,"isSuspended":false,"collectionOnboardingSeen":0,"atsQualifiedAt":0},"currentUserHasUnverifiedEmail":false,"isAuthenticated":false,"isCurrentUserVerified":false,"miroUrl":"https://cdn-images-1.medium.com","moduleUrls":{"base":"https://cdn-static-1.medium.com/_/fp/gen-js/main-base.bundle.95z8xpkUEidhPbIWsh2BVw.12.js","common-async":"https://cdn-static-1.medium.com/_/fp/gen-js/main-common-async.bundle.zqOu8dxaQRtqDyChHdOWlQ.12.js","hightower":"https://cdn-static-1.medium.com/_/fp/gen-js/main-hightower.bundle.y0UkxCxPBUbLlduk5XbwLQ.12.js","home-screens":"https://cdn-static-1.medium.com/_/fp/gen-js/main-home-screens.bundle.eZhPgaD8AglnbC5Rzxqvhg.12.js","misc-screens":"https://cdn-static-1.medium.com/_/fp/gen-js/main-misc-screens.bundle.XeRjm4FlHTBOsUvoOQ6Ppg.12.js","notes":"https://cdn-static-1.medium.com/_/fp/gen-js/main-notes.bundle.r9MSvtAmj0CMkyIC0CCCbA.12.js","payments":"https://cdn-static-1.medium.com/_/fp/gen-js/main-payments.bundle.AiXyuYj3AvxRA1-7HEyP9Q.12.js","posters":"https://cdn-static-1.medium.com/_/fp/gen-js/main-posters.bundle.fsLyLvZO4VZXL_zb4RXgeg.12.js","power-readers":"https://cdn-static-1.medium.com/_/fp/gen-js/main-power-readers.bundle.6Dyc-nVN2MDV_AM9XDAZug.12.js","pubs":"https://cdn-static-1.medium.com/_/fp/gen-js/main-pubs.bundle.rUyrVjlTpUj61voxnZosQw.12.js","stats":"https://cdn-static-1.medium.com/_/fp/gen-js/main-stats.bundle.2I2tXSo7-rbez_WYXfga0Q.12.js"},"previewConfig":{"weightThreshold":1,"weightImageParagraph":0.51,"weightIframeParagraph":0.8,"weightTextParagraph":0.08,"weightEmptyParagraph":0,"weightP":0.003,"weightH":0.005,"weightBq":0.003,"minPTextLength":60,"truncateBoundaryChars":20,"detectTitle":true,"detectTitleLevThreshold":0.15},"productName":"Medium","supportsEdit":false,"termsUrl":"//policy.medium.com/medium-terms-of-service-9db0094a1e0f","textshotHost":"textshot.textshot-production.svc.cluster.local","transactionId":"1732988812757:ab8d68d58b2b","useragent":{"browser":"ie","family":"ie","os":"windows","version":7,"supportsDesktopEdit":false,"supportsInteract":false,"supportsView":true,"isMobile":false,"isTablet":false,"isNative":false,"supportsFileAPI":false,"isTier1":false,"clientVersion":"","clientChannel":"","supportsRealScrollEvents":false,"supportsVhUnits":false,"ruinsViewportSections":false,"supportsHtml5Video":false,"supportsMagicUnderlines":false,"isWebView":false,"isFacebookWebView":false,"supportsProgressiveMedia":false,"supportsPromotedPosts":true,"isBot":false,"isNativeIphone":false,"supportsCssVariables":false,"supportsVideoSections":true,"emojiSupportLevel":1,"isSearchBot":false,"isSyndicationBot":false,"isNativeAndroid":false,"isNativeIos":false,"isSeoAuditBot":false,"isInternalApp":false,"supportsApplePay":false,"supportsScrollableMetabar":false},"variants":{"allow_access":true,"allow_signup":true,"allow_test_auth":"disallow","android_enable_editor_new_publishing_flow":true,"android_enable_friend_links_creation":true,"android_enable_friend_links_postpage_banners":true,"android_enable_image_sharer":true,"android_enable_lists_v2":true,"android_enable_syntax_highlight":true,"android_enable_topic_portals":true,"android_rating_prompt_stories_read_threshold":2,"android_two_hour_refresh":true,"available_annual_plan":"2c754bcc2995","available_annual_premium_plan":"4a442ace1476","available_monthly_plan":"60e220181034","available_monthly_premium_plan":"12a660186432","browsable_stream_config_bucket":"curated-topics","can_receive_tips_v0":true,"can_send_tips_v0":true,"coronavirus_topic_recirc":true,"disable_partner_program_enrollment":true,"enable_abandoned_cart_promotion_email":true,"enable_android_dynamic_aspirational_paywall":true,"enable_android_dynamic_programming_paywall":true,"enable_android_miro_v2":true,"enable_android_offline_reading":true,"enable_android_verified_author":true,"enable_app_flirty_thirty":true,"enable_apple_sign_in":true,"enable_apple_webhook":true,"enable_aurora_pub_follower_page":true,"enable_author_cards":true,"enable_author_cards_byline":true,"enable_auto_follow_on_subscribe":true,"enable_automod":true,"enable_bayesian_average_pub_search":true,"enable_bg_post_post":true,"enable_billing_frequency_on_step2":"group_1","enable_boost_nia_v01":true,"enable_braintree_apple_pay":true,"enable_braintree_client":true,"enable_braintree_google_pay":true,"enable_braintree_integration":true,"enable_braintree_paypal":true,"enable_braintree_trial_membership":true,"enable_braintree_webhook":true,"enable_branch_io":true,"enable_cache_less_following_feed":true,"enable_configure_pronouns":true,"enable_conversion_model_v2":"group_2","enable_conversion_ranker_v2":"control","enable_creator_welcome_email":true,"enable_deprecate_legacy_providers_v3":true,"enable_diversification_rex":true,"enable_entities_to_follow_v2":true,"enable_eventstats_event_processing":true,"enable_explicit_signals":true,"enable_explicit_signals_updated_post_previews":true,"enable_footer_app_buttons":true,"enable_google_one_tap":true,"enable_google_webhook":true,"enable_group_gifting":true,"enable_iceland_forced_android":true,"enable_import":true,"enable_intrinsic_automatic_actions":true,"enable_ios_autorefresh":true,"enable_ios_dynamic_paywall_aspiriational":true,"enable_ios_dynamic_paywall_programming":true,"enable_ios_easy_resubscribe":true,"enable_ios_offline_reading":true,"enable_legacy_feed_in_iceland":true,"enable_lite_archive_page":true,"enable_lite_continue_this_thread":true,"enable_lite_homepage":true,"enable_lite_response_markup":true,"enable_lite_server_upstream_deadlines":true,"enable_lo_homepage":"control","enable_maim_the_meter":true,"enable_marketing_emails":true,"enable_mastodon_avatar_upload":true,"enable_mastodon_for_members":true,"enable_mastodon_for_members_username_selection":true,"enable_medium2_kbfd":true,"enable_members_only_audio":true,"enable_ml_rank_rex_anno":true,"enable_moc_load_processor_all_recs_surfaces":true,"enable_moc_load_processor_c":true,"enable_moc_load_processor_first_story":true,"enable_new_manage_membership_flow":true,"enable_new_stripe_customers":true,"enable_newsletter_lo_flow_custom_domains":true,"enable_pill_based_home_feed":true,"enable_pp_country_expansion":true,"enable_pp_v4":true,"enable_pre_pp_v4":true,"enable_premium_tier":true,"enable_premium_tier_badge":true,"enable_publication_hierarchy_web":true,"enable_ranker_v10":"control","enable_recaptcha_enterprise":true,"enable_recirc_model":true,"enable_recommended_publishers_query":true,"enable_rex_aggregator_v2":true,"enable_rex_new_push_notification_endpoint":true,"enable_rex_reading_history":true,"enable_rito_upstream_deadlines":true,"enable_seamless_social_sharing":true,"enable_see_pronouns":true,"enable_sharer_create_post_share_key":true,"enable_sharer_validate_post_share_key":true,"enable_simplified_digest_v2_b":true,"enable_speechify_ios":true,"enable_speechify_widget":true,"enable_sprig":true,"enable_starspace":true,"enable_susi_redesign_android":true,"enable_susi_redesign_ios":true,"enable_switch_plan_premium_tier":true,"enable_tag_recs":true,"enable_tick_landing_page":true,"enable_tipping_v0_android":true,"enable_tipping_v0_ios":true,"enable_tribute_landing_page":true,"enable_update_explore_wtf":true,"enable_update_topic_portals_wtf":true,"enable_updated_pub_recs_ui":true,"enable_verifications_service":true,"glyph_font_set":"m2-unbound-source-serif-pro","goliath_externalsearch_enable_comment_deindexation":true,"ios_display_paywall_after_onboarding":true,"ios_enable_friend_links_creation":true,"ios_enable_friend_links_postpage_banners":true,"ios_enable_home_post_menu":true,"ios_enable_lock_responses":true,"ios_enable_verified_book_author":true,"ios_iceland_nux":true,"ios_in_app_free_trial":true,"ios_remove_twitter_onboarding_step":true,"ios_social_share_sheet":true,"limit_post_referrers":true,"limit_user_follows":true,"mobile_custom_app_icon":true,"num_post_bottom_responses_to_show":1,"onboarding_tags_from_top_views":true,"reader_fair_distribution_non_qp":true,"redefined_top_posts":true,"reengagement_notification_duration":3,"rex_generator_max_candidates":1000,"signin_services":"twitter,facebook,google,email,google-fastidv,google-one-tap,apple","signup_services":"twitter,facebook,google,email,google-fastidv,google-one-tap,apple","skip_fs_cache_user_vals":true},"xsrfToken":"","iosAppId":"828256236","supportEmail":"yourfriends@medium.com","fp":{"/icons/monogram-mask.svg":"https://cdn-static-1.medium.com/_/fp/icons/monogram-mask.KPLCSFEZviQN0jQ7veN2RQ.12.svg","/icons/favicon-medium-editor.ico":"https://cdn-static-1.medium.com/_/fp/icons/favicon-medium-editor.PiakrZWB7Yb80quUVQWM6g.12.ico"},"authBaseUrl":"https://medium.com","imageUploadSizeMb":25,"isAuthDomainRequest":true,"algoliaApiEndpoint":"https://MQ57UUUQZ2-dsn.algolia.net","algoliaAppId":"MQ57UUUQZ2","algoliaSearchOnlyApiKey":"394474ced050e3911ae2249ecc774921","iosAppStoreUrl":"https://itunes.apple.com/app/medium-everyones-stories/id828256236?pt=698524&mt=8","iosAppLinkBaseUrl":"medium:","algoliaIndexPrefix":"medium_","androidPlayStoreUrl":"https://play.google.com/store/apps/details?id=com.medium.reader","googleClientId":"216296035834-k1k6qe060s2tp2a2jam4ljdcms00sttg.apps.googleusercontent.com","androidPackage":"com.medium.reader","androidPlayStoreMarketScheme":"market://details?id=com.medium.reader","googleAuthUri":"https://accounts.google.com/o/oauth2/auth","androidScheme":"medium","layoutData":{"useDynamicScripts":false,"googleAnalyticsTrackingCode":"G-7JY7T788PK","jsShivUrl":"https://cdn-static-1.medium.com/_/fp/js/shiv.RI2ePTZ5gFmMgLzG5bEVAA.12.js","useDynamicCss":false,"faviconUrl":"https://miro.medium.com/v2/5d8de952517e8160e40ef9841c781cdc14a5db313057fa3c3de41c6f5b494b19","faviconImageId":"5d8de952517e8160e40ef9841c781cdc14a5db313057fa3c3de41c6f5b494b19","fontSets":[{"id":8,"url":"https://glyph.medium.com/css/e/sr/latin/e/ssr/latin/e/ssb/latin/m2-unbound-source-serif-pro.css"},{"id":11,"url":"https://glyph.medium.com/css/m2-unbound-source-serif-pro.css"},{"id":9,"url":"https://glyph.medium.com/css/mkt.css"}],"glyphUrl":"https://glyph.medium.com"},"authBaseUrlRev":"moc.muidem//:sptth","stripePublishableKey":"pk_live_7FReX44VnNIInZwrIIx6ghjl","archiveUploadSizeMb":100,"previewConfig2":{"weightThreshold":1,"weightImageParagraph":0.05,"raiseImage":true,"enforceHeaderHierarchy":true,"isImageInsetRight":true},"isAmp":false,"iosScheme":"medium","facebook":{"key":"542599432471018","namespace":"medium-com","scope":{"default":["public_profile","email"],"connect":["public_profile","email"],"login":["public_profile","email"],"share":["public_profile","email"]}},"memberContentTopicId":"13d7efd82fb2","audioContentTopicId":"3792abbd134","isDoNotAuth":false,"buggle":{"videoUrl":"https://cdn-videos-1.medium.com","audioUrl":"https://cdn-audio-1.medium.com"},"referrerType":5,"partnerProgramEmail":"partnerprogram@medium.com","recaptchaKey":"6Lfc37IUAAAAAKGGtC6rLS13R1Hrw_BqADfS1LRk","countryCode":"SG","bypassMeter":false,"branchKey":"key_live_ofxXr2qTrrU9NqURK8ZwEhknBxiI6KBm","paypal":{"clientMode":"production","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/redeem.","price":"50.00","currency":"USD","sku":"membership-gift-1-yr"}},"collectionConfig":{"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"]},"bypassMeterWithShareKey":false,"recaptcha3Key":"6Lf8R9wUAAAAABMI_85Wb8melS7Zj6ziuf99Yot5","braintreeClientKey":"production_zjkj96jm_m56f8fqpf7ngnrd4","cdcMessaging":[{"text":"For more information on the novel coronavirus and Covid-19, visit ","href":"","type":"text","start":0,"end":0},{"text":"cdc.gov","href":"https://www.cdc.gov/coronavirus/2019-nCoV","type":"link","start":66,"end":73},{"text":".","href":"","type":"text","start":0,"end":0}],"braintree":{"merchantId":"m56f8fqpf7ngnrd4"},"diagnostics":{},"domain":"medium.com"} // ]]></script><script charset="UTF-8" src="https://cdn-static-1.medium.com/_/fp/gen-js/main-base.bundle.95z8xpkUEidhPbIWsh2BVw.12.js" async></script><script>// <![CDATA[ window["obvInit"]({"references":{"Collection":{"4da7dfd21a33":{"id":"4da7dfd21a33","name":"Flutter","slug":"flutter","tags":["MOBILE APP DEVELOPMENT","FLUTTER","GOOGLE","IOS APP DEVELOPMENT","ANDROID APP DEVELOPMENT"],"creatorId":"2df4e577749c","description":"Flutter is Google's UI framework for crafting high-quality native interfaces on iOS, Android, web, and desktop. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source. Learn more at https://flutter.dev","shortDescription":"Flutter is Google's UI framework for crafting high-quality…","image":{"imageId":"1*5-aoK8IBmXve5whBQM90GA.png","filter":"","backgroundSize":"","originalWidth":1000,"originalHeight":1000,"strategy":"resample","height":0,"width":0},"metadata":{"followerCount":57039,"activeAt":1732210323729},"virtuals":{"permissions":{"canPublish":false,"canPublishAll":false,"canRepublish":false,"canRemove":false,"canManageAll":false,"canSubmit":false,"canEditPosts":false,"canAddWriters":false,"canViewStats":false,"canSendNewsletter":false,"canViewLockedPosts":false,"canViewCloaked":false,"canEditOwnPosts":false,"canBeAssignedAuthor":false,"canEnrollInHightower":false,"canLockPostsForMediumMembers":false,"canLockOwnPostsForMediumMembers":false,"canViewNewsletterV2Stats":false,"canCreateNewsletterV3":false},"isSubscribed":false,"isEnrolledInHightower":false,"isEligibleForHightower":false,"isSubscribedToCollectionEmails":false,"isMuted":false,"canToggleEmail":false,"isWriter":false},"logo":{"imageId":"1*KvnfbD1F5CzEsU9wSmRZyA.png","filter":"","backgroundSize":"","originalWidth":538,"originalHeight":141,"strategy":"resample","height":0,"width":0},"twitterUsername":"flutterdev","collectionMastheadId":"6f4efe3cee51","sections":[{"type":2,"collectionHeaderMetadata":{"title":"Flutter","description":"Build beautiful native apps in record time","backgroundImage":{},"logoImage":{"id":"1*XrbUBnZb-Vp9jRDGqU-BXQ@2x.png","originalWidth":2000,"originalHeight":2109,"alt":"Flutter"},"alignment":2,"layout":5}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":["204b7d20c45d"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":9,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":5,"number":15,"postIds":[]}}],"tintColor":"#FF01579B","lightText":true,"favicon":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"colorPalette":{"defaultBackgroundSpectrum":{"colorPoints":[{"color":"#FF498BD1","point":0},{"color":"#FF4781C0","point":0.1},{"color":"#FF4477AF","point":0.2},{"color":"#FF416D9E","point":0.3},{"color":"#FF3D638D","point":0.4},{"color":"#FF38587C","point":0.5},{"color":"#FF324D6B","point":0.6},{"color":"#FF2C415A","point":0.7},{"color":"#FF253548","point":0.8},{"color":"#FF1C2937","point":0.9},{"color":"#FF121B25","point":1}],"backgroundColor":"#FFFFFFFF"},"tintBackgroundSpectrum":{"colorPoints":[{"color":"#FF01579B","point":0},{"color":"#FF306CA9","point":0.1},{"color":"#FF4D7FB7","point":0.2},{"color":"#FF6591C4","point":0.3},{"color":"#FF7CA3D0","point":0.4},{"color":"#FF92B4DC","point":0.5},{"color":"#FFA7C4E7","point":0.6},{"color":"#FFBCD3F1","point":0.7},{"color":"#FFD0E3FC","point":0.8},{"color":"#FFE3F2FF","point":0.9},{"color":"#FFF7FFFF","point":1}],"backgroundColor":"#FF01579B"},"highlightSpectrum":{"colorPoints":[{"color":"#FFE8F5FF","point":0},{"color":"#FFE3F3FF","point":0.1},{"color":"#FFDEF2FF","point":0.2},{"color":"#FFDAF0FF","point":0.3},{"color":"#FFD5EFFF","point":0.4},{"color":"#FFD0EDFF","point":0.5},{"color":"#FFCBECFF","point":0.6},{"color":"#FFC6EBFF","point":0.7},{"color":"#FFC1E9FF","point":0.8},{"color":"#FFBCE8FF","point":0.9},{"color":"#FFB6E6FF","point":1}],"backgroundColor":"#FFFFFFFF"},"darkBackgroundSpectrum":{"colorPoints":[{"color":"#FF63A4EB","point":0},{"color":"#FF72ACED","point":0.1},{"color":"#FF81B4EF","point":0.2},{"color":"#FF8FBCF1","point":0.3},{"color":"#FF9CC4F3","point":0.4},{"color":"#FFA9CBF5","point":0.5},{"color":"#FFB6D3F6","point":0.6},{"color":"#FFC2DAF8","point":0.7},{"color":"#FFCFE2FA","point":0.8},{"color":"#FFDAE9FC","point":0.9},{"color":"#FFE6F0FE","point":1}],"backgroundColor":"#FF000000"}},"navItems":[{"type":1,"title":"Announcements","tagSlug":"announcements","url":"https://medium.com/flutter/tagged/announcements","source":"tagSlug"},{"type":1,"title":"Performance","tagSlug":"performance","url":"https://medium.com/flutter/tagged/performance","source":"tagSlug"},{"type":1,"title":"Material Design","tagSlug":"material-design","url":"https://medium.com/flutter/tagged/material-design","source":"tagSlug"},{"type":1,"title":"Web Development","tagSlug":"web-development","url":"https://medium.com/flutter/tagged/web-development","source":"tagSlug"},{"type":3,"title":"flutter.dev","url":"https://flutter.dev/"}],"colorBehavior":2,"collectionFeatures":[25],"ampLogo":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"header":{"title":"Flutter","description":"Build beautiful native apps in record time","backgroundImage":{},"logoImage":{"id":"1*XrbUBnZb-Vp9jRDGqU-BXQ@2x.png","originalWidth":2000,"originalHeight":2109,"alt":"Flutter"},"alignment":2,"layout":5},"subscriberCount":57039,"tagline":"Flutter is an open source UI framework for crafting beautiful apps","isOptedIntoAurora":false,"isCurationAllowedByDefault":false,"polarisCoverImage":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"ptsQualifiedAt":1616092847310,"type":"Collection"}},"User":{"a6d788faa5e5":{"userId":"a6d788faa5e5","name":"Michael Thomsen","username":"mit.mit","createdAt":1481367237471,"imageId":"0*Y_CFLc1qadgr3tPK.","backgroundImageId":"","bio":"Product Manager working on Dart and Flutter. Helping developers is my passion!","twitterScreenName":"","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"userDismissableFlags":[32,12,8,5,21,30,2,18,1,17,33],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-dk","type":"User"},"3a7a2a067927":{"userId":"3a7a2a067927","name":"Todd Volkert","username":"tvolkert","createdAt":1474355432054,"imageId":"0*EUSBYlBzvqL9j_Xr.","backgroundImageId":"","bio":"","twitterScreenName":"","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"userDismissableFlags":[2,33],"hasSeenIcelandOnboarding":false,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"9a1282e0b0ee":{"userId":"9a1282e0b0ee","name":"Brandon DeRosier","username":"algebrandon","createdAt":1514685898951,"imageId":"0*Jzj4ct7CmcvOiR3g.","backgroundImageId":"","bio":"https://twitter.com/algebrandon https://github.com/bdero","twitterScreenName":"","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"userDismissableFlags":[29],"hasSeenIcelandOnboarding":false,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"7cb43f46877f":{"userId":"7cb43f46877f","name":"Kevin Chisholm","username":"kevinchisholm","createdAt":1446894415039,"imageId":"1*HEfsynQuQpVrGR-qdGeSvg.jpeg","backgroundImageId":"","bio":"Kevin Chisholm is a Technical Program Manager for Dart and Flutter at Google.","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"optInToIceland":true,"hasCompletedProfile":false,"userDismissableFlags":[8,32,29,30,2],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"7781c543301e":{"userId":"7781c543301e","name":"Very Good Ventures Team","username":"vgv_team","createdAt":1618866775404,"imageId":"1*XUX_mTFnhm4BKyT9q9sOUQ.png","backgroundImageId":"","bio":"Team at Very Good Ventures (https://verygood.ventures), a leading Flutter app development consultancy.","twitterScreenName":"VGVentures","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"userDismissableFlags":[32,29,12,8,3,2,18,1,33],"hasSeenIcelandOnboarding":false,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"aa31f520c7ec":{"userId":"aa31f520c7ec","name":"Kelvin Boateng","username":"kkboateng","createdAt":1633039287566,"imageId":"0*IxpUINuAJhraX2My","backgroundImageId":"","bio":"","twitterScreenName":"","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"userDismissableFlags":[32,46,29,8,21,2,18,1,33],"hasSeenIcelandOnboarding":false,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"7014d6220229":{"userId":"7014d6220229","name":"Craig Labenz","username":"craiglabenz_78472","createdAt":1569429030605,"imageId":"1*xu-sgiT2AZrrzBVu1oYnoQ.jpeg","backgroundImageId":"","bio":"Developer Relations Engineer on the Flutter team @ Google","twitterScreenName":"","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"userDismissableFlags":[8,32,12,2],"hasSeenIcelandOnboarding":false,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"}},"Post":{"204b7d20c45d":{"id":"204b7d20c45d","versionId":"95b0e9421e30","creatorId":"a6d788faa5e5","homeCollectionId":"4da7dfd21a33","title":"Announcing Flutter 3.24 and Dart 3.5","detectedLanguage":"en","latestVersion":"95b0e9421e30","latestPublishedVersion":"95b0e9421e30","hasUnpublishedEdits":false,"latestRev":170,"createdAt":1722855151379,"updatedAt":1731992317130,"acceptedAt":0,"firstPublishedAt":1722967229358,"latestPublishedAt":1722967229358,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"An early look at Flutter GPU, web enhancements, and more!","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*jzRGig761LnPlvokq2FaVA.gif","filter":"","backgroundSize":"","originalWidth":1920,"originalHeight":1080,"strategy":"resample","height":0,"width":0},"wordCount":1038,"imageCount":2,"readingTime":4.300314465408805,"subtitle":"An early look at Flutter GPU, web enhancements, and more!","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":255,"isBookmarked":false,"tags":[{"slug":"announcements","name":"Announcements","postCount":17396,"metadata":{"postCount":17396,"coverImage":{"id":"1*3OUXYFxN3YN0774j5fqRjA.jpeg","originalWidth":6720,"originalHeight":4480,"isFeatured":true}},"type":"Tag"},{"slug":"flutter","name":"Flutter","postCount":47247,"metadata":{"postCount":47247,"coverImage":{"id":"1*_Bu89jy8JGFudhgNq7yVWA.jpeg","originalWidth":813,"originalHeight":467}},"type":"Tag"},{"slug":"flutter-app-development","name":"Flutter App Development","postCount":15245,"metadata":{"postCount":15245,"coverImage":{"id":"1*umWe3sUfevF0bex4IBOJzA.png","originalWidth":685,"originalHeight":396}},"type":"Tag"},{"slug":"ios","name":"iOS","postCount":89156,"metadata":{"postCount":89156,"coverImage":{"id":"1*XXnWbhzGW7UKV--TfAyzQg.png","isFeatured":true,"alt":"An image by the author."}},"type":"Tag"},{"slug":"ios-app-development","name":"iOS App Development","postCount":29307,"metadata":{"postCount":29307,"coverImage":{"id":"0*7QOivsGgUBC5yBgG.png","originalWidth":1200,"originalHeight":979,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":8,"links":{"entries":[{"url":"https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aclosed+label%3A%22f%3A+cupertino%22+sort%3Aupdated-desc+closed%3A2024-04-01..2024-07-01+","alts":[],"httpStatus":404},{"url":"http://flutter.dev/showcase/sncf-connect","alts":[],"httpStatus":404},{"url":"https://docs.flutter.dev/packages-and-plugins/swift-package-manager/for-plugin-authors#how-to-add-swift-package-manager-support-to-an-existing-flutter-plugin","alts":[],"httpStatus":200},{"url":"http://flutter.dev/showcase/whirlpool","alts":[],"httpStatus":404},{"url":"http://flutter.dev/showcase/wolt","alts":[],"httpStatus":404},{"url":"http://flutter.dev/showcase/monta","alts":[],"httpStatus":404},{"url":"https://medium.com/p/6c040f87d1e4/edit","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/engine/blob/main/docs/impeller/Flutter-GPU.md","alts":[],"httpStatus":200},{"url":"http://flutter.dev/showcase/xiaomi","alts":[],"httpStatus":404},{"url":"https://io.google/2024/","alts":[],"httpStatus":200},{"url":"https://ioconnectchina.googlecnapps.cn/","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/flutter/issues","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/ui/design/graphics/fragment-shaders","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/perf/impeller","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/platform-integration/web/web-content-in-flutter","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/platform-integration/macos/platform-views","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/ui/widgets/cupertino","alts":[],"httpStatus":200},{"url":"https://medium.com/dartlang/dart-3.5-6ca36259fa2f","alts":[],"httpStatus":200},{"url":"https://medium.com/flutter/getting-started-with-flutter-gpu-f33d497b7c11","alts":[],"httpStatus":200},{"url":"https://medium.com/flutter/io24-5e211f708a37","alts":[{"type":3,"url":"medium://p/5e211f708a37"},{"type":2,"url":"medium://p/5e211f708a37"}],"httpStatus":200},{"url":"https://www.mi.com/global/discover/article?id=3263&ref=renatomitra.com","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1722967231692},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":2074,"sectionCount":1,"readingList":0,"topics":[{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"announcing-flutter-3-24-and-dart-3-5","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"flutter-3-24-dart-3-5-204b7d20c45d","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*jzRGig761LnPlvokq2FaVA.gif","originalWidth":1920,"originalHeight":1080,"isFeatured":true,"alt":"Dash flies in and lands to the left of an outline of 3.24. She presses a button that fills the 3.24 in with Flutter blue."}},{"name":"ec77","type":3,"text":"Announcing Flutter 3.24 and Dart 3.5","markups":[],"alignment":1},{"name":"519f","type":3,"text":"An early look at Flutter GPU, web enhancements, and more!","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"An early look at Flutter GPU, web enhancements, and more!"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"4da7dfd21a33","isNewsletter":false,"newsletterId":"","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":4,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"ec77","type":3,"text":"Announcing Flutter 3.24 and Dart 3.5","markups":[]},{"name":"519f","type":3,"text":"An early look at Flutter GPU, web enhancements, and more!","markups":[]},{"name":"53db","type":1,"text":"Today, we’re unveiling Flutter 3.24 and Dart 3.5 alongside the last stop in the I/O 2024 Connect series, happening in just a few hours in China — one of Flutter’s most prolific communities in the world, making this moment very special.","markups":[{"type":3,"start":23,"end":35,"href":"https://medium.com/p/6c040f87d1e4/edit","title":"","rel":"","anchorType":0},{"type":3,"start":40,"end":48,"href":"https://medium.com/dartlang/dart-3.5-6ca36259fa2f","title":"","rel":"","anchorType":0},{"type":3,"start":72,"end":104,"href":"https://ioconnectchina.googlecnapps.cn/","title":"","rel":"","anchorType":0}]},{"name":"fb31","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*jzRGig761LnPlvokq2FaVA.gif","originalWidth":1920,"originalHeight":1080,"isFeatured":true,"alt":"Dash flies in and lands to the left of an outline of 3.24. She presses a button that fills the 3.24 in with Flutter blue."}},{"name":"6280","type":1,"text":"We kicked off Google I/O in May with an…","markups":[{"type":3,"start":14,"end":24,"href":"https://io.google/2024/","title":"","rel":"","anchorType":0},{"type":3,"start":40,"end":64,"href":"https://medium.com/flutter/io24-5e211f708a37","title":"","rel":"","anchorType":0}]}],"sections":[{"name":"5b88","startIndex":0}]},"isFullContent":false,"subtitle":"An early look at Flutter GPU, web enhancements, and more!"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":false,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"71377810fd26":{"id":"71377810fd26","versionId":"e1c99fbb20c0","creatorId":"3a7a2a067927","homeCollectionId":"4da7dfd21a33","title":"Prospera: using Flutter to bring AI to the frontline of sales","detectedLanguage":"en","latestVersion":"e1c99fbb20c0","latestPublishedVersion":"e1c99fbb20c0","hasUnpublishedEdits":false,"latestRev":46,"createdAt":1731968646742,"updatedAt":1732244351944,"acceptedAt":0,"firstPublishedAt":1732210323271,"latestPublishedAt":1732210323271,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Developers around the world are using Google’s Gemini models to tackle real-world challenges, and one of the most exciting applications…","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*rV1FMqYeyrHsOvtSUIOnOA.png","filter":"","backgroundSize":"","originalWidth":512,"originalHeight":256,"strategy":"resample","height":0,"width":0},"wordCount":486,"imageCount":1,"readingTime":2.0339622641509436,"subtitle":"Developers around the world are using Google’s Gemini models to tackle real-world challenges, and one of the most exciting applications…","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":13,"isBookmarked":false,"tags":[{"slug":"flutter","name":"Flutter","postCount":47247,"metadata":{"postCount":47247,"coverImage":{"id":"1*_Bu89jy8JGFudhgNq7yVWA.jpeg","originalWidth":813,"originalHeight":467}},"type":"Tag"},{"slug":"flutter-app-development","name":"Flutter App Development","postCount":15245,"metadata":{"postCount":15245,"coverImage":{"id":"1*umWe3sUfevF0bex4IBOJzA.png","originalWidth":685,"originalHeight":396}},"type":"Tag"},{"slug":"ai","name":"AI","postCount":432326,"metadata":{"postCount":432326,"coverImage":{"id":"1*2zMHAuEF6FxrdPG23QWuWw.jpeg","originalWidth":4500,"originalHeight":3000,"isFeatured":true}},"type":"Tag"},{"slug":"competition","name":"Competition","postCount":14066,"metadata":{"postCount":14066,"coverImage":{"id":"1*TMerT79P_72JGlDVbQZPBw.jpeg","originalWidth":8943,"originalHeight":6708,"isFeatured":true}},"type":"Tag"},{"slug":"winner","name":"Winner","postCount":1502,"metadata":{"postCount":1502,"coverImage":{"id":"1*UmpTvx6-R5XidUFZmF1vkQ.jpeg","originalWidth":981,"originalHeight":588}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[{"url":"https://pub.dev/packages/ffigen","alts":[],"httpStatus":200},{"url":"http://ai.google.dev/competition","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1732210323963},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":85,"sectionCount":1,"readingList":0,"topics":[{"topicId":"1af65db9c2f8","slug":"artificial-intelligence","createdAt":1487916832419,"deletedAt":0,"image":{"id":"1*A28aHchbaA8zNVXraBq0Ug@2x.jpeg","originalWidth":4866,"originalHeight":3244},"name":"Artificial Intelligence","description":"Born to be bot.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"AI News and Artificial Intelligence Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"prospera-using-flutter-to-bring-ai-to-the-frontline-of-sales","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"prospera-using-flutter-to-bring-ai-to-the-frontline-of-sales-71377810fd26","previewContent":{"bodyModel":{"paragraphs":[{"name":"5ceb","type":3,"text":"Prospera: using Flutter to bring AI to the frontline of sales","markups":[],"alignment":1},{"name":"f48c","type":4,"text":"","markups":[],"layout":9,"metadata":{"id":"1*rV1FMqYeyrHsOvtSUIOnOA.png","originalWidth":512,"originalHeight":256,"alt":"Gemini graphic"}}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Developers around the world are using Google’s Gemini models to tackle real-world challenges, and one of the most exciting applications…"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"4da7dfd21a33","isNewsletter":false,"newsletterId":"","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":4,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"5ceb","type":3,"text":"Prospera: using Flutter to bring AI to the frontline of sales","markups":[]},{"name":"f48c","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*rV1FMqYeyrHsOvtSUIOnOA.png","originalWidth":512,"originalHeight":256,"alt":"Gemini graphic"}},{"name":"49d8","type":1,"text":"Developers around the world are using Google’s Gemini models to tackle real-world challenges, and one of the most exciting applications we’ve seen is in the field of sales. Meet Prospera, winner of both best Flutter app and most Useful app in our recent Gemini API Developer Competition! Created by Leon…","markups":[{"type":3,"start":254,"end":286,"href":"http://ai.google.dev/competition","title":"","rel":"","anchorType":0},{"type":2,"start":203,"end":219},{"type":2,"start":224,"end":239}]}],"sections":[{"name":"8eef","startIndex":0}]},"isFullContent":false,"subtitle":"Developers around the world are using Google’s Gemini models to tackle real-world challenges, and one of the most exciting applications…"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":false,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"f33d497b7c11":{"id":"f33d497b7c11","versionId":"60a0970d9135","creatorId":"9a1282e0b0ee","homeCollectionId":"4da7dfd21a33","title":"Getting started with Flutter GPU","detectedLanguage":"en","latestVersion":"60a0970d9135","latestPublishedVersion":"60a0970d9135","hasUnpublishedEdits":false,"latestRev":1751,"createdAt":1722887659653,"updatedAt":1731990574439,"acceptedAt":0,"firstPublishedAt":1722967359237,"latestPublishedAt":1729537736281,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Build custom renderers and render 3D scenes in Flutter.","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*jfeUgpEP9AgAz94yVxVW1g.gif","filter":"","backgroundSize":"","originalWidth":506,"originalHeight":360,"strategy":"resample","height":0,"width":0},"wordCount":4022,"imageCount":10,"readingTime":16.427358490566036,"subtitle":"Build custom renderers and render 3D scenes in Flutter.","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":174,"isBookmarked":false,"tags":[{"slug":"flutter","name":"Flutter","postCount":47247,"metadata":{"postCount":47247,"coverImage":{"id":"1*_Bu89jy8JGFudhgNq7yVWA.jpeg","originalWidth":813,"originalHeight":467}},"type":"Tag"},{"slug":"graphics-programming","name":"Graphics Programming","postCount":207,"metadata":{"postCount":207,"coverImage":{"id":"1*IlcbGnVFGTzVeFH9_T6kEw.png","originalWidth":1938,"originalHeight":1234}},"type":"Tag"},{"slug":"3d","name":"3d","postCount":13189,"metadata":{"postCount":13189,"coverImage":{"id":"1*ck5m-rKg29FpaNQjmMS4Hg.png","isFeatured":true}},"type":"Tag"},{"slug":"guides-and-tutorials","name":"Guides And Tutorials","postCount":15984,"metadata":{"postCount":15984,"coverImage":{"id":"0*pv-cTgMuAxVugzu0","originalWidth":7146,"originalHeight":7162,"isFeatured":true,"alt":"Photo by USGS on Unsplash","unsplashPhotoId":"hoS3dzgpHzw"}},"type":"Tag"},{"slug":"game-development","name":"Game Development","postCount":55031,"metadata":{"postCount":55031,"coverImage":{"id":"1*x-eNR_oRVtO5c3N_romtsA.jpeg","originalWidth":3840,"originalHeight":2160,"isFeatured":true,"focusPercentX":47,"focusPercentY":26,"alt":"The nameless protagonist of Dynasty Warriors Origins faces a dialog decision that doesn’t impact the story."}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":10,"links":{"entries":[{"url":"#d558","alts":[],"httpStatus":0},{"url":"#6b35","alts":[],"httpStatus":0},{"url":"https://en.wikipedia.org/wiki/GlTF","alts":[],"httpStatus":200},{"url":"https://creativecommons.org/licenses/by-nc/4.0/legalcode","alts":[],"httpStatus":200},{"url":"https://creativecommons.org/licenses/by/4.0/legalcode","alts":[],"httpStatus":200},{"url":"https://pub.dev/packages/flutter_scene","alts":[],"httpStatus":200},{"url":"https://cmake.org/download/","alts":[],"httpStatus":200},{"url":"https://pub.dev/packages/flutter_gpu_shaders","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/flutter/issues/new/choose","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/flutter/labels/flutter-gpu","alts":[],"httpStatus":404},{"url":"https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Assets/main/Models/DamagedHelmet/glTF-Binary/DamagedHelmet.glb","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/engine/blob/main/docs/impeller/Flutter-GPU.md","alts":[],"httpStatus":200},{"url":"https://github.com/KhronosGroup/glTF-Sample-Assets/tree/main/Models/DamagedHelmet","alts":[],"httpStatus":200},{"url":"https://api.flutter.dev/flutter/dart-ui/Canvas/drawImage.html","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/ui/design/graphics/fragment-shaders","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/release/upgrade#other-channels","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/perf/impeller#availability","alts":[],"httpStatus":200},{"url":"https://github.com/bdero/flutter_scene","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1729537737021},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":1367,"sectionCount":3,"readingList":0,"topics":[{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"getting-started-with-flutter-gpu","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"getting-started-with-flutter-gpu-f33d497b7c11","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*jfeUgpEP9AgAz94yVxVW1g.gif","originalWidth":506,"originalHeight":360,"isFeatured":true}},{"name":"1dd2","type":3,"text":"Getting started with Flutter GPU","markups":[],"alignment":1},{"name":"2308","type":13,"text":"Build custom renderers and render 3D scenes in Flutter.","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Build custom renderers and render 3D scenes in Flutter."},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"4da7dfd21a33","isNewsletter":false,"newsletterId":"","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"1dd2","type":3,"text":"Getting started with Flutter GPU","markups":[]},{"name":"2308","type":13,"text":"Build custom renderers and render 3D scenes in Flutter.","markups":[]},{"name":"a6f6","type":1,"text":"The Flutter 3.24 release introduces a new low-level graphics API called Flutter GPU. There is also a 3D rendering library powered by Flutter GPU called Flutter Scene (package: flutter_scene). Both Flutter GPU and Flutter Scene are currently in preview, only available on Flutter’s main channel (due to reliance on experimental…","markups":[{"type":10,"start":176,"end":189},{"type":3,"start":72,"end":83,"href":"https://github.com/flutter/engine/blob/main/docs/impeller/Flutter-GPU.md","title":"","rel":"","anchorType":0},{"type":3,"start":152,"end":165,"href":"https://pub.dev/packages/flutter_scene","title":"","rel":"","anchorType":0},{"type":3,"start":281,"end":293,"href":"https://docs.flutter.dev/release/upgrade#other-channels","title":"","rel":"","anchorType":0},{"type":3,"start":346,"end":368,"href":"https://docs.flutter.dev/perf/impeller#availability","title":"","rel":"","anchorType":0}]}],"sections":[{"name":"3c71","startIndex":0}]},"isFullContent":false,"subtitle":"Build custom renderers and render 3D scenes in Flutter."},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":false,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"6c040f87d1e4":{"id":"6c040f87d1e4","versionId":"58eee6c18580","creatorId":"7cb43f46877f","homeCollectionId":"4da7dfd21a33","title":"What’s new in Flutter 3.24","detectedLanguage":"en","latestVersion":"58eee6c18580","latestPublishedVersion":"58eee6c18580","hasUnpublishedEdits":false,"latestRev":452,"createdAt":1722665869660,"updatedAt":1731991437259,"acceptedAt":0,"firstPublishedAt":1722967206984,"latestPublishedAt":1723055666571,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Unleashing Flutter GPU, Multi-View Embedding, and More","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"0*bdcb6KGonosfPZ6m","filter":"","backgroundSize":"","originalWidth":600,"originalHeight":663,"strategy":"resample","height":0,"width":0},"wordCount":2614,"imageCount":17,"readingTime":11.464150943396225,"subtitle":"Unleashing Flutter GPU, Multi-View Embedding, and More","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":563,"isBookmarked":false,"tags":[{"slug":"announcements","name":"Announcements","postCount":17396,"metadata":{"postCount":17396,"coverImage":{"id":"1*3OUXYFxN3YN0774j5fqRjA.jpeg","originalWidth":6720,"originalHeight":4480,"isFeatured":true}},"type":"Tag"},{"slug":"flutter","name":"Flutter","postCount":47247,"metadata":{"postCount":47247,"coverImage":{"id":"1*_Bu89jy8JGFudhgNq7yVWA.jpeg","originalWidth":813,"originalHeight":467}},"type":"Tag"},{"slug":"flutter-app-development","name":"Flutter App Development","postCount":15245,"metadata":{"postCount":15245,"coverImage":{"id":"1*umWe3sUfevF0bex4IBOJzA.png","originalWidth":685,"originalHeight":396}},"type":"Tag"},{"slug":"release-notes","name":"Release Notes","postCount":4077,"metadata":{"postCount":4077,"coverImage":{"id":"0*GRmRiLBicW8F6WtX.png","originalWidth":700,"originalHeight":245}},"type":"Tag"},{"slug":"flutter-development","name":"Flutter Development","postCount":895,"metadata":{"postCount":895,"coverImage":{"id":"1*NvTX0UpvpJA5ztghqrASMw.png","originalWidth":432,"originalHeight":1422,"isFeatured":true,"alt":"Folder structure of CLEAN architecture"}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":28,"links":{"entries":[{"url":"http://sliverappbar","alts":[],"httpStatus":0},{"url":"https://medium.com/flutter/getting-started-with-flutter-gpu-f33d497b7c11","alts":[{"type":3,"url":"medium://p/f33d497b7c11"},{"type":2,"url":"medium://p/f33d497b7c11"}],"httpStatus":200},{"url":"https://swiftpackageindex.com/","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/flutter/issues/new/choose","alts":[],"httpStatus":200},{"url":"https://rsvp.withgoogle.com/events/flutter-package-ecosystem-summit-usa-2024","alts":[],"httpStatus":200},{"url":"https://m3.material.io/components/carousel/overview","alts":[],"httpStatus":200},{"url":"https://m3.material.io/components/carousel/specs#477de3a1-c9df-4742-baf3-bcd5eeb3764c","alts":[],"httpStatus":200},{"url":"https://pub.dev/packages/two_dimensional_scrollables","alts":[],"httpStatus":200},{"url":"https://pub.dev/packages/interactive_media_ads/example","alts":[],"httpStatus":200},{"url":"https://pub.dev/packages/shared_preferences","alts":[],"httpStatus":200},{"url":"https://pub.dev/documentation/two_dimensional_scrollables/latest/two_dimensional_scrollables/TableView-class.html","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+interactive_media_ads%22","alts":[],"httpStatus":404},{"url":"https://pub.dev/documentation/two_dimensional_scrollables/latest/two_dimensional_scrollables/TreeView-class.html","alts":[],"httpStatus":200},{"url":"https://pub.dev/packages/interactive_media_ads","alts":[],"httpStatus":200},{"url":"https://github.com/nate-thegrate","alts":[],"httpStatus":200},{"url":"https://pub.dev/packages/google_mobile_ads","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/platform-integration/web/renderers","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/release/breaking-changes","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/packages-and-plugins/swift-package-manager/for-plugin-authors#how-to-add-swift-package-manager-support-to-an-existing-flutter-plugin","alts":[],"httpStatus":200},{"url":"https://api.flutter.dev/flutter/material/SelectionArea-class.html","alts":[],"httpStatus":200},{"url":"http://api.flutter.dev/flutter/widgets/PinnedHeaderSliver-class.html","alts":[],"httpStatus":200},{"url":"https://api.flutter.dev/flutter/cupertino/CupertinoActionSheet-class.html","alts":[],"httpStatus":200},{"url":"https://api.flutter.dev/flutter/cupertino/CupertinoButton-class.html","alts":[],"httpStatus":200},{"url":"https://api.flutter.dev/flutter/animation/CurvedAnimation-class.html","alts":[],"httpStatus":200},{"url":"https://api.flutter.dev/flutter/widgets/TreeSliver-class.html","alts":[],"httpStatus":200},{"url":"https://api.flutter.dev/flutter/animation/Animation-class.html","alts":[],"httpStatus":200},{"url":"https://api.flutter.dev/flutter/widgets/SelectableRegion-class.html","alts":[],"httpStatus":200},{"url":"http://api.flutter.dev/flutter/widgets/SliverResizingHeader-class.html","alts":[],"httpStatus":200},{"url":"https://api.flutter.dev/flutter/animation/AnimationStatus.html","alts":[],"httpStatus":200},{"url":"https://api.flutter.dev/flutter/widgets/SliverPersistentHeader-class.html","alts":[],"httpStatus":200},{"url":"https://api.flutter.dev/flutter/animation/AnimationController-class.html","alts":[],"httpStatus":200},{"url":"https://api.flutter.dev/flutter/cupertino/CupertinoTextField-class.html","alts":[],"httpStatus":200},{"url":"https://api.flutter.dev/flutter/animation/AnimationController/toggle.html","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/tests/blob/master/README.md","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/release/breaking-changes/popscope-with-result","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/flutter/wiki/Tree-hygiene#handling-breaking-changes","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/packages/tree/main/packages/interactive_media_ads","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/platform-integration/web/embedding-flutter-web","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/release/release-notes/release-notes-3.24.0","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/release/breaking-changes/navigator-and-page-api","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/tools/devtools/release-notes/release-notes-2.35.0","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/tools/devtools/extensions","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/tools/devtools/release-notes/release-notes-2.36.0","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/tools/devtools/release-notes/release-notes-2.37.2","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/flutter/blob/main/CHANGELOG.md","alts":[],"httpStatus":200},{"url":"https://docs.google.com/document/d/e/2PACX-1vRFLdpIJYO5YPARcyUT1FYPzwkFb1hxh_agqnCXxsyirXocLZS5jobs3xFV5ZGpSQHLHZiBzqbJlXNV/pub","alts":[],"httpStatus":200},{"url":"https://iabtechlab.com/standards/vast/","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/flutter/issues/138798","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/flutter/pull/148272","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/flutter/pull/148523","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/flutter/issues/146499#issuecomment-2082873125","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/flutter/pull/147801","alts":[],"httpStatus":200},{"url":"https://flutterconusa.dev/","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/engine/pull/53042","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1723055667990},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":3813,"sectionCount":1,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"},{"topicId":"ab3d8f7f8eb1","slug":"ios-development","createdAt":1521651850182,"deletedAt":0,"image":{"id":"1*g_B4JNulmfXSj0AyEjImyA@2x.jpeg","originalWidth":5184,"originalHeight":3456},"name":"iOS Dev","description":"Appy talk.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"iOS App Development: Articles and News — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"whats-new-in-flutter-3-24","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"whats-new-in-flutter-3-24-6c040f87d1e4","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"0*bdcb6KGonosfPZ6m","originalWidth":600,"originalHeight":663,"isFeatured":true}},{"name":"fb28","type":3,"text":"What’s new in Flutter 3.24","markups":[],"alignment":1},{"name":"11cf","type":13,"text":"Unleashing Flutter GPU, Multi-View Embedding, and More","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Unleashing Flutter GPU, Multi-View Embedding, and More"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"4da7dfd21a33","isNewsletter":false,"newsletterId":"","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":1,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"fb28","type":3,"text":"What’s new in Flutter 3.24","markups":[]},{"name":"11cf","type":13,"text":"Unleashing Flutter GPU, Multi-View Embedding, and More","markups":[]},{"name":"f655","type":4,"text":"Flutter 3.24 on a blue background","markups":[],"layout":1,"metadata":{"id":"1*EA-cAY6uwkYqYb725vnCIw.png","originalWidth":1920,"originalHeight":1080}},{"name":"50f9","type":1,"text":"Welcome to the latest Flutter update! Flutter 3.24 is packed with exciting new features and enhancements to elevate your app development experience. This release highlights the preview of Flutter GPU, which enables advanced graphics and 3D scenes directly in Flutter. Web apps can now…","markups":[]}],"sections":[{"name":"5a74","startIndex":0}]},"isFullContent":false,"subtitle":"Unleashing Flutter GPU, Multi-View Embedding, and More"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":false,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"2210e39b04b9":{"id":"2210e39b04b9","versionId":"48e15ccd2cce","creatorId":"7781c543301e","homeCollectionId":"4da7dfd21a33","title":"How we built it: Creating the I/O Crossword puzzle, powered by AI","detectedLanguage":"en","latestVersion":"48e15ccd2cce","latestPublishedVersion":"48e15ccd2cce","hasUnpublishedEdits":false,"latestRev":166,"createdAt":1719261457227,"updatedAt":1732265415206,"acceptedAt":0,"firstPublishedAt":1719421299029,"latestPublishedAt":1719421299029,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Adding a fun, helpful twist to a classic word game with Flutter, Firebase Genkit, and the Gemini API","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"0*4ylubp836_tc4Nni","filter":"","backgroundSize":"","originalWidth":1600,"originalHeight":900,"strategy":"resample","height":0,"width":0},"wordCount":1049,"imageCount":9,"readingTime":5.158490566037735,"subtitle":"Adding a fun, helpful twist to a classic word game with Flutter, Firebase Genkit, and the Gemini API","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":31,"isBookmarked":false,"tags":[{"slug":"flutter","name":"Flutter","postCount":47247,"metadata":{"postCount":47247,"coverImage":{"id":"1*_Bu89jy8JGFudhgNq7yVWA.jpeg","originalWidth":813,"originalHeight":467}},"type":"Tag"},{"slug":"flutter-app-development","name":"Flutter App Development","postCount":15245,"metadata":{"postCount":15245,"coverImage":{"id":"1*umWe3sUfevF0bex4IBOJzA.png","originalWidth":685,"originalHeight":396}},"type":"Tag"},{"slug":"flutter-game-development","name":"Flutter Game Development","postCount":18,"metadata":{"postCount":18,"coverImage":{"id":"0*4ylubp836_tc4Nni","originalWidth":1600,"originalHeight":900,"isFeatured":true}},"type":"Tag"},{"slug":"game-development","name":"Game Development","postCount":55031,"metadata":{"postCount":55031,"coverImage":{"id":"1*x-eNR_oRVtO5c3N_romtsA.jpeg","originalWidth":3840,"originalHeight":2160,"isFeatured":true,"focusPercentX":47,"focusPercentY":26,"alt":"The nameless protagonist of Dynasty Warriors Origins faces a dialog decision that doesn’t impact the story."}},"type":"Tag"},{"slug":"crossword-puzzles","name":"Crossword Puzzles","postCount":466,"metadata":{"postCount":466,"coverImage":{"id":"0*Xf5EIx4AiGA2neJC","originalWidth":6240,"originalHeight":4160,"isFeatured":true,"alt":"Picture of a man doing a crossword in a coffee shop via Alt text on Medium","unsplashPhotoId":"nFIGVToFvGg"}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":1,"links":{"entries":[{"url":"https://crossword.withgoogle.com/","alts":[],"httpStatus":200},{"url":"https://firebase.blog/posts/2024/06/ai-powered-crossword-genkit","alts":[],"httpStatus":200},{"url":"https://pub.dev/packages/dart_frog","alts":[],"httpStatus":200},{"url":"https://flame-engine.org/","alts":[],"httpStatus":200},{"url":"https://gemini.google.com/","alts":[],"httpStatus":200},{"url":"https://api.flutter.dev/flutter/widgets/InteractiveViewer-class.html","alts":[],"httpStatus":200},{"url":"https://developers.google.com/learn/pathways/solution-crossword","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/platform-integration/web/wasm","alts":[],"httpStatus":200},{"url":"https://ai.google.dev/","alts":[],"httpStatus":200},{"url":"https://github.com/VGVentures/io_crossword","alts":[],"httpStatus":200},{"url":"https://dartfrog.vgv.dev/docs/deploy/google-cloud-run","alts":[],"httpStatus":200},{"url":"https://www.youtube.com/watch?v=xKmEOXZsU_0","alts":[{"type":2,"url":"vnd.youtube://www.youtube.com/watch?v=xKmEOXZsU_0&feature=applinks"},{"type":3,"url":"vnd.youtube://www.youtube.com/watch?v=xKmEOXZsU_0&feature=applinks"}],"httpStatus":200},{"url":"https://firebase.google.com/docs/genkit","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1719421300264},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":210,"sectionCount":1,"readingList":0,"topics":[{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"how-we-built-it-creating-the-i-o-crossword-puzzle-powered-by-ai","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"how-we-built-it-creating-the-i-o-crossword-puzzle-powered-by-ai-2210e39b04b9","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"0*4ylubp836_tc4Nni","originalWidth":1600,"originalHeight":900,"isFeatured":true}},{"name":"b7df","type":3,"text":"How we built it: Creating the I/O Crossword puzzle, powered by AI","markups":[{"type":1,"start":0,"end":65}],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Adding a fun, helpful twist to a classic word game with Flutter, Firebase Genkit, and the Gemini API"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"4da7dfd21a33","isNewsletter":false,"newsletterId":"c90fb6ad48c0","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"b7df","type":3,"text":"How we built it: Creating the I/O Crossword puzzle, powered by AI","markups":[{"type":1,"start":0,"end":65}]},{"name":"d59d","type":1,"text":"Adding a fun, helpful twist to a classic word game with Flutter, Firebase Genkit, and the Gemini API","markups":[{"type":1,"start":0,"end":100},{"type":2,"start":0,"end":100}]},{"name":"9b6d","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"0*4ylubp836_tc4Nni","originalWidth":1600,"originalHeight":900,"isFeatured":true}},{"name":"1faf","type":1,"text":"For this year’s I/O, Very Good Ventures partnered with the Flutter and Firebase teams at Google to create a unique, digital experience to showcase the power of the Gemini API.","markups":[]},{"name":"2aa3","type":1,"text":"The fun…","markups":[{"type":3,"start":250,"end":265,"href":"https://gemini.google.com/","title":"","rel":"","anchorType":0}]}],"sections":[{"name":"bcbb","startIndex":0}]},"isFullContent":false,"subtitle":"Adding a fun, helpful twist to a classic word game with Flutter, Firebase Genkit, and the Gemini API"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"7c963c064f8d":{"id":"7c963c064f8d","versionId":"8ed4a0db6042","creatorId":"a6d788faa5e5","homeCollectionId":"4da7dfd21a33","title":"All the Flutter news from a busy Google I/O 2024","detectedLanguage":"en","latestVersion":"8ed4a0db6042","latestPublishedVersion":"8ed4a0db6042","hasUnpublishedEdits":false,"latestRev":135,"createdAt":1716993447377,"updatedAt":1732483550419,"acceptedAt":0,"firstPublishedAt":1717083427488,"latestPublishedAt":1717083427488,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Catch up on all the big product updates, new resources, and success stories announced at Google I/O 2024","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*--DvqdXSA38rPuqMK5c0tQ.png","filter":"","backgroundSize":"","originalWidth":549,"originalHeight":435,"strategy":"resample","height":0,"width":0},"wordCount":494,"imageCount":1,"readingTime":2.0641509433962266,"subtitle":"Catch up on all the big product updates, new resources, and success stories announced at Google I/O 2024","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":39,"isBookmarked":false,"tags":[{"slug":"flutter","name":"Flutter","postCount":47247,"metadata":{"postCount":47247,"coverImage":{"id":"1*_Bu89jy8JGFudhgNq7yVWA.jpeg","originalWidth":813,"originalHeight":467}},"type":"Tag"},{"slug":"flutter-app-development","name":"Flutter App Development","postCount":15245,"metadata":{"postCount":15245,"coverImage":{"id":"1*umWe3sUfevF0bex4IBOJzA.png","originalWidth":685,"originalHeight":396}},"type":"Tag"},{"slug":"announcements","name":"Announcements","postCount":17396,"metadata":{"postCount":17396,"coverImage":{"id":"1*3OUXYFxN3YN0774j5fqRjA.jpeg","originalWidth":6720,"originalHeight":4480,"isFeatured":true}},"type":"Tag"},{"slug":"google-io-2024","name":"Google Io 2024","postCount":96,"metadata":{"postCount":96,"coverImage":{"id":"1*pOG_U_xOUz20N4syj_VDlQ.jpeg","originalWidth":2560,"originalHeight":1843,"isFeatured":true}},"type":"Tag"},{"slug":"recaps","name":"Recaps","postCount":5149,"metadata":{"postCount":5149,"coverImage":{"id":"1*lCLXKpI2z5ucQtus9DVSjQ.jpeg","originalWidth":1100,"originalHeight":753,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[{"url":"https://flutter.dev/showcase/virgin-money","alts":[],"httpStatus":200},{"url":"https://flutter.dev/showcase/etermax","alts":[],"httpStatus":200},{"url":"https://flutter.dev/games","alts":[],"httpStatus":200},{"url":"https://flutter.dev/showcase/universal-studios","alts":[],"httpStatus":200},{"url":"https://flutter.dev/showcase","alts":[],"httpStatus":200},{"url":"https://flutter.dev/showcase/supercell","alts":[],"httpStatus":200},{"url":"https://medium.com/flutter/io24-5e211f708a37","alts":[{"type":3,"url":"medium://p/5e211f708a37"},{"type":2,"url":"medium://p/5e211f708a37"}],"httpStatus":200},{"url":"https://medium.com/flutter/announcing-the-winners-of-the-global-gamers-challenge-1ccf4d271226","alts":[{"type":3,"url":"medium://p/1ccf4d271226"},{"type":2,"url":"medium://p/1ccf4d271226"}],"httpStatus":200},{"url":"https://medium.com/dartlang/dart-3-4-bd8d23b4462a","alts":[{"type":3,"url":"medium://p/bd8d23b4462a"},{"type":2,"url":"medium://p/bd8d23b4462a"}],"httpStatus":200},{"url":"https://io.google/2024/","alts":[],"httpStatus":200},{"url":"https://io.google/2024/explore/?q=technical-session,flutter","alts":[],"httpStatus":200},{"url":"https://io.google/2024/explore/?q=codelab,flutter","alts":[],"httpStatus":200},{"url":"https://io.google/2024/explore/?q=workshop,flutter","alts":[],"httpStatus":200},{"url":"https://developers.google.com/events","alts":[],"httpStatus":200},{"url":"https://developers.googleblog.com/en/making-development-across-platforms-easier-for-developers/","alts":[],"httpStatus":200},{"url":"https://medium.com/flutter/fbde6c164fe3","alts":[{"type":3,"url":"medium://p/fbde6c164fe3"},{"type":2,"url":"medium://p/fbde6c164fe3"}],"httpStatus":200},{"url":"https://www.youtube.com/watch?v=lpnKWK-KEYs","alts":[{"type":2,"url":"vnd.youtube://www.youtube.com/watch?v=lpnKWK-KEYs&feature=applinks"},{"type":3,"url":"vnd.youtube://www.youtube.com/watch?v=lpnKWK-KEYs&feature=applinks"}],"httpStatus":200},{"url":"https://gdg.community.dev/ioextended/","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1717083428513},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":252,"sectionCount":1,"readingList":0,"topics":[{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"all-the-flutter-news-from-a-busy-google-i-o-2024","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"all-the-flutter-news-from-a-busy-google-i-o-2024-7c963c064f8d","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*--DvqdXSA38rPuqMK5c0tQ.png","originalWidth":549,"originalHeight":435,"isFeatured":true}},{"name":"b061","type":3,"text":"All the Flutter news from a busy Google I/O 2024","markups":[],"alignment":1},{"name":"49c0","type":13,"text":"Catch up on all the big product updates, new…","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Catch up on all the big product updates, new resources, and success stories announced at Google I/O 2024"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"4da7dfd21a33","isNewsletter":false,"newsletterId":"","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":4,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"b061","type":3,"text":"All the Flutter news from a busy Google I/O 2024","markups":[]},{"name":"49c0","type":13,"text":"Catch up on all the big product updates, new resources, and success stories announced at Google I/O 2024","markups":[]},{"name":"9af6","type":1,"text":"It’s hard to believe that Google I/O 2024 was already two weeks ago. We couldn’t be more grateful for the Flutter community’s support — the energy was uplifting!","markups":[{"type":3,"start":26,"end":41,"href":"https://io.google/2024/","title":"","rel":"","anchorType":0}]},{"name":"c77b","type":4,"text":"Flutter logo illustration","markups":[],"layout":1,"metadata":{"id":"1*--DvqdXSA38rPuqMK5c0tQ.png","originalWidth":549,"originalHeight":435,"isFeatured":true}},{"name":"57b9","type":1,"text":"We shared a lot of product updates, resources, developer stories, technical sessions, and workshops, across several blogs, videos, and events — and…","markups":[]}],"sections":[{"name":"2ef4","startIndex":0}]},"isFullContent":false,"subtitle":"Catch up on all the big product updates, new resources, and success stories announced at Google I/O 2024"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":false,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"1ccf4d271226":{"id":"1ccf4d271226","versionId":"eadbe3c8ff23","creatorId":"aa31f520c7ec","homeCollectionId":"4da7dfd21a33","title":"Announcing the winners of the Global Gamers Challenge","detectedLanguage":"en","latestVersion":"eadbe3c8ff23","latestPublishedVersion":"eadbe3c8ff23","hasUnpublishedEdits":false,"latestRev":547,"createdAt":1715563435502,"updatedAt":1732625502740,"acceptedAt":0,"firstPublishedAt":1715718978962,"latestPublishedAt":1718152062868,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Our 10 top projects, and how to stay involved with sustainability games","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"0*S_bBN0WiR_Q5F08J","filter":"","backgroundSize":"","originalWidth":1600,"originalHeight":901,"strategy":"resample","height":0,"width":0},"wordCount":1086,"imageCount":11,"readingTime":5.39811320754717,"subtitle":"Our 10 top projects, and how to stay involved with sustainability games","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":36,"isBookmarked":false,"tags":[{"slug":"flutter","name":"Flutter","postCount":47247,"metadata":{"postCount":47247,"coverImage":{"id":"1*_Bu89jy8JGFudhgNq7yVWA.jpeg","originalWidth":813,"originalHeight":467}},"type":"Tag"},{"slug":"games","name":"Games","postCount":141022,"metadata":{"postCount":141022,"coverImage":{"id":"1*T3GVvTLDca3v61NO_qQaag.jpeg","originalWidth":4000,"originalHeight":2250}},"type":"Tag"},{"slug":"game-development","name":"Game Development","postCount":55031,"metadata":{"postCount":55031,"coverImage":{"id":"1*x-eNR_oRVtO5c3N_romtsA.jpeg","originalWidth":3840,"originalHeight":2160,"isFeatured":true,"focusPercentX":47,"focusPercentY":26,"alt":"The nameless protagonist of Dynasty Warriors Origins faces a dialog decision that doesn’t impact the story."}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":1,"links":{"entries":[{"url":"https://globalgamejam.org/","alts":[],"httpStatus":403},{"url":"http://flutter.dev/games","alts":[],"httpStatus":200},{"url":"http://flutter.dev/global-gamers/#winners","alts":[],"httpStatus":200},{"url":"https://devpost.com/software/last-bottle","alts":[],"httpStatus":200},{"url":"https://devpost.com/software/waste-wise","alts":[],"httpStatus":200},{"url":"https://devpost.com/software/wip-au-flutter-game","alts":[],"httpStatus":200},{"url":"https://devpost.com/software/projectocean","alts":[],"httpStatus":200},{"url":"https://devpost.com/software/craftown","alts":[],"httpStatus":200},{"url":"https://devpost.com/software/gomiland","alts":[],"httpStatus":200},{"url":"https://devpost.com/software/plasticpunk","alts":[],"httpStatus":200},{"url":"https://devpost.com/software/mgame-a-waste-management-game","alts":[],"httpStatus":200},{"url":"https://en.wikipedia.org/wiki/Greenwashing","alts":[],"httpStatus":200},{"url":"https://devpost.com/software/whaley-s-bins-waste-sorting","alts":[],"httpStatus":200},{"url":"https://devpost.com/software/ecoshift-chronicles","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1718152063344},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":182,"sectionCount":1,"readingList":0,"topics":[{"topicId":"137f52891b6b","slug":"gaming","createdAt":1527184510547,"deletedAt":0,"image":{"id":"1*3BZYZyK4cVHJanh-pHnZRg@2x.jpeg","originalWidth":4752,"originalHeight":3168},"name":"Gaming","description":"Ready, player one?","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Gaming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"announcing-the-winners-of-the-global-gamers-challenge","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":false,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"announcing-the-winners-of-the-global-gamers-challenge-1ccf4d271226","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"0*S_bBN0WiR_Q5F08J","originalWidth":1600,"originalHeight":901,"isFeatured":true}},{"name":"77ec","type":3,"text":"Announcing the winners of the Global Gamers Challenge","markups":[],"alignment":1},{"name":"789c","type":3,"text":"Our 10 top projects, and how to stay involved…","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Our 10 top projects, and how to stay involved with sustainability games"},"license":1,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"4da7dfd21a33","isNewsletter":false,"newsletterId":"","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":0,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"77ec","type":3,"text":"Announcing the winners of the Global Gamers Challenge","markups":[]},{"name":"789c","type":3,"text":"Our 10 top projects, and how to stay involved with sustainability games","markups":[]},{"name":"6788","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"0*S_bBN0WiR_Q5F08J","originalWidth":1600,"originalHeight":901,"isFeatured":true}},{"name":"635c","type":1,"text":"We asked the Flutter and Global Citizen communities to come together to build epic Flutter games that focused on helping the planet. Hundreds of innovative game projects were submitted by thousands of passionate developers spanning over 50 countries.","markups":[]},{"name":"f92d","type":1,"text":"Each project aimed to empower players with knowledge and actions that can…","markups":[]}],"sections":[{"name":"a51c","startIndex":0}]},"isFullContent":false,"subtitle":"Our 10 top projects, and how to stay involved with sustainability games"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":false,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"fbde6c164fe3":{"id":"fbde6c164fe3","versionId":"6e5894ffb929","creatorId":"7cb43f46877f","homeCollectionId":"4da7dfd21a33","title":"What’s new in Flutter 3.22","detectedLanguage":"en","latestVersion":"6e5894ffb929","latestPublishedVersion":"6e5894ffb929","hasUnpublishedEdits":false,"latestRev":479,"createdAt":1715367037024,"updatedAt":1732625884315,"acceptedAt":0,"firstPublishedAt":1715718870980,"latestPublishedAt":1715947479302,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"WebAssembly, Graphics rendering enhancements, and more options for AI integration","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*hf9CEzGh0uhxnzVZi2Kk4g.png","filter":"","backgroundSize":"","originalWidth":1920,"originalHeight":1080,"strategy":"resample","height":0,"width":0},"wordCount":2774,"imageCount":9,"readingTime":11.667924528301887,"subtitle":"WebAssembly, Graphics rendering enhancements, and more options for AI integration","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":617,"isBookmarked":false,"tags":[{"slug":"flutter","name":"Flutter","postCount":47247,"metadata":{"postCount":47247,"coverImage":{"id":"1*_Bu89jy8JGFudhgNq7yVWA.jpeg","originalWidth":813,"originalHeight":467}},"type":"Tag"},{"slug":"flutter-app-development","name":"Flutter App Development","postCount":15245,"metadata":{"postCount":15245,"coverImage":{"id":"1*umWe3sUfevF0bex4IBOJzA.png","originalWidth":685,"originalHeight":396}},"type":"Tag"},{"slug":"release-notes","name":"Release Notes","postCount":4077,"metadata":{"postCount":4077,"coverImage":{"id":"0*GRmRiLBicW8F6WtX.png","originalWidth":700,"originalHeight":245}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":27,"links":{"entries":[{"url":"https://dart.dev/web/wasm","alts":[],"httpStatus":200},{"url":"https://medium.com/flutter/io24-5e211f708a37","alts":[{"type":3,"url":"medium://p/5e211f708a37"},{"type":2,"url":"medium://p/5e211f708a37"}],"httpStatus":200},{"url":"https://pub.dev/packages/gma_mediation_dtexchange","alts":[],"httpStatus":200},{"url":"https://pub.dev/packages/gma_mediation_pangle","alts":[],"httpStatus":200},{"url":"https://pub.dev/packages/gma_mediation_meta","alts":[],"httpStatus":200},{"url":"https://pub.dev/packages/gma_mediation_liftoffmonetize","alts":[],"httpStatus":200},{"url":"https://pub.dev/packages/gma_mediation_unity","alts":[],"httpStatus":200},{"url":"https://pub.dev/packages/gma_mediation_mintegral","alts":[],"httpStatus":200},{"url":"http://www.opengl-redbook.com/","alts":[],"httpStatus":200},{"url":"https://pub.dev/packages/gma_mediation_applovin","alts":[],"httpStatus":200},{"url":"http://docs.flutter.dev/ui/assets/asset-transformation","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/deployment/flavors","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/perf/impeller#android","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/release/breaking-changes/android-kitkat-deprecation","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/deployment/flavors#conditionally-bundling-assets-based-on-flavor","alts":[],"httpStatus":200},{"url":"https://github.com/SharbelOkzan","alts":[],"httpStatus":200},{"url":"https://pub.dev/packages/gma_mediation_inmobi","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/platform-integration/web/wasm","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/development/tools/flutter-fix","alts":[],"httpStatus":200},{"url":"https://flutter-flutter-perf.skia.org/e/?begin=1699468487&end=1710262311&keys=X01fc3d52ebd6fbf38afef91d82ab8d2b&requestType=0&selected=commit%3D38815%26name%3D%252Carch%253Dintel%252Cbranch%253Dmaster%252Cconfig%253Ddefault%252Cdevice_type%253DiPhone_11%252Cdevice_version%253Dnone%252Chost_type%253Dmac%252Csub_result%253Daverage_frame_rasterizer_time_millis%252Ctest%253Dbackdrop_filter_perf_ios__timeline_summary%252C&xbaroffset=38815","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/release/breaking-changes/material-state","alts":[],"httpStatus":200},{"url":"https://pub.dev/packages/gma_mediation_ironsource","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/release/breaking-changes/plugin-api-migration","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/tools/devtools/deep-links","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/release/breaking-changes","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/release/breaking-changes/3-19-deprecations","alts":[],"httpStatus":200},{"url":"https://github.com/bartekpacia","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/tools/devtools/release-notes/release-notes-2.33.0","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/release/breaking-changes/android-surface-plugins","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/tools/devtools/release-notes/release-notes-2.34.1","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/tools/devtools/release-notes/release-notes-2.32.0","alts":[],"httpStatus":200},{"url":"https://firebase.google.com/docs/app-check","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/tests/blob/master/README.md","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/flutter/wiki/Roadmap#core-framework--engine","alts":[],"httpStatus":200},{"url":"https://firebase.google.com/docs/vertex-ai/get-started?platform=flutter","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/flutter/wiki/Tree-hygiene#handling-breaking-changes","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/flutter/issues/132504#issuecomment-2025776552","alts":[],"httpStatus":200},{"url":"https://docs.google.com/document/d/1qeeM5QG-jiafttSgvc7yvC19IDRggFFZQTktBVxL6sI/edit?resourcekey=0-HLEAiBOMxAlQxDs-mEeffw","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/flutter/issues/141961","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/flutter/issues/134178","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/engine/pull/51219","alts":[],"httpStatus":200},{"url":"https://ai.google.dev/gemini-api/docs/get-started/dart","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/flutter/pull/140918","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/flutter/issues/123671","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/packages/pull/6494","alts":[],"httpStatus":200},{"url":"https://firebase.google.com/docs/vertex-ai/migrate-to-vertex-ai?platform=flutter","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/engine/pull/50154","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/engine/pull/47576","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/flutter/pull/140744","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/flutter/pull/144745","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/flutter/pull/135578","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/engine/pull/50730","alts":[],"httpStatus":200},{"url":"https://github.com/flutter/engine/pull/49543","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1715947487344},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":3937,"sectionCount":1,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"whats-new-in-flutter-3-22","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":false,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"whats-new-in-flutter-3-22-fbde6c164fe3","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*hf9CEzGh0uhxnzVZi2Kk4g.png","originalWidth":1920,"originalHeight":1080,"isFeatured":true}},{"name":"06f2","type":3,"text":"What’s new in Flutter 3.22","markups":[],"alignment":1},{"name":"ed78","type":13,"text":"WebAssembly, Graphics rendering enhancements, and more options for AI…","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"WebAssembly, Graphics rendering enhancements, and more options for AI integration"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"4da7dfd21a33","isNewsletter":false,"newsletterId":"","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":1,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"7a68","type":4,"text":"","markups":[],"layout":3,"metadata":{"id":"1*hf9CEzGh0uhxnzVZi2Kk4g.png","originalWidth":1920,"originalHeight":1080,"isFeatured":true}},{"name":"06f2","type":3,"text":"What’s new in Flutter 3.22","markups":[]},{"name":"ed78","type":13,"text":"WebAssembly, Graphics rendering enhancements, and more options for AI integration","markups":[]},{"name":"1389","type":1,"text":"Welcome back for another exciting Flutter stable release! This time, we’re thrilled to present Flutter 3.22. We’re bringing WebAssembly to the stable channel, a fully featured Vulkan backend for Impeller on Android, promising smoother graphics and a major performance boost. We’re also introducing streamlined workflows with new widget state properties…","markups":[]}],"sections":[{"name":"7a13","startIndex":0}]},"isFullContent":false,"subtitle":"WebAssembly, Graphics rendering enhancements, and more options for AI integration"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":false,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"5e211f708a37":{"id":"5e211f708a37","versionId":"80c47cd7582c","creatorId":"a6d788faa5e5","homeCollectionId":"4da7dfd21a33","title":"Landing Flutter 3.22 and Dart 3.4 at Google I/O 2024","detectedLanguage":"en","latestVersion":"80c47cd7582c","latestPublishedVersion":"80c47cd7582c","hasUnpublishedEdits":false,"latestRev":547,"createdAt":1713873581798,"updatedAt":1732625244297,"acceptedAt":0,"firstPublishedAt":1715718818614,"latestPublishedAt":1715718818614,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Major milestones for Flutter web apps, graphics performance upgrades, productivity experiments, and more","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*Mq-Uj8c8l7rrpPxYQ6Gemw.gif","filter":"","backgroundSize":"","originalWidth":1920,"originalHeight":1500,"strategy":"resample","height":0,"width":0},"wordCount":1630,"imageCount":5,"readingTime":6.984276729559748,"subtitle":"Major milestones for Flutter web apps, graphics performance upgrades, productivity experiments, and more","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":365,"isBookmarked":false,"tags":[{"slug":"announcements","name":"Announcements","postCount":17396,"metadata":{"postCount":17396,"coverImage":{"id":"1*3OUXYFxN3YN0774j5fqRjA.jpeg","originalWidth":6720,"originalHeight":4480,"isFeatured":true}},"type":"Tag"},{"slug":"flutter","name":"Flutter","postCount":47247,"metadata":{"postCount":47247,"coverImage":{"id":"1*_Bu89jy8JGFudhgNq7yVWA.jpeg","originalWidth":813,"originalHeight":467}},"type":"Tag"},{"slug":"releases","name":"Releases","postCount":3688,"metadata":{"postCount":3688,"coverImage":{"id":"1*bcsxaA-Cg7PskKmQJgJF4w.png","originalWidth":5833,"originalHeight":1775,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":10,"links":{"entries":[{"url":"https://twitter.com/chenglinlim","alts":[],"httpStatus":400},{"url":"https://flutter.gskinner.com/wonderous/","alts":[],"httpStatus":200},{"url":"https://medium.com/flutter/best-practices-for-optimizing-flutter-web-loading-speed-7cc0df14ce5c","alts":[{"type":3,"url":"medium://p/7cc0df14ce5c"},{"type":2,"url":"medium://p/7cc0df14ce5c"}],"httpStatus":200},{"url":"https://pub.dev/packages/forge2d","alts":[],"httpStatus":200},{"url":"https://www.lg.com/us","alts":[],"httpStatus":200},{"url":"http://flutter.dev/showcase/etermax","alts":[],"httpStatus":404},{"url":"http://flutter.dev/showcase/supercell","alts":[],"httpStatus":404},{"url":"http://flutter.dev/showcase/virgin-money","alts":[],"httpStatus":404},{"url":"https://pub.dev/packages/flutter_soloud","alts":[],"httpStatus":200},{"url":"https://io.google/2024/","alts":[],"httpStatus":200},{"url":"http://flutter.dev/ai","alts":[],"httpStatus":404},{"url":"https://docs.flutter.dev/data-and-backend/serialization/json#serializing-json-using-code-generation-libraries","alts":[],"httpStatus":200},{"url":"https://codelabs.developers.google.com/codelabs/flutter-codelab-soloud#0","alts":[],"httpStatus":200},{"url":"http://dart.dev/go/json-codable","alts":[],"httpStatus":200},{"url":"https://github.com/WebAssembly/gc/blob/main/proposals/gc/Overview.md","alts":[],"httpStatus":200},{"url":"https://dart.dev/go/json-codable","alts":[],"httpStatus":200},{"url":"https://dart.dev/web/wasm","alts":[],"httpStatus":200},{"url":"https://codelabs.developers.google.com/codelabs/flutter-flame-forge2d#0","alts":[],"httpStatus":200},{"url":"https://www.geico.com/techblog/flutter-as-the-multi-channel-ux-framework/","alts":[],"httpStatus":200},{"url":"https://github.com/alnitak","alts":[],"httpStatus":200},{"url":"https://www.geico.com/about/corporate/at-a-glance/","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/perf/impeller","alts":[],"httpStatus":200},{"url":"https://firebase.google.com/docs/vertex-ai/get-started?platform=flutter","alts":[],"httpStatus":200},{"url":"https://docs.flutter.dev/platform-integration/web/wasm","alts":[],"httpStatus":200},{"url":"https://developer.chrome.com/blog/wasmgc/","alts":[],"httpStatus":200},{"url":"https://medium.com/flutter/fbde6c164fe3","alts":[],"httpStatus":200},{"url":"https://medium.com/flutter/announcing-the-winners-of-the-global-gamers-challenge-1ccf4d271226","alts":[],"httpStatus":200},{"url":"https://github.com/dart-lang/language/issues?q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc","alts":[],"httpStatus":200},{"url":"https://uk.virginmoney.com/","alts":[],"httpStatus":200},{"url":"https://developer.android.com/guide/navigation/custom-back/predictive-back-gesture","alts":[],"httpStatus":200},{"url":"https://canonical.com/","alts":[],"httpStatus":200},{"url":"https://medium.com/dartlang/dart-3-4-bd8d23b4462a","alts":[],"httpStatus":200},{"url":"https://corporate.universaldestinationsandexperiences.com/","alts":[],"httpStatus":200},{"url":"https://codelabs.developers.google.com/codelabs/flutter-word-puzzle#0","alts":[],"httpStatus":200},{"url":"https://pub.dev/publishers/canonical.com/packages","alts":[],"httpStatus":200},{"url":"https://www.youtube.com/watch?v=qgOlg173gcI&pp=ygUWR2xvYmFsIENpdGl6ZW4gRmx1dHRlcg%3D%3D","alts":[{"type":2,"url":"vnd.youtube://www.youtube.com/watch?v=qgOlg173gcI&pp=ygUWR2xvYmFsIENpdGl6ZW4gRmx1dHRlcg%3D%3D&feature=applinks"},{"type":3,"url":"vnd.youtube://www.youtube.com/watch?v=qgOlg173gcI&pp=ygUWR2xvYmFsIENpdGl6ZW4gRmx1dHRlcg%3D%3D&feature=applinks"}],"httpStatus":200},{"url":"https://ubuntu.com/blog/flutter-and-ubuntu-so-far","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1715718819380},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":2456,"sectionCount":1,"readingList":0,"topics":[{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"landing-flutter-3-22-and-dart-3-4-at-google-i-o-2024","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"io24-5e211f708a37","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*Mq-Uj8c8l7rrpPxYQ6Gemw.gif","originalWidth":1920,"originalHeight":1500,"isFeatured":true}},{"name":"48b3","type":3,"text":"Landing Flutter 3.22 and Dart 3.4 at Google I/O 2024","markups":[],"alignment":1},{"name":"3c18","type":13,"text":"Major milestones for Flutter web apps, graphics…","markups":[{"type":2,"start":0,"end":47}],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Major milestones for Flutter web apps, graphics performance upgrades, productivity experiments, and more"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"4da7dfd21a33","isNewsletter":false,"newsletterId":"","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":1,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"48b3","type":3,"text":"Landing Flutter 3.22 and Dart 3.4 at Google I/O 2024","markups":[]},{"name":"3c18","type":13,"text":"Major milestones for Flutter web apps, graphics performance upgrades, productivity experiments, and more","markups":[{"type":2,"start":0,"end":104}]},{"name":"2605","type":1,"text":"It’s been a particularly busy last few months in Dart & Flutter air traffic control, but we’re happy to announce that Flutter 3.22 and Dart 3.4 have landed and are available today, just in time for this year’s Google I/O!","markups":[{"type":3,"start":210,"end":220,"href":"https://io.google/2024/","title":"","rel":"","anchorType":0}]},{"name":"7175","type":1,"text":"We remain committed to providing a strong language and framework…","markups":[]}],"sections":[{"name":"fbc7","startIndex":0}]},"isFullContent":false,"subtitle":"Major milestones for Flutter web apps, graphics performance upgrades, productivity experiments, and more"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":false,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"597d4f3b450c":{"id":"597d4f3b450c","versionId":"a7a74ce4cce4","creatorId":"7014d6220229","homeCollectionId":"4da7dfd21a33","title":"Cross Platform development with Flutter — How Google Classroom gets teachers and students on the…","detectedLanguage":"en","latestVersion":"a7a74ce4cce4","latestPublishedVersion":"a7a74ce4cce4","hasUnpublishedEdits":false,"latestRev":308,"createdAt":1715019136437,"updatedAt":1732684072814,"acceptedAt":0,"firstPublishedAt":1715094123788,"latestPublishedAt":1715096356222,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Google’s Classroom app, which originally launched in 2014, is used by 150 million educators and students around the world to organize…","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*-u0y5vTqoC_sCyOHpvUnNA.png","filter":"","backgroundSize":"","originalWidth":1146,"originalHeight":1192,"strategy":"resample","height":0,"width":0},"wordCount":1851,"imageCount":4,"readingTime":7.684905660377359,"subtitle":"Google’s Classroom app, which originally launched in 2014, is used by 150 million educators and students around the world to organize…","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":140,"isBookmarked":false,"tags":[{"slug":"flutter","name":"Flutter","postCount":47247,"metadata":{"postCount":47247,"coverImage":{"id":"1*_Bu89jy8JGFudhgNq7yVWA.jpeg","originalWidth":813,"originalHeight":467}},"type":"Tag"},{"slug":"enterprise-technology","name":"Enterprise Technology","postCount":7186,"metadata":{"postCount":7186,"coverImage":{"id":"1*JKXH3z6q5S_CIrofFt37pw.png","originalWidth":537,"originalHeight":911}},"type":"Tag"},{"slug":"education-technology","name":"Education Technology","postCount":12491,"metadata":{"postCount":12491,"coverImage":{"id":"0*USRDSOSzcPYLqRBq","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},"type":"Tag"},{"slug":"cross-platform","name":"Cross Platform","postCount":3809,"metadata":{"postCount":3809,"coverImage":{"id":"1*pMpW21OOuo7x5fpRUAYqRA.png","originalWidth":916,"originalHeight":577,"isFeatured":true}},"type":"Tag"},{"slug":"dart","name":"Dart","postCount":14202,"metadata":{"postCount":14202,"coverImage":{"id":"1*DbEkdqRstH6LK2hmTfKZHw.jpeg","originalWidth":1792,"originalHeight":1024,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":2,"links":{"entries":[{"url":"https://medium.com/flutter/extreme-ui-adaptability-in-flutter-how-google-earth-supports-every-use-case-on-earth-6db4661e7a17","alts":[{"type":3,"url":"medium://p/6db4661e7a17"},{"type":2,"url":"medium://p/6db4661e7a17"}],"httpStatus":200}],"version":"0.3","generatedAt":1715096356890},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":1154,"sectionCount":1,"readingList":0,"topics":[{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"cross-platform-development-with-flutter-how-google-classroom-gets-teachers-and-students-on-the","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":false,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"cross-platform-development-with-flutter-how-google-classroom-gets-teachers-and-students-on-the-597d4f3b450c","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*-u0y5vTqoC_sCyOHpvUnNA.png","originalWidth":1146,"originalHeight":1192,"isFeatured":true}},{"name":"5b9a","type":3,"text":"Cross Platform development with Flutter — How Google Classroom gets teachers and students on the same page","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Google’s Classroom app, which originally launched in 2014, is used by 150 million educators and students around the world to organize…"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"4da7dfd21a33","isNewsletter":false,"newsletterId":"2ec86ec5f1d7","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":1,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"5b9a","type":3,"text":"Cross Platform development with Flutter — How Google Classroom gets teachers and students on the same page","markups":[]},{"name":"fb3f","type":1,"text":"Google’s Classroom app, which originally launched in 2014, is used by 150 million educators and students around the world to organize homework, grades, and communication in the classroom. Available on Android and iOS, development originally began earlier that year and has spanned eras of tremendous change on both mobile platforms…","markups":[]}],"sections":[{"name":"31dd","startIndex":0}]},"isFullContent":false,"subtitle":"Google’s Classroom app, which originally launched in 2014, is used by 150 million educators and students around the world to organize…"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"}}},"paging":{"path":"/_/api/collections/4da7dfd21a33/stream","next":{"to":"1715094123788","ignoredIds":[],"page":3}},"collection":{"id":"4da7dfd21a33","name":"Flutter","slug":"flutter","tags":["MOBILE APP DEVELOPMENT","FLUTTER","GOOGLE","IOS APP DEVELOPMENT","ANDROID APP DEVELOPMENT"],"creatorId":"2df4e577749c","description":"Flutter is Google's UI framework for crafting high-quality native interfaces on iOS, Android, web, and desktop. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source. Learn more at https://flutter.dev","shortDescription":"Flutter is Google's UI framework for crafting high-quality…","image":{"imageId":"1*5-aoK8IBmXve5whBQM90GA.png","filter":"","backgroundSize":"","originalWidth":1000,"originalHeight":1000,"strategy":"resample","height":0,"width":0},"metadata":{"followerCount":57039,"activeAt":1732210323729},"virtuals":{"permissions":{"canPublish":false,"canPublishAll":false,"canRepublish":false,"canRemove":false,"canManageAll":false,"canSubmit":false,"canEditPosts":false,"canAddWriters":false,"canViewStats":false,"canSendNewsletter":false,"canViewLockedPosts":false,"canViewCloaked":false,"canEditOwnPosts":false,"canBeAssignedAuthor":false,"canEnrollInHightower":false,"canLockPostsForMediumMembers":false,"canLockOwnPostsForMediumMembers":false,"canViewNewsletterV2Stats":false,"canCreateNewsletterV3":false},"isSubscribed":false,"isEnrolledInHightower":false,"isEligibleForHightower":false,"isSubscribedToCollectionEmails":false,"isMuted":false,"canToggleEmail":false,"isWriter":false},"logo":{"imageId":"1*KvnfbD1F5CzEsU9wSmRZyA.png","filter":"","backgroundSize":"","originalWidth":538,"originalHeight":141,"strategy":"resample","height":0,"width":0},"twitterUsername":"flutterdev","collectionMastheadId":"6f4efe3cee51","sections":[{"type":2,"collectionHeaderMetadata":{"title":"Flutter","description":"Build beautiful native apps in record time","backgroundImage":{},"logoImage":{"id":"1*XrbUBnZb-Vp9jRDGqU-BXQ@2x.png","originalWidth":2000,"originalHeight":2109,"alt":"Flutter"},"alignment":2,"layout":5}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":["204b7d20c45d"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":9,"postIds":["71377810fd26","f33d497b7c11","6c040f87d1e4","2210e39b04b9","7c963c064f8d","1ccf4d271226","fbde6c164fe3","5e211f708a37","597d4f3b450c"]}},{"type":1,"postListMetadata":{"source":1,"layout":5,"number":15,"postIds":[]}}],"tintColor":"#FF01579B","lightText":true,"favicon":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"colorPalette":{"defaultBackgroundSpectrum":{"colorPoints":[{"color":"#FF498BD1","point":0},{"color":"#FF4781C0","point":0.1},{"color":"#FF4477AF","point":0.2},{"color":"#FF416D9E","point":0.3},{"color":"#FF3D638D","point":0.4},{"color":"#FF38587C","point":0.5},{"color":"#FF324D6B","point":0.6},{"color":"#FF2C415A","point":0.7},{"color":"#FF253548","point":0.8},{"color":"#FF1C2937","point":0.9},{"color":"#FF121B25","point":1}],"backgroundColor":"#FFFFFFFF"},"tintBackgroundSpectrum":{"colorPoints":[{"color":"#FF01579B","point":0},{"color":"#FF306CA9","point":0.1},{"color":"#FF4D7FB7","point":0.2},{"color":"#FF6591C4","point":0.3},{"color":"#FF7CA3D0","point":0.4},{"color":"#FF92B4DC","point":0.5},{"color":"#FFA7C4E7","point":0.6},{"color":"#FFBCD3F1","point":0.7},{"color":"#FFD0E3FC","point":0.8},{"color":"#FFE3F2FF","point":0.9},{"color":"#FFF7FFFF","point":1}],"backgroundColor":"#FF01579B"},"highlightSpectrum":{"colorPoints":[{"color":"#FFE8F5FF","point":0},{"color":"#FFE3F3FF","point":0.1},{"color":"#FFDEF2FF","point":0.2},{"color":"#FFDAF0FF","point":0.3},{"color":"#FFD5EFFF","point":0.4},{"color":"#FFD0EDFF","point":0.5},{"color":"#FFCBECFF","point":0.6},{"color":"#FFC6EBFF","point":0.7},{"color":"#FFC1E9FF","point":0.8},{"color":"#FFBCE8FF","point":0.9},{"color":"#FFB6E6FF","point":1}],"backgroundColor":"#FFFFFFFF"},"darkBackgroundSpectrum":{"colorPoints":[{"color":"#FF63A4EB","point":0},{"color":"#FF72ACED","point":0.1},{"color":"#FF81B4EF","point":0.2},{"color":"#FF8FBCF1","point":0.3},{"color":"#FF9CC4F3","point":0.4},{"color":"#FFA9CBF5","point":0.5},{"color":"#FFB6D3F6","point":0.6},{"color":"#FFC2DAF8","point":0.7},{"color":"#FFCFE2FA","point":0.8},{"color":"#FFDAE9FC","point":0.9},{"color":"#FFE6F0FE","point":1}],"backgroundColor":"#FF000000"}},"navItems":[{"type":1,"title":"Announcements","tagSlug":"announcements","url":"https://medium.com/flutter/tagged/announcements","source":"tagSlug"},{"type":1,"title":"Performance","tagSlug":"performance","url":"https://medium.com/flutter/tagged/performance","source":"tagSlug"},{"type":1,"title":"Material Design","tagSlug":"material-design","url":"https://medium.com/flutter/tagged/material-design","source":"tagSlug"},{"type":1,"title":"Web Development","tagSlug":"web-development","url":"https://medium.com/flutter/tagged/web-development","source":"tagSlug"},{"type":3,"title":"flutter.dev","url":"https://flutter.dev/"}],"colorBehavior":2,"collectionFeatures":[25],"ampLogo":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"header":{"title":"Flutter","description":"Build beautiful native apps in record time","backgroundImage":{},"logoImage":{"id":"1*XrbUBnZb-Vp9jRDGqU-BXQ@2x.png","originalWidth":2000,"originalHeight":2109,"alt":"Flutter"},"alignment":2,"layout":5},"subscriberCount":57039,"tagline":"Flutter is an open source UI framework for crafting beautiful apps","isOptedIntoAurora":false,"isCurationAllowedByDefault":false,"polarisCoverImage":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"ptsQualifiedAt":1616092847310,"type":"Collection"},"header":{"title":"Flutter","description":"Build beautiful native apps in record time","backgroundImage":{},"logoImage":{"id":"1*XrbUBnZb-Vp9jRDGqU-BXQ@2x.png","originalWidth":2000,"originalHeight":2109,"alt":"Flutter"},"alignment":2,"layout":5},"streamItems":[{"createdAt":1732988812818,"randomId":"9b630156d22c","section":{"items":[{"post":{"postId":"204b7d20c45d"},"itemType":"post"}],"layout":4},"itemType":"section","type":"StreamItem"},{"createdAt":1732988812818,"randomId":"12f5a5b11626","section":{"items":[{"post":{"postId":"71377810fd26"},"itemType":"post"},{"post":{"postId":"f33d497b7c11"},"itemType":"post"},{"post":{"postId":"6c040f87d1e4"},"itemType":"post"},{"post":{"postId":"2210e39b04b9"},"itemType":"post"},{"post":{"postId":"7c963c064f8d"},"itemType":"post"},{"post":{"postId":"1ccf4d271226"},"itemType":"post"},{"post":{"postId":"fbde6c164fe3"},"itemType":"post"},{"post":{"postId":"5e211f708a37"},"itemType":"post"},{"post":{"postId":"597d4f3b450c"},"itemType":"post"}],"layout":4},"itemType":"section","type":"StreamItem"}]}) // ]]></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:'8eaca8cecc946028',t:'MTczMjk4ODgxMy4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body></html>

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