<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Amanda Fitch on Medium]]></title>
        <description><![CDATA[Stories by Amanda Fitch on Medium]]></description>
        <link>https://medium.com/@afitch_66294?source=rss-c4c58c97a41b------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*JXjnwMAb89ePR-FoV4-5Hg.jpeg</url>
            <title>Stories by Amanda Fitch on Medium</title>
            <link>https://medium.com/@afitch_66294?source=rss-c4c58c97a41b------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 05 Jul 2026 05:10:37 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@afitch_66294/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Announcing Dart 3.10]]></title>
            <link>https://medium.com/dartlang/announcing-dart-3-10-ea8b952b6088?source=rss-c4c58c97a41b------2</link>
            <guid isPermaLink="false">https://medium.com/p/ea8b952b6088</guid>
            <category><![CDATA[dart]]></category>
            <category><![CDATA[releases]]></category>
            <category><![CDATA[announcements]]></category>
            <dc:creator><![CDATA[Amanda Fitch]]></dc:creator>
            <pubDate>Wed, 12 Nov 2025 19:02:01 GMT</pubDate>
            <atom:updated>2025-11-12T19:19:05.044Z</atom:updated>
            <content:encoded><![CDATA[<p>Today, we’re excited to announce the release of Dart 3.10!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*AyAyohCAvBT-ta-nJPrkEg.png" /><figcaption>Announcing Dart 3.10</figcaption></figure><p>This release continues our focus on improving the core developer experience. The new <strong>dot shorthands</strong> (<strong>.</strong>) feature will help you write more readable and less verbose code. We’re also introducing a powerful new <strong>analyzer plugin system</strong> that allows you to create custom static analysis rules that integrate directly into your IDE. And we’re excited to announce that <strong>build hooks</strong> are now stable!</p><p>This release also brings several improvements to pub.dev and package management. You’ll find new search capabilities in the <strong>“Likes” tab</strong> in your profile, and package authors can now <strong>disable manual publishing</strong> for improved security. Finally, we’ve added a suite of new, more specific <strong>deprecation annotations</strong> to give you finer-grained control over your API’s evolution.</p><p>Read on to learn more about these and the other improvements in Dart 3.10.</p><h3>Language updates</h3><h4>Dot shorthands 🆕</h4><p>Dart 3.10 introduces <a href="https://dart.dev/language/dot-shorthands"><strong>dot shorthands</strong></a> (.). This new feature lets you omit redundant class or enum names when the compiler can infer the type from the context.</p><p>Let’s look at a common scenario: logging. Before, you might have written:</p><pre>enum LogLevel { info, warning, error, debug }<br><br>void logMessage(String message, {LogLevel level = LogLevel.info}) {<br>  // ... implementation<br>}<br><br>// Somewhere else in your app<br>logMessage(&#39;Failed to connect to database&#39;, level: LogLevel.error);</pre><p>Since the level parameter already expects a LogLevel, repeating the enum name is unnecessary. With dot shorthands, you can now write:</p><pre>enum LogLevel { info, warning, error, debug }<br><br>void logMessage(String message, {LogLevel level = .info}) {<br>  // ... implementation<br>}<br><br>// Somewhere else in your app<br>logMessage(&#39;Failed to connect to database&#39;, level: .error);</pre><p>The code now focuses on the <em>value</em> (.error) rather than the <em>type</em> (LogLevel).</p><p>Dot shorthands aren’t just for enums. You can also use them with constructors, static methods, and static fields. To learn more, read our <a href="https://dart.dev/language/dot-shorthands">Dot shorthands</a> guide.</p><h3>Tools updates</h3><h4>Analyzer plugins 🆕</h4><p>Have you ever been reviewing code and thought, “Shouldn’t the analyzer be able to catch that?”. Now it can.</p><p>Dart 3.10 introduces a powerful new plugin system for the Dart analyzer. This allows you to write and use your own static analysis rules that integrate directly into IDEs and command-line tools like dart analyze and flutter analyze. You can use <a href="https://dart.dev/tools/analyzer-plugins">analyzer plugins</a> to:</p><ul><li>Enforce project-specific rules, such as bespoke lints and warnings to maintain conventions in your team’s codebase.</li><li>Avoid common pitfalls and best practices specific to your domain.</li><li>Automate code changes by providing quick fixes and assists to help automatically correct issues or migrate to new APIs.</li></ul><p>This new system is the result of a significant architectural effort to enable a rich ecosystem of community-driven tools, and we’d like to extend a special thanks to community contributor <a href="https://github.com/FMorschel">Felipe Morschel</a> for his valuable fixes and features for the analyzer in general.</p><p>To use an analyzer plugin, simply add it to your <a href="https://dart.dev/tools/analysis#the-analysis-options-file">analysis_options.yaml</a> file:</p><pre>analyzer:<br>  plugins:<br>    - some_plugin<br>    - another_plugin</pre><p>To learn more about creating your own custom rules, see the documentation for <a href="https://dart.dev/tools/analyzer-plugins">writing an analyzer plugin</a>.</p><h4>Build hooks 🚀</h4><p>Integrating native code (like C++, Rust, or Swift) into a Dart package has often required managing complex, platform-specific build files like CMake or Gradle. With Dart 3.10, this process is now dramatically simpler.</p><p>We’re excited to announce that <strong>build hooks </strong>(formerly known as native assets) are now stable. You can use these hooks to compile native code or download native assets (like dynamic libraries) and bundle them directly with your Dart package. This powerful capability lets you reuse existing native code or libraries from within your package and eliminates the need to write separate build files such as SPM, Gradle, or CMake for different operating systems.</p><p>To learn more, see the documentation for <a href="https://dart.dev/tools/hooks">writing a build hook</a>, or watch the <a href="https://www.youtube.com/watch?v=AxNF5dj8HWQ">Flutter Build show episode</a> on build hooks.</p><h4>Remove Deprecations lint 🆕</h4><p>When you release a new major version of a package (like 1.0.0 or 0.2.0), it’s a best practice to remove any APIs you previously marked as deprecated. This keeps your package clean and prevents developers from using outdated code. However, it’s easy to forget this step during the release process.</p><p>To help, we’ve introduced a new lint: <a href="https://dart.dev/tools/linter-rules/remove_deprecations_in_breaking_versions/"><strong>remove_deprecations_in_breaking_versions</strong></a>. This lint detects leftover deprecated elements when a package’s version is updated to a new major breaking version. By flagging these cases, the lint helps ensure that your package’s API remains modern and easy for your users to understand.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*keU2TVVnlbe0e0UFtj3mwA.png" /><figcaption><strong>remove_deprecations_in_breaking_versions lint example</strong></figcaption></figure><h4>@Deprecated annotation ⬆️</h4><p>The existing <strong>@Deprecated</strong> annotation is a blunt instrument. It informs developers that an API is no longer recommended, but it doesn’t allow for nuance. For example, how do you signal that a class should no longer be extended, but can still be instantiated?</p><p>To give package authors more precise control over their API’s evolution, Dart 3.10 introduces a suite of new, more specific deprecation annotations.</p><p>You can now deprecate specific use cases for classes and mixins:</p><ul><li><a href="https://api.dart.dev/dev/latest/dart-core/Deprecated/Deprecated.extend.html">@Deprecated.extend()</a>: The ability to extend a class is deprecated.</li><li><a href="https://api.dart.dev/dev/latest/dart-core/Deprecated/Deprecated.implement.html">@Deprecated.implement()</a>: The ability to implement a class or mixin is deprecated.</li><li><a href="https://api.dart.dev/dev/latest/dart-core/Deprecated/Deprecated.subclass.html">@Deprecated.subclass()</a>: The ability to subclass (extend or implement) a class or mixin is deprecated.</li><li><a href="https://api.dart.dev/dev/latest/dart-core/Deprecated/Deprecated.mixin.html">@Deprecated.mixin()</a>: The ability to mix in a class is deprecated.</li><li><a href="https://api.dart.dev/dev/latest/dart-core/Deprecated/Deprecated.instantiate.html">@Deprecated.instantiate()</a>: The ability to instantiate a class is deprecated.</li></ul><p>Additionally, you can now signal that an optional parameter will become required in a future version using <a href="https://api.dart.dev/dev/latest/dart-core/Deprecated/Deprecated.optional.html">@Deprecated.optional()</a>.</p><h3>Pub updates</h3><h4>Search, sort, and unlike support for your favorite packages 🆕</h4><p>Managing your favorite packages on pub.dev just got a major upgrade. You can do this through the Search feature or the <a href="https://pub.dev/my-liked-packages">Likes tab</a> on your profile, where you can now search, sort, and filter your liked packages with the same familiar controls you use for regular searches. This includes sorting by likes, pub points, and popularity. We’ve also improved the UI for unliking packages, making it easier than ever to keep your list of liked packages tidy and up-to-date.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cOONo9VV-HsJPA0WMv1COQ.png" /><figcaption>Search, sort, and unlike support for your favorite packages in your Likes tab</figcaption></figure><p>If you choose to search for your liked packages with the Search feature, simply add is:liked-by-me to your query.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cO5K265sp2QbF-vNgcpFzQ.png" /><figcaption>Search, but only include packages you like</figcaption></figure><h4>Enable or disable manual publishing 🆕</h4><p>To enhance security and prevent accidental publications, you can now disable manual publishing (pub publish) for your packages. This is ideal for packages that have an automated publishing workflow or are no longer being actively published.</p><p>By disabling manual publishing, you prevent package updates using personal credentials, reducing the risk of an unauthorized or accidental release.</p><p>You can control this feature in your package’s <strong>Admin</strong> tab using the “Enable manual publishing” checkbox.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qBE5Jhe138ktNrcBIy5L1w.png" /><figcaption>Enable or disable manual publishing in the Admin tab</figcaption></figure><h3>Wrap up</h3><p>The Dart 3.10 release brings a host of improvements focused on developer productivity, tooling, and the overall health of the package ecosystem. From language features like dot shorthands that make your code more concise, to powerful new tooling capabilities like analyzer plugins and stable build hooks, we hope this release empowers you to build even better apps.</p><p>We’re incredibly grateful for the many engineers and teams who contributed to this release, including a special thanks to our community contributors who help make Dart better for everyone.</p><p>We’re excited to see what you build with Dart 3.10. To get started, you can get the Dart 3.10 SDK today. For a complete list of all the new and updated features, check out the <a href="https://github.com/dart-lang/sdk/blob/main/CHANGELOG.md">Dart SDK changelog</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ea8b952b6088" width="1" height="1" alt=""><hr><p><a href="https://medium.com/dartlang/announcing-dart-3-10-ea8b952b6088">Announcing Dart 3.10</a> was originally published in <a href="https://medium.com/dartlang">Dart</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Announcing Dart 3.9]]></title>
            <link>https://medium.com/dartlang/announcing-dart-3-9-ba49e8f38298?source=rss-c4c58c97a41b------2</link>
            <guid isPermaLink="false">https://medium.com/p/ba49e8f38298</guid>
            <category><![CDATA[mcp-server]]></category>
            <category><![CDATA[dart]]></category>
            <category><![CDATA[flutter]]></category>
            <dc:creator><![CDATA[Amanda Fitch]]></dc:creator>
            <pubDate>Thu, 14 Aug 2025 18:17:15 GMT</pubDate>
            <atom:updated>2025-08-14T18:17:15.018Z</atom:updated>
            <content:encoded><![CDATA[<p>Hello, Dart developers! The latest stable version, <strong>Dart 3.9</strong>, is officially here!</p><p>This release is all about making your work easier and your apps more efficient. With key updates to null safety, performance boosts to the Dart CLI, and the exciting addition of the Dart and Flutter MCP Server to empower your AI assistants, there’s a lot to love. Read on to discover everything that’s new in Dart 3.9.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VIHR_FuzQzulhqczfx8eAA.gif" /><figcaption>Announcing Dart 3.9</figcaption></figure><h3>Language updates</h3><h4>Null safety</h4><p>Dart 3.9 assumes null safety when computing type promotion, reachability, and definite assignment. To take advantage of these improvements, set your package’s SDK constraint lower bound to 3.9 or greater (sdk: ^3.9.0). As a result of this change, more dead_code warnings may be produced.</p><h4><strong>Soundness updates</strong></h4><p>We fixed a soundness issue that allowed direct invocation of a value returned from a getter without any runtime checks when the getter’s return type was a generic type argument instantiated as dynamic or Function. This soundness issue arose with the dev-compiler DDC, and no other tools are affected.</p><p>Before the fix the following getter could trigger an issue with a direct invocation. For example:</p><pre>// The following getter used to trigger an issue with a direct <br>// invocation<br><br>// The getter<br>class Container&lt;T&gt; {<br>  T get value =&gt; ((int i) =&gt; i.isEven) as T;<br>}<br><br>// The direct invocation<br>Container&lt;dynamic&gt;().value(&#39;Invocation with missing runtime checks!&#39;);</pre><h3>Tools updates</h3><h4><strong>Dart and Flutter MCP Server</strong></h4><p>The <a href="https://dart.dev/tools/mcp-server">Dart and Flutter MCP Server</a> acts as a bridge, giving AI coding assistants such as Gemini CLI, Cursor, and GitHub Copilot, access to more of your Dart project’s context. Instead of just suggesting code, your AI assistant can now understand your project deeply and take action on your behalf.</p><p>With the Dart and Flutter MCP Server, you can ask an AI assistant to:</p><ul><li>Fix runtime errors (<a href="https://dart.dev/tools/mcp-server#fix-a-runtime-layout-error-in-a-flutter-app">see example</a>).</li><li>Manage dependencies (<a href="https://dart.dev/tools/mcp-server#add-new-functionality-with-package-search">see example</a>).</li><li>Write and correct code.</li><li>And more.</li></ul><p>The Dart and Flutter MCP Server is now available on the stable channel of the Dart SDK.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3K1rgoDtIBWbIFZPp1VCEQ.gif" /><figcaption><em>Fixing a layout issue, enabled by the Dart and Flutter MCP Server (parts of this recording have been sped up)</em></figcaption></figure><h4><strong>Faster Dart CLI</strong></h4><p>Previously, when you ran some <a href="https://dart.dev/tools/dart-tool">Dart CLI commands</a> like dart analyze<strong> </strong>and dart fix, your computer had to compile the code for the <a href="https://github.com/dart-lang/sdk/blob/main/pkg/analysis_server/README.md">analysis server</a> just before running it. Now, these tools use an Ahead-Of-Time (AOT) compiled snapshot of the analysis server, which means the server has been pre-compiled into fast, native machine code.</p><p>Results vary depending on the source code, but we ran some common commands on a sample package and got some interesting results. Some short commands like dart format now complete in a fraction of the time and longer running ones like dart analyze got nearly 50% faster.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NkNNA4xfB08k9FjtIHSTEw.png" /><figcaption>Example performance results after the Dart CLI update</figcaption></figure><h4><strong>pub client updates</strong></h4><p><a href="https://dart.dev/tools/pub/dependencies#git-packages">Git dependencies</a> can now be version-solved based on git tags.</p><p>When you use a tag_pattern in the descriptor and there is a version constraint, all commits matching the pattern are considered during resolution. In the following example, only version 2.0.1 of my_dependency and higher is considered:</p><pre>dependencies:<br>  my_dependency:<br>    git:<br>      url: https://github.com/example/my_dependency<br>      tag_pattern: v{{version}}<br>    version: ^2.0.1</pre><p>Starting from language version 3.9, the flutter constraint upper bound is now respected in your root package (the dart constraint was already respected). Setting a narrow dart or flutter constraint can be useful to ensure a team of developers all use the same SDK version when jointly developing an app (see <a href="https://github.com/flutter/flutter/issues/95472">issue #95472</a> for details).</p><p>For example, in a root pubspec like this pub get will fail if invoked with a version of the Flutter SDK that is not 3.33.0:</p><pre>name: my_app<br>environment:<br>  sdk: ^3.9.0<br>  flutter: 3.33.0</pre><h4><strong>Dart native compiler</strong></h4><p>We added <a href="https://dart.dev/tools/dart-compile#cross-compilation-exe">cross-compilation support</a> for target architectures of arm (ARM32) and riscv64 (RV64GC) when the target OS is Linux.</p><h3>Deprecations &amp; breaking changes</h3><h4><strong>32-bit x86 architecture</strong></h4><p>Dart has deprecated the 32-bit x86 architecture. For most developers this will have no impact, as it mainly affects older x86-based Android emulators and a small number of physical devices. 32-bit ARM and 64-bit x86_64 emulators and devices are still supported. The full technical breakdown is available in the <a href="https://github.com/dart-lang/sdk/issues/49969">Dart GitHub deprecation issue</a>.</p><h4><strong>dart build</strong></h4><p>dart build is in preview on the beta channel.</p><p>dart build -f exe &lt;target&gt; is now dart build cli — target=&lt;target&gt;. See dart build cli — help for more info.</p><h3>Wrap up</h3><p>That’s a wrap on Dart 3.9! We hope you’re as excited about these updates as we are. We always appreciate your feedback, so feel free to share your thoughts. Until next time, happy coding!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ba49e8f38298" width="1" height="1" alt=""><hr><p><a href="https://medium.com/dartlang/announcing-dart-3-9-ba49e8f38298">Announcing Dart 3.9</a> was originally published in <a href="https://medium.com/dartlang">Dart</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Unleash new AI capabilities for Flutter in Firebase Studio]]></title>
            <link>https://blog.flutter.dev/unleash-new-ai-capabilities-for-flutter-in-firebase-studio-9a8c94564635?source=rss-c4c58c97a41b------2</link>
            <guid isPermaLink="false">https://medium.com/p/9a8c94564635</guid>
            <category><![CDATA[spotlight]]></category>
            <category><![CDATA[flutter]]></category>
            <category><![CDATA[firebase-studio]]></category>
            <category><![CDATA[gemini]]></category>
            <dc:creator><![CDATA[Amanda Fitch]]></dc:creator>
            <pubDate>Wed, 23 Jul 2025 05:02:36 GMT</pubDate>
            <atom:updated>2025-07-23T05:02:36.039Z</atom:updated>
            <content:encoded><![CDATA[<p>Flutter development just got a lot smarter in Firebase Studio! At I/O Connect India, we unveiled new AI-powered features designed to give you a more automated and productive workflow. In this post, we’ll dive into the new AI enhancements specifically for Flutter in Firebase Studio, and show you how you can use them to build powerful applications like the demo we showcased on stage.</p><h3>Upgraded AI-optimized Flutter template</h3><p>The Flutter template in <a href="https://firebase.studio/">Firebase Studio</a> received a significant upgrade. With its new AI capabilities, you can optimize your workspace for an AI-first experience. For example, when building the I/O Connect India demo with this new template, Firebase Studio generated a multi-screen, e-commerce app complete with state management, Firebase authentication, products, a cart, and checkout. The AI-optimized template defaults to autonomous Agent mode, allowing Gemini to make changes directly without waiting for approval. We’ve also incorporated rules for Gemini into an (automatically generated) airules.md file to further refine the code Gemini generates, enabling you to add features or generate an entire Flutter app in a more streamlined flow.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*lPy6kRkj2N5ybEhHIKjbVw.gif" /><figcaption>The Flutter template in Firebase Studio has been upgraded for an AI-first experience</figcaption></figure><h3>Autonomously make changes</h3><p>Previously, when working on a Flutter project in Firebase Studio, you would manually approve each code change in Agent mode. This workflow has evolved significantly and can make edits autonomously (independently and automatically). With the new Agent (Auto-run) mode, Gemini can now autonomously make changes, generate entire apps, and add features in a streamlined flow. For instance, when developing an app similar to our I/O Connect India demo, you can use Agent (Auto-run) mode to seamlessly integrate Firebase backend services and implement complex navigation patterns in a single interaction. Given Gemini’s robust support for Dart and Flutter, this autonomous mode keeps you in the development flow. And if a change isn’t exactly what you intended, rest assured that Firebase Studio leverages Git, allowing you to quickly revert your changes to a previous commit.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*i5KGoCCzGQXV5SuTYhbpbw.gif" /><figcaption>Agent (Auto-run) mode with a Flutter project in Firebase Studio</figcaption></figure><h3>AI rules</h3><p>With the upgraded Flutter template, we’ve incorporated AI instructions into a new file: airules.md. This file (located at the root of your project), contains explicit rules for Gemini to follow as it generates code, enhancing the quality and relevance of the output. You have the flexibility to either use the default AI rules or customize them to fit your project’s specific needs. While there are numerous rules, here are a few examples:</p><ul><li>Act as a Flutter co-developer</li><li>Writes unit tests</li><li>Proactively look for and fix errors</li><li>Choose which themes, tools, extensions, and startup commands to use</li><li>Add and remove Flutter packages</li><li>Adhere to Flutter and Dart best practices for code quality</li><li>Set up complex navigation</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FPNH3GWzShcGYInVxc30qA.gif" /><figcaption>Overview of the default Flutter AI rules (airules.md) in Firebase Studio</figcaption></figure><h3>Compatible with Dart MCP Server</h3><p>Firebase Studio now includes foundational support for the Model Context Protocol (MCP), and we’re excited to share that it works with our <a href="https://dart.dev/tools/mcp-server">Dart MCP Server</a>. When integrated within Firebase Studio, the Dart MCP Server empowers Gemini in Firebase Studio to analyze and automatically fix Dart and Flutter-specific errors in your project’s code. You can also efficiently search pub.dev for optimal packages, manage dependencies in pubspec.yaml, run tests, and much more. For example, when building a Flutter app similar to the one we demoed on stage at I/O Connect India, Gemini should identify and autonomously correct both static and runtime errors. Currently, Dart MCP Server is in beta.</p><p>To learn how you can use the Dart MCP Server while building your Flutter app in Firebase Studio, see the <a href="https://medium.com/flutter/supercharge-your-dart-flutter-development-experience-with-the-dart-mcp-server-2edcc8107b49">Supercharge Your Dart &amp; Flutter Development Experience with the Dart MCP Server</a> blog post.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*CHTpeFMydBD0KQY9" /><figcaption>Dart MCP Server configuration for a Flutter app in Firebase Studio</figcaption></figure><h3>Build with us</h3><p>We have ambitious plans for the continued integration of Firebase Studio with Flutter, and we’re eager to <a href="https://community.firebasestudio.dev/">hear your feedback on using Flutter in Firebase Studio</a> as you explore these new capabilities. We’re incredibly excited to see what you create!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9a8c94564635" width="1" height="1" alt=""><hr><p><a href="https://blog.flutter.dev/unleash-new-ai-capabilities-for-flutter-in-firebase-studio-9a8c94564635">Unleash new AI capabilities for Flutter in Firebase Studio</a> was originally published in <a href="https://blog.flutter.dev">Flutter</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Announcing Dart 3.8]]></title>
            <link>https://medium.com/dartlang/announcing-dart-3-8-724eaaec9f47?source=rss-c4c58c97a41b------2</link>
            <guid isPermaLink="false">https://medium.com/p/724eaaec9f47</guid>
            <category><![CDATA[announcements]]></category>
            <category><![CDATA[dart]]></category>
            <category><![CDATA[dartlang]]></category>
            <category><![CDATA[flutter]]></category>
            <dc:creator><![CDATA[Amanda Fitch]]></dc:creator>
            <pubDate>Tue, 20 May 2025 18:08:39 GMT</pubDate>
            <atom:updated>2025-05-20T18:09:48.203Z</atom:updated>
            <content:encoded><![CDATA[<p>This release brings formatter updates, null-aware elements for collections, new cross-platform development capabilities, a better way to find trending packages on pub.dev, availability of hot reload on the web, and more! We’re also hoping there are a few developers out there who are interested in joining our FFigen and JNIgen early access program.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cTcqAst5m1Vn6k71VWgTrQ.gif" /><figcaption>Announcing Dart 3.8</figcaption></figure><h3>Formatter updates</h3><p>In the previous release, Dart included a largely rewritten formatter that supported a new <a href="https://github.com/dart-lang/dart_style/issues/1253">“tall” style</a>. The Dart 3.8 release incorporates additional feedback, fixes bug reports, and adds other improvements.</p><p>Note that if you upgrade to the Dart 3.8 SDK, your formatting won’t change until you change your package’s pubspec to opt in to the latest language version.</p><h4><strong>Trailing commas and taller code</strong></h4><p>In prior releases, a trailing comma would force the surrounding construct to split. The new formatter now decides whether a construct should split and then adds or removes the trailing comma as needed.</p><pre>// Before formatter<br>TabBar(tabs: [Tab(text: &#39;A&#39;), Tab(text: &#39;B&#39;)], labelColor: Colors.white70);<br><br>// After formatter<br>TabBar(<br>  tabs: [<br>    Tab(text: &#39;A&#39;),<br>    Tab(text: &#39;B&#39;),<br>  ],<br>  labelColor: Colors.white70,<br>);</pre><p>If you prefer the old behavior, you can re-enable it with a <a href="https://github.com/dart-lang/dart_style/wiki/Configuration">configuration</a> flag.</p><h4><strong>Style changes</strong></h4><p>A number of style changes were added that tighten up and improve output. Here are some examples:</p><pre>// Previously released formatter (functions)<br>function(<br>  name:<br>      (param) =&gt; another(<br>        argument1,<br>        argument2,<br>      ),<br>);<br><br>// Dart 3.8 formatter (functions)<br>function(<br>  name: (param) =&gt; another(<br>    argument1,<br>    argument2,<br>  ),<br>);</pre><pre>// Previously released formatter (variables)<br>variable =<br>    target.property<br>        .method()<br>        .another();<br><br>// Dart 3.8 formatter (variables)<br>variable = target.property<br>    .method()<br>    .another();</pre><h3>Cross compilation</h3><p>There is new support to <a href="https://dart.dev/tools/dart-compile#cross-compilation-exe">compile</a> to native Linux binaries from Windows, macOS, and Linux development machines. You can do this with the dart compile exe or dart compile aot-snapshot command and the --target-os and --target-arch flags.</p><pre>// cross compilation example for an exe<br>$ dart compile exe --target-os=linux --target-arch=arm64</pre><pre>// cross compilation example for an aot-snapshot<br>$ dart compile aot-snapshot --target-os=linux --target-arch=arm64</pre><p>Sample use cases:</p><ul><li>Quicker compiles for embedded devices (for example, a Raspberry Pi) on a fast developer laptop, as opposed to the less powerful embedded device.</li><li>Quicker compiles for a Linux-based backend on a non-Linux developer machine.</li></ul><h3><strong>Null-aware elements</strong></h3><p>New <a href="https://dart.dev/language/collections#null-aware-element">null-aware elements</a> let you add elements to a collection such as a list, set, or map, if the elements are not null. To make an element a null-aware element in a collection literal, prepend the element with ?.</p><p>A list without null-aware elements that removes null values:</p><pre>// Code without null-aware elements<br>var listWithoutNullAwareElements = [<br>  if (promotableNullableValue != null)<br>    promotableNullableValue,<br>  if (nullable.value != null)<br>    nullable.value!,<br>  if (nullable.value case var value?)<br>    value,<br>];</pre><p>A list with null-aware elements that removes null values:</p><pre>// Code with null-aware elements<br>var listWithNullAwareElements = [<br>  ?promotableNullableValue,<br>  ?nullable.value,<br>  ?nullable.value,<br>];</pre><h3>Doc imports</h3><p>There is now support for doc imports, a new comment-based syntax which enables external elements to be referenced in documentation comments without actually importing them. This tag can be specified in a doc comment above a library directive.</p><p>In the following example, [Future] and [Future.value] are imported from the dart:async library, but only for documentation comments:</p><pre>/// @docImport &#39;dart:async&#39;;<br>library;<br><br>/// Doc comments can now reference elements like<br>/// [Future] and [Future.value] from `dart:async`,<br>/// even if the library is not imported with an<br>/// actual import.<br>class Foo {}</pre><p>Doc imports support the same URI styles as regular Dart imports, including the dart: scheme, package: scheme and relative paths. However, they can’t be deferred or configured with as, show, hide.</p><h3>Trending packages on pub.dev</h3><p>The <a href="https://pub.dev/">pub.dev landing page</a> replaces the “Most Popular Packages” section with the “Trending Packages” section. This new section showcases packages that have recently demonstrated notable growth in adoption and community interest.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hwpiNbr2JrUE8cROV3KagQ.png" /><figcaption>Trending packages section on pub.dev</figcaption></figure><h3>Hot reload on the web (experimental)</h3><p>Stateful hot reload is now available on the web when you use the Dart Development Compiler (DDC). A redesign of the JS representation of Dart code lets you swap out code in a running application.</p><p>Work is still iterating on this feature, but Dart 3.8 provides the first opportunity to try it, starting with Flutter apps. See the <a href="https://medium.com/flutter/whats-new-in-flutter-3-32-40c1086bab6e">Flutter blog post</a> for instructions on how to enable hot reload.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/864/0*NB_4jaD3XtdHpCQm" /><figcaption>Dart stateful hot reload for web</figcaption></figure><p>This was a multiyear effort that included changing the runtime type representation, redesigning class hierarchies, and updating the way code loads into the page. The goal is to reach full parity with the VM’s existing hot reload implementation. In almost all cases, the feature should already be indistinguishable from what you are used to from the VM. You can find all known issues in the <a href="https://github.com/orgs/dart-lang/projects/107/views/1?filterQuery=-status%3ADone">issue tracker</a>.</p><p>The focus makes this feature accessible in Flutter apps first, but the plan is to integrate hot reload into build_web_compilers for use within non-Flutter web apps later.</p><h3>Direct native interoperability</h3><p>We’re excited to launch an early access program for FFigen and JNIgen, the codegen solutions designed to simplify native platform API integration. We are seeking Flutter plugin authors who want to develop or refactor plugins with these solutions.</p><p>To learn more, read the blog post titled <a href="https://medium.com/@mariam.hasnany/4bf7d4579d9a">Flutter’s Path Towards Seamless Interop</a>. It covers our aspirations for direct native interoperability, the roadmap to achieve them, and the early access program.</p><h3>Wrap up</h3><p>Dart 3.8 is a testament to our ongoing commitment to refine the development experience. We encourage you to explore these new features — from the intelligent formatter and cross-compilation support to null-aware elements, web hot reload, and the early access for native interop. Your insights and contributions are vital to Dart and Flutter’s continuous growth, and we can’t wait to see the apps you’ll bring to life.</p><p>Upgrade to Dart 3.8 today and happy coding!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=724eaaec9f47" width="1" height="1" alt=""><hr><p><a href="https://medium.com/dartlang/announcing-dart-3-8-724eaaec9f47">Announcing Dart 3.8</a> was originally published in <a href="https://medium.com/dartlang">Dart</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Gemini for DartPad]]></title>
            <link>https://medium.com/dartlang/gemini-for-dartpad-ca962729cee6?source=rss-c4c58c97a41b------2</link>
            <guid isPermaLink="false">https://medium.com/p/ca962729cee6</guid>
            <category><![CDATA[dart]]></category>
            <category><![CDATA[dartpad]]></category>
            <category><![CDATA[flutter]]></category>
            <category><![CDATA[announcements]]></category>
            <category><![CDATA[gemini]]></category>
            <dc:creator><![CDATA[Amanda Fitch]]></dc:creator>
            <pubDate>Tue, 08 Apr 2025 16:06:48 GMT</pubDate>
            <atom:updated>2025-04-08T17:39:50.768Z</atom:updated>
            <content:encoded><![CDATA[<h4>DartPad gets a Gemini boost</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*nI_hhzL5l94Pvdtlzs32oA.png" /></figure><p>Hi developers!</p><p>DartPad is where so many of us try out new ideas, learn the nuances of Dart and Flutter, and experiment right in the browser. We’re excited to make that process even faster and more productive. Say hello to <strong>Gemini in DartPad!</strong> You can now:</p><ul><li>Generate new code from a prompt.</li><li>Use images such as UX mocks and screenshots for code generation.</li><li>Refactor existing code from a prompt.</li><li>Suggest code fixes for analysis and run-time errors.</li></ul><p>Let’s go over these cool new features in detail.</p><h3>Generate new code from a prompt</h3><p>DartPad users can now leverage Gemini to generate new Dart or Flutter code snippets directly from a natural language prompt.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/890/1*fkZRgeIbh-ZiF2ETOn-uDg.gif" /><figcaption>Create Dart &amp; Flutter code from an AI prompt</figcaption></figure><h3>Use images to aid in code generation</h3><p>You can also add images to your prompts. The images can be used to aid in code generation.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/816/1*iGBCoFPCUhjawwPIJ0o6mQ.gif" /><figcaption>Use images to aid in code generation</figcaption></figure><h3>Refactor existing code from a prompt</h3><p>Beyond generating entirely new snippets, Gemini in DartPad can help you iterate and modify your existing code.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/993/1*VtwjjXJKH_Ag0yFBcPZV1g.gif" /><figcaption>Refactor existing code from a prompt</figcaption></figure><h3>Suggest code fixes for analysis errors</h3><p>Building upon DartPad’s existing capability to display diagnostic messages from the Dart Analyzer, we’ve integrated Gemini to help address issues that might arise in your code. If your code snippet has errors flagged in the analysis panel, you can simply select the Gemini icon in the analysis panel, review the suggested change, and accept it if you agree.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*N_XSofVUfkszjq-byDEAoA.gif" /><figcaption>Suggest code fixes for analysis errors</figcaption></figure><h3>Suggest code fixes for run-time errors</h3><p>DartPad can also provide error fix suggestions for run-time errors.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Ej5VLgICUX-WYgBhQgydhg.gif" /><figcaption>Suggest code fixes for run-time errors</figcaption></figure><h3>In conclusion</h3><p>DartPad is focused on finding ways to lower the barrier to try new ideas and learn more about Dart and Flutter. Our new integration with Gemini is another step along that path and makes it even easier for you to experiment and explore. We can’t wait to see what you build!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ca962729cee6" width="1" height="1" alt=""><hr><p><a href="https://medium.com/dartlang/gemini-for-dartpad-ca962729cee6">Gemini for DartPad</a> was originally published in <a href="https://medium.com/dartlang">Dart</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Announcing Flutter AI Toolkit]]></title>
            <link>https://blog.flutter.dev/announcing-flutter-ai-toolkit-e36b16a840d2?source=rss-c4c58c97a41b------2</link>
            <guid isPermaLink="false">https://medium.com/p/e36b16a840d2</guid>
            <category><![CDATA[gemini]]></category>
            <category><![CDATA[flutter]]></category>
            <category><![CDATA[announcements]]></category>
            <category><![CDATA[ai]]></category>
            <dc:creator><![CDATA[Amanda Fitch]]></dc:creator>
            <pubDate>Tue, 17 Dec 2024 19:02:25 GMT</pubDate>
            <atom:updated>2024-12-17T20:18:00.717Z</atom:updated>
            <content:encoded><![CDATA[<h4>Want AI chat in your Flutter app? This toolkit makes it easy.</h4><p>Flutter AI developers, rejoice! Adding an AI-powered chat experience to your app just got a whole lot easier. Introducing <a href="https://pub.dev/packages/flutter_ai_toolkit">Flutter AI Toolkit</a>, a collection of ready-to-use AI chat widgets designed to seamlessly integrate into your Flutter projects. No more building complex chat interfaces from scratch — Flutter AI Toolkit provides everything you need to quickly and easily add a sophisticated AI chat window to your app. Ready to boost customer engagement and satisfaction across multiple platforms? You’ve got this!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/418/0*8PFN57i3DaWcEBvk" /><figcaption><a href="https://idx.google.com/new?template=https%3A%2F%2Fgithub.com%2Fflutter%2Fai">Try Flutter AI Toolkit in Project IDX!</a></figcaption></figure><h3>Multi-turn chat</h3><p>With multi-turn chat, you can maintain context across multiple interactions in the same session.</p><p>Imagine you’re talking to a friend. They ask if you have a pet and you tell them that you have a pet rock named Rocky. A little while later after chatting with you about other things, your friend asks “How long have you had Rocky?” The friend remembers your pet rock from an earlier conversation, even though you didn’t mention it again.</p><p>That’s essentially what multi-turn chat does! It helps the LLM (generative AI Large Language Model) remember what is being talked about.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/904/1*u_atZ9LOO85MJMWdLFvxow.png" /><figcaption>Multi-turn chat in Flutter AI Toolkit</figcaption></figure><h3>Rich text display</h3><p>Rich-text format is supported in the responses produced by the LLM. Instead of producing just plain-text words, the LLM can format the text to be more interesting to read. For example, the response could include bold text, images, bullets, and more.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/920/1*m5BA-Jaa7l9uPr9NHoWjKA.png" /><figcaption>Rich-format support in Flutter AI Toolkit</figcaption></figure><h3>Voice input</h3><p>Voice input can be used to convert messages to text. This hands-free option is perfect for those who prefer not to type or who want a faster way to compose messages.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/768/0*KgA9lHvHX_FF3r50" /><figcaption>Voice input support in Flutter AI Toolkit</figcaption></figure><h3>Multimedia attachments</h3><p>Pictures, videos, audio, PDFs, and other files can be added to conversations separately or all together.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/922/1*HxICVJ2oeINpsTb4DDdnqg.png" /><figcaption>Multimedia attachment support in Flutter AI Toolkit</figcaption></figure><h3>Custom response widgets</h3><p>Design specialized UI components for responses. For example, if someone requests a recipe, you can show an interactive recipe card with an option to save the recipe directly to a database.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/924/1*j-2lxsZJ-WEREg7X4O7Cog.png" /><figcaption>Custom AI response widget support in Flutter AI Toolkit</figcaption></figure><h3>Custom styling</h3><p>Configure the chat appearance to match your app. Change the colors of the chat bubbles, the background, the UI fonts, and even add UI pictures or animations to reflect your brand identity.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/722/1*ctMwVabsBVXa-ppooNwGsw.png" /><figcaption>Custom styling support in Flutter AI Toolkit</figcaption></figure><h3>Cross-platform support</h3><p>Flutter supports many platforms and so does Flutter AI Toolkit. Want to deploy an AI chat app made with Flutter on iOS, Android, web, and macOS? No problem!</p><h3>Pluggable LLMs</h3><p>Flutter AI Toolkit makes it easy to add AI to your app, whether you want to use Google’s Gemini or Vertex AI, or even another LLM. GeminiProvider and VertexProvider are available for out-of-the-box integration, using the <a href="https://pub.dev/packages/google_generative_ai">Google AI Dart SDK</a> and <a href="https://pub.dev/packages/firebase_vertexai">Vertex AI in Firebase SDK</a> respectively. We highly recommend that you use the Vertex AI in Firebase SDK for production use cases beyond prototyping. In addition, you can leverage Flutter AI Toolkit’s LLM provider interface to plug in the LLM of your choice with your own custom code.</p><h3>Stand-alone chat app with multiple conversations</h3><p>Build a full-fledged chat app that can store and manage multiple conversations. To help you get started, Flutter AI Toolkit comes with a sample project that leverages a <a href="https://firebase.google.com/docs/firestore">Cloud Firestore</a> database and <a href="https://firebase.google.com/docs/vertex-ai">Vertex AI in Firebase</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*gAt7fwWLXUWX_nHPwzYzxg.png" /><figcaption>Flutter AI Chat App</figcaption></figure><h3>Try Flutter AI Toolkit now</h3><p>To try Flutter AI Toolkit yourself, check out <a href="https://pub.dev/packages/flutter_ai_toolkit">Flutter AI Toolkit on pub.dev</a> and the following resources:</p><ul><li><a href="https://docs.flutter.dev/ai-toolkit/user-experience">Flutter AI Toolkit documentation</a></li><li><a href="https://flutter-ai-toolkit-examp-60bad.web.app/">Flutter AI Toolkit interactive demo</a> (<a href="https://github.com/flutter/ai/blob/main/example/lib/demo/demo.dart">GitHub</a>)</li><li><a href="https://github.com/flutter/ai/tree/main/example/lib/recipes">Recipe example project (GitHub)</a></li><li><a href="https://github.com/csells/flutter_ai_chat/blob/main/README.md">Flutter AI Chat sample app (GitHub)</a></li><li><a href="https://idx.google.com/new?template=https%3A%2F%2Fgithub.com%2Fflutter%2Fai">Get started in the browser (Project IDX)</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e36b16a840d2" width="1" height="1" alt=""><hr><p><a href="https://blog.flutter.dev/announcing-flutter-ai-toolkit-e36b16a840d2">Announcing Flutter AI Toolkit</a> was originally published in <a href="https://blog.flutter.dev">Flutter</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>