<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: YeLinAung</title>
    <description>The latest articles on DEV Community by YeLinAung (@b14cknc0d3).</description>
    <link>https://dev.to/b14cknc0d3</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F850407%2F7511a3b6-959f-4701-9865-93d6c1f1bd7d.jpg</url>
      <title>DEV Community: YeLinAung</title>
      <link>https://dev.to/b14cknc0d3</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/b14cknc0d3"/>
    <language>en</language>
    <item>
      <title>Return a Result From a Route</title>
      <dc:creator>YeLinAung</dc:creator>
      <pubDate>Sat, 19 Sep 2026 17:43:48 +0000</pubDate>
      <link>https://dev.to/dust-codegen/return-a-result-from-a-route-26hd</link>
      <guid>https://dev.to/dust-codegen/return-a-result-from-a-route-26hd</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxj568intqu6ghkeqaawz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxj568intqu6ghkeqaawz.png" alt="Dust Routing code snapshot showing a support screen returning a boolean result to its caller" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open a screen and wait for one result.&lt;/p&gt;

&lt;p&gt;The support route declares &lt;code&gt;result: bool&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Its generated &lt;code&gt;push()&lt;/code&gt; returns &lt;code&gt;Future&amp;lt;bool?&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The support screen tracks whether a message was sent.&lt;/p&gt;

&lt;p&gt;The back action returns that value with &lt;code&gt;context.navigator.pop&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The caller shows confirmation only when the result is &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Docs used: &lt;a href="https://github.com/y3l1n4ung/dust/blob/main/docs/usage/routing.md#typed-route-results" rel="noopener noreferrer"&gt;typed route results&lt;/a&gt; and the &lt;a href="https://github.com/y3l1n4ung/dust/blob/main/examples/shopping_app/lib/features/support/views/support_chat_screen.dart" rel="noopener noreferrer"&gt;shopping app support flow&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Dust #Routing #Flutter #Dart
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>Switch the App Language</title>
      <dc:creator>YeLinAung</dc:creator>
      <pubDate>Thu, 17 Sep 2026 18:46:14 +0000</pubDate>
      <link>https://dev.to/dust-codegen/switch-the-app-language-41li</link>
      <guid>https://dev.to/dust-codegen/switch-the-app-language-41li</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxe9b9oq2vpbmetyf6yjy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxe9b9oq2vpbmetyf6yjy.png" alt="Dust i18n code snapshot showing a language button and Flutter locale wiring" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Switch the app language without restarting the page.&lt;/p&gt;

&lt;p&gt;The shopping example reads the current locale from &lt;code&gt;I18nScope&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The button picks &lt;code&gt;en&lt;/code&gt; or &lt;code&gt;my&lt;/code&gt;, then calls &lt;code&gt;setLocale&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Widgets under the scope rebuild with the new locale.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;MaterialApp&lt;/code&gt; uses the generated locale, supported locales, and delegates.&lt;/p&gt;

&lt;p&gt;The same controller drives Dust text and Flutter's built-in localized widgets.&lt;/p&gt;

&lt;p&gt;Docs used: &lt;a href="https://github.com/y3l1n4ung/dust/blob/main/docs/usage/i18n.md#switching-locales" rel="noopener noreferrer"&gt;switching locales&lt;/a&gt; and the &lt;a href="https://github.com/y3l1n4ung/dust/blob/main/examples/shopping_app/lib/features/products/views/products_screen_chrome.dart" rel="noopener noreferrer"&gt;shopping app language button&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Dust #I18n #Flutter #Dart
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>Post One JSON Body</title>
      <dc:creator>YeLinAung</dc:creator>
      <pubDate>Tue, 15 Sep 2026 18:41:00 +0000</pubDate>
      <link>https://dev.to/dust-codegen/post-one-json-body-3o6e</link>
      <guid>https://dev.to/dust-codegen/post-one-json-body-3o6e</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F81yafbae53j4efzyohh4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F81yafbae53j4efzyohh4.png" alt="Dust code snapshot showing a generated HTTP body call and a dust_server JSON body handler" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Post one JSON body.&lt;/p&gt;

&lt;p&gt;The client owns the request shape.&lt;/p&gt;

&lt;p&gt;The generated HTTP client sends it with &lt;code&gt;@Body()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The server reads the same shape with &lt;code&gt;validBody&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Bad JSON shape returns 422.&lt;/p&gt;

&lt;p&gt;Bad validation also returns 422.&lt;/p&gt;

&lt;p&gt;The handler only runs after the body is decoded and validated.&lt;/p&gt;

&lt;p&gt;Docs used: &lt;a href="https://github.com/y3l1n4ung/dust/blob/main/docs/dust_server/tutorial.md" rel="noopener noreferrer"&gt;dust_server tutorial&lt;/a&gt;, &lt;a href="https://github.com/y3l1n4ung/dust/blob/main/docs/dust_server/extraction.md" rel="noopener noreferrer"&gt;dust_server extraction&lt;/a&gt;, and &lt;a href="https://github.com/y3l1n4ung/dust/blob/main/docs/usage/http.md#request-bodies" rel="noopener noreferrer"&gt;Dust HTTP bodies&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Dust #DustServer #HTTPClient #Validation #Flutter
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>Find One Flutter Request on the Server</title>
      <dc:creator>YeLinAung</dc:creator>
      <pubDate>Mon, 14 Sep 2026 19:43:02 +0000</pubDate>
      <link>https://dev.to/dust-codegen/find-one-flutter-request-on-the-server-13oh</link>
      <guid>https://dev.to/dust-codegen/find-one-flutter-request-on-the-server-13oh</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fruphpxmmjvbwd1oetahx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fruphpxmmjvbwd1oetahx.png" alt="Dust tutorial showing Flutter HTTP header mapping and dust_server tracing for one API request" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Find one Flutter request on the server.&lt;/p&gt;

&lt;p&gt;That is basic full-stack debugging.&lt;/p&gt;

&lt;p&gt;Flutter DevTools can show the app’s network call. The server still needs a way to find the same request in its own logs or traces.&lt;/p&gt;

&lt;p&gt;Dust keeps that path explicit.&lt;/p&gt;

&lt;p&gt;The Flutter HTTP client can send a header with the request. &lt;code&gt;dust_server&lt;/code&gt; tracing can read the standard &lt;code&gt;traceparent&lt;/code&gt; header. If it is valid, the server span joins the same trace. If it is missing, the server starts a new trace.&lt;/p&gt;

&lt;p&gt;The response also carries &lt;code&gt;traceparent&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So the flow stays simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flutter sends the API call;&lt;/li&gt;
&lt;li&gt;the generated client maps the header;&lt;/li&gt;
&lt;li&gt;the server records the request span;&lt;/li&gt;
&lt;li&gt;the response gives back the trace id.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not put secrets in trace data. Use ids that are safe to store.&lt;/p&gt;

&lt;p&gt;Docs used: &lt;a href="https://docs.flutter.dev/tools/devtools/network" rel="noopener noreferrer"&gt;Flutter DevTools Network view&lt;/a&gt;, &lt;a href="https://github.com/y3l1n4ung/dust/blob/main/docs/usage/http.md#parameters" rel="noopener noreferrer"&gt;Dust HTTP header parameters&lt;/a&gt;, &lt;a href="https://github.com/y3l1n4ung/dust/blob/main/docs/dust_server/tracing.md" rel="noopener noreferrer"&gt;dust_server tracing&lt;/a&gt;, and &lt;a href="https://github.com/y3l1n4ung/dust/blob/main/docs/dust_server/middleware.md" rel="noopener noreferrer"&gt;dust_server middleware&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Dust #DustServer #HTTPClient #Flutter
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>Serve the API and Flutter App Together</title>
      <dc:creator>YeLinAung</dc:creator>
      <pubDate>Sun, 13 Sep 2026 17:53:29 +0000</pubDate>
      <link>https://dev.to/dust-codegen/serve-the-api-and-flutter-app-together-3jmb</link>
      <guid>https://dev.to/dust-codegen/serve-the-api-and-flutter-app-together-3jmb</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw7ukde5rvegtpp5wddsl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw7ukde5rvegtpp5wddsl.png" alt="Dust tutorial showing a Dart server serving API routes and a Flutter web app together" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Serve the API and Flutter app from one Dart server.&lt;/p&gt;

&lt;p&gt;That is a simple full-stack setup.&lt;/p&gt;

&lt;p&gt;The API owns the &lt;code&gt;/api&lt;/code&gt; routes.&lt;/p&gt;

&lt;p&gt;The Flutter app owns the browser routes, like &lt;code&gt;/products/42&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;dust_server&lt;/code&gt; can put both behind one router. API routes run first. Anything the API does not claim can fall back to the built Flutter web app.&lt;/p&gt;

&lt;p&gt;This matters for path URLs.&lt;/p&gt;

&lt;p&gt;If a user refreshes &lt;code&gt;/products/42&lt;/code&gt;, the server should send &lt;code&gt;index.html&lt;/code&gt;. Then Flutter Routing can read the URL and open the right screen.&lt;/p&gt;

&lt;p&gt;The app logic stays split:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;server routes handle API work;&lt;/li&gt;
&lt;li&gt;Flutter routes handle screens;&lt;/li&gt;
&lt;li&gt;the generated HTTP client calls &lt;code&gt;/api&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;the same server serves the built app.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not server-side rendering. It is one process serving an API and a client-side Flutter app.&lt;/p&gt;

&lt;p&gt;Docs used: &lt;a href="https://github.com/y3l1n4ung/dust/blob/main/docs/dust_server/web-apps.md" rel="noopener noreferrer"&gt;dust_server web apps&lt;/a&gt;, &lt;a href="https://github.com/y3l1n4ung/dust/blob/main/docs/usage/routing-deep-links.md" rel="noopener noreferrer"&gt;Dust Routing deep links&lt;/a&gt;, &lt;a href="https://github.com/y3l1n4ung/dust/blob/main/docs/usage/http.md" rel="noopener noreferrer"&gt;Dust HTTP clients&lt;/a&gt;, and &lt;a href="https://docs.flutter.dev/ui/navigation/url-strategies" rel="noopener noreferrer"&gt;Flutter URL strategies&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Dust #DustServer #Routing #HTTPClient #Flutter
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>Validate Before and After the Request</title>
      <dc:creator>YeLinAung</dc:creator>
      <pubDate>Sat, 12 Sep 2026 17:40:03 +0000</pubDate>
      <link>https://dev.to/dust-codegen/validate-before-and-after-the-request-53e6</link>
      <guid>https://dev.to/dust-codegen/validate-before-and-after-the-request-53e6</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxkqanucn9zi7s3b9f1gf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxkqanucn9zi7s3b9f1gf.png" alt="Dust tutorial showing server request validation and Flutter submit validation" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Validate before the request. Validate again on the server.&lt;/p&gt;

&lt;p&gt;That is normal app work.&lt;/p&gt;

&lt;p&gt;Flutter forms can catch simple mistakes before submit. The server still owns the final rule.&lt;/p&gt;

&lt;p&gt;Dust keeps that flow clear.&lt;/p&gt;

&lt;p&gt;The request model owns the rule. The Flutter app can call &lt;code&gt;validate()&lt;/code&gt; before sending. The server can read the JSON body with &lt;code&gt;validBody(...)&lt;/code&gt; and reject bad input before the handler continues.&lt;/p&gt;

&lt;p&gt;The user gets a faster error on the app.&lt;/p&gt;

&lt;p&gt;The server still protects the API.&lt;/p&gt;

&lt;p&gt;The code stays in clear parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;request model;&lt;/li&gt;
&lt;li&gt;Flutter submit flow;&lt;/li&gt;
&lt;li&gt;server endpoint;&lt;/li&gt;
&lt;li&gt;server response.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Write the product rule once in the model. Use it on the path where the request moves.&lt;/p&gt;

&lt;p&gt;Docs used: &lt;a href="https://docs.flutter.dev/cookbook/forms/validation" rel="noopener noreferrer"&gt;Flutter form validation&lt;/a&gt;, &lt;a href="https://github.com/y3l1n4ung/dust/blob/main/docs/usage/validation.md" rel="noopener noreferrer"&gt;Dust Validation&lt;/a&gt;, &lt;a href="https://github.com/y3l1n4ung/dust/blob/main/docs/usage/http.md" rel="noopener noreferrer"&gt;Dust HTTP clients&lt;/a&gt;, and &lt;a href="https://github.com/y3l1n4ung/dust/blob/main/docs/dust_server/tutorial.md#7-validation" rel="noopener noreferrer"&gt;dust_server tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Dust #Validation #DustServer #HTTPClient #Flutter
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>Open a Product Link With Dust</title>
      <dc:creator>YeLinAung</dc:creator>
      <pubDate>Fri, 11 Sep 2026 18:08:30 +0000</pubDate>
      <link>https://dev.to/dust-codegen/open-a-product-link-with-dust-h8c</link>
      <guid>https://dev.to/dust-codegen/open-a-product-link-with-dust-h8c</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgmf5bf20e7u0938pw5hg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgmf5bf20e7u0938pw5hg.png" alt="Dust full-stack product link tutorial showing a server product route and Flutter product screen route" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open a product link in Flutter. Read the product from a Dart server.&lt;/p&gt;

&lt;p&gt;That is one app flow.&lt;/p&gt;

&lt;p&gt;The server owns &lt;code&gt;/products/{id}&lt;/code&gt;. &lt;code&gt;dust_server&lt;/code&gt; reads the path value and returns the product.&lt;/p&gt;

&lt;p&gt;The Flutter app owns &lt;code&gt;/products/:id&lt;/code&gt;. Dust Routing turns the link into a page with an &lt;code&gt;id&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Then the screen uses a Dust HTTP client to call the server. State handles loading, errors, and the loaded product.&lt;/p&gt;

&lt;p&gt;The user sees one link.&lt;/p&gt;

&lt;p&gt;The code has clear parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;server route;&lt;/li&gt;
&lt;li&gt;Flutter route;&lt;/li&gt;
&lt;li&gt;HTTP client;&lt;/li&gt;
&lt;li&gt;screen state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dust does not hide the app logic. It keeps repeated route, request, and state glue out of the way.&lt;/p&gt;

&lt;p&gt;Docs used: &lt;a href="https://docs.flutter.dev/ui/navigation/deep-linking" rel="noopener noreferrer"&gt;Flutter deep links&lt;/a&gt;, &lt;a href="https://github.com/y3l1n4ung/dust/blob/main/docs/usage/routing-deep-links.md" rel="noopener noreferrer"&gt;Dust Routing deep links&lt;/a&gt;, &lt;a href="https://github.com/y3l1n4ung/dust/blob/main/docs/usage/routing.md#route-parameters" rel="noopener noreferrer"&gt;Dust route parameters&lt;/a&gt;, &lt;a href="https://github.com/y3l1n4ung/dust/blob/main/docs/usage/http.md" rel="noopener noreferrer"&gt;Dust HTTP clients&lt;/a&gt;, and &lt;a href="https://github.com/y3l1n4ung/dust/blob/main/docs/dust_server/routing.md" rel="noopener noreferrer"&gt;dust_server routing&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Dust #DustServer #Routing #HTTPClient #Flutter
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>Build a Signup Flow With Dust</title>
      <dc:creator>YeLinAung</dc:creator>
      <pubDate>Thu, 10 Sep 2026 18:01:34 +0000</pubDate>
      <link>https://dev.to/dust-codegen/build-a-signup-flow-with-dust-1628</link>
      <guid>https://dev.to/dust-codegen/build-a-signup-flow-with-dust-1628</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy5696pf3w0coa1pozv81.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy5696pf3w0coa1pozv81.png" alt="Dust full-stack signup tutorial showing a validated request model, HTTP client, and ViewModel submit flow" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Flutter’s current &lt;a href="https://flutter.dev/blog/thats-a-wrap-everything-flutter-at-google-i-o-2026" rel="noopener noreferrer"&gt;full-stack developer series&lt;/a&gt; is a useful frame for Dust too.&lt;/p&gt;

&lt;p&gt;The repeated work is often not one widget. It is the path between the form, request model, API call, state update, and success action.&lt;/p&gt;

&lt;p&gt;A Dust version can stay small.&lt;/p&gt;

&lt;p&gt;Put form rules on &lt;code&gt;SignupRequest&lt;/code&gt; with &lt;code&gt;Validate()&lt;/code&gt;. Add &lt;code&gt;Serialize()&lt;/code&gt; so the same request can become the HTTP body. Define the endpoint in a Dust HTTP client. Keep the submit flow in a &lt;code&gt;@ViewModel&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The widget stays focused on input and UI. The request model owns validation and JSON. The API interface owns the request shape. The ViewModel owns loading, errors, and the success effect.&lt;/p&gt;

&lt;p&gt;That is the point of using Dust across a flow. Not one large abstraction. Just repeated app glue moved into generated files that stay reviewable.&lt;/p&gt;

&lt;p&gt;Docs used: &lt;a href="https://github.com/y3l1n4ung/dust/blob/main/docs/usage/validation.md" rel="noopener noreferrer"&gt;Validation&lt;/a&gt;, &lt;a href="https://github.com/y3l1n4ung/dust/blob/main/docs/usage/serde.md" rel="noopener noreferrer"&gt;Serde&lt;/a&gt;, &lt;a href="https://github.com/y3l1n4ung/dust/blob/main/docs/usage/http.md" rel="noopener noreferrer"&gt;HTTP Clients&lt;/a&gt;, and &lt;a href="https://github.com/y3l1n4ung/dust/blob/main/docs/usage/state.md" rel="noopener noreferrer"&gt;State Management&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Dust #Validation #Serde #HTTPClient #Flutter
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>Use Effects for One-Time UI Work</title>
      <dc:creator>YeLinAung</dc:creator>
      <pubDate>Wed, 09 Sep 2026 18:16:34 +0000</pubDate>
      <link>https://dev.to/dust-codegen/use-effects-for-one-time-ui-work-2deo</link>
      <guid>https://dev.to/dust-codegen/use-effects-for-one-time-ui-work-2deo</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff0c6zjvazy263phricz2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff0c6zjvazy263phricz2.png" alt="Flutter snackbar callback code beside a Dust State effect listener example" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Flutter shows snackbars through &lt;code&gt;ScaffoldMessenger&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That belongs at the UI edge.&lt;/p&gt;

&lt;p&gt;The tricky part is deciding where the event comes from.&lt;/p&gt;

&lt;p&gt;If a save action lives in a ViewModel, the widget should not need to own the whole save flow just to show “Saved”.&lt;/p&gt;

&lt;p&gt;Dust State has effects for this.&lt;/p&gt;

&lt;p&gt;Emit a small event from the ViewModel. Listen with the generated listener widget. Show the snackbar there.&lt;/p&gt;

&lt;p&gt;Effects do not change state. They are one-time UI events for mounted listeners.&lt;/p&gt;

&lt;p&gt;So the child widget does not rebuild because a snackbar was shown.&lt;/p&gt;

&lt;p&gt;Use state for facts that must survive rebuilds. Use effects for short UI work like snackbars or navigation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/y3l1n4ung/dust/blob/main/docs/usage/state.md#effects" rel="noopener noreferrer"&gt;Read the Dust State effects guide&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Dust #StateManagement #Flutter #Dart #CodeGeneration
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>Keep Route Parameters Beside the Page</title>
      <dc:creator>YeLinAung</dc:creator>
      <pubDate>Tue, 08 Sep 2026 18:16:15 +0000</pubDate>
      <link>https://dev.to/dust-codegen/keep-route-parameters-beside-the-page-24mm</link>
      <guid>https://dev.to/dust-codegen/keep-route-parameters-beside-the-page-24mm</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8jqmlly17dxrb4y32zxl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8jqmlly17dxrb4y32zxl.png" alt="Manual Flutter route parameter parsing beside a Dust route parameter example" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Flutter routing gets harder when URLs carry real state.&lt;/p&gt;

&lt;p&gt;A product page may need an &lt;code&gt;id&lt;/code&gt;, a selected &lt;code&gt;tab&lt;/code&gt;, and a list of filter tags.&lt;/p&gt;

&lt;p&gt;You can parse those values by hand in the router.&lt;/p&gt;

&lt;p&gt;That works, but the route shape can drift away from the page constructor.&lt;/p&gt;

&lt;p&gt;Dust Routing keeps them beside the page.&lt;/p&gt;

&lt;p&gt;Path parameters match required constructor fields. Other constructor fields become query values.&lt;/p&gt;

&lt;p&gt;Dust can parse and restore values such as &lt;code&gt;int&lt;/code&gt;, &lt;code&gt;bool&lt;/code&gt;, &lt;code&gt;DateTime&lt;/code&gt;, and repeated &lt;code&gt;List&amp;lt;String&amp;gt;&lt;/code&gt; query parameters.&lt;/p&gt;

&lt;p&gt;The page shows what it needs. The generated router handles the URL mapping.&lt;/p&gt;

&lt;p&gt;Use this when your app needs deep links that stay close to screen code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/y3l1n4ung/dust/blob/main/docs/usage/routing.md#route-parameters" rel="noopener noreferrer"&gt;Read the Dust route parameters guide&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Dust #Routing #Flutter #Dart #CodeGeneration
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>Let Static Translation Keys Create the ARB Shape</title>
      <dc:creator>YeLinAung</dc:creator>
      <pubDate>Mon, 07 Sep 2026 18:58:06 +0000</pubDate>
      <link>https://dev.to/dust-codegen/let-static-translation-keys-create-the-arb-shape-1ae5</link>
      <guid>https://dev.to/dust-codegen/let-static-translation-keys-create-the-arb-shape-1ae5</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1b06ffktaypuc035m5st.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1b06ffktaypuc035m5st.png" alt="Flutter localization setup beside a Dust static translation key workflow" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Flutter localization needs ARB files, supported locales, and app bootstrap code.&lt;/p&gt;

&lt;p&gt;That setup is clear. The repeated part is keeping message files in sync with the text your app actually uses.&lt;/p&gt;

&lt;p&gt;Dust i18n starts from static keys in source.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;TranslatedText&lt;/code&gt; or &lt;code&gt;context.tr&lt;/code&gt; with a literal key and default text. The namespace before the first underscore becomes the ARB file name.&lt;/p&gt;

&lt;p&gt;Run &lt;code&gt;dust i18n build&lt;/code&gt;. Dust creates missing locale files, keeps existing translations, and refreshes the generated Flutter bootstrap.&lt;/p&gt;

&lt;p&gt;It does not translate copy for you.&lt;/p&gt;

&lt;p&gt;It keeps the message shape close to the code that uses it.&lt;/p&gt;

&lt;p&gt;One detail matters: declare each locale directory as a Flutter asset. &lt;code&gt;assets/i18n/&lt;/code&gt; alone does not include the nested locale folders.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/y3l1n4ung/dust/blob/main/docs/usage/i18n.md#keys-and-namespaces" rel="noopener noreferrer"&gt;Read the Dust i18n keys and namespaces guide&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Dust #I18n #Flutter #Dart #CodeGeneration
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>Keep API Casing Out of Dart Field Names</title>
      <dc:creator>YeLinAung</dc:creator>
      <pubDate>Sun, 06 Sep 2026 17:28:17 +0000</pubDate>
      <link>https://dev.to/dust-codegen/keep-api-casing-out-of-dart-field-names-3hj8</link>
      <guid>https://dev.to/dust-codegen/keep-api-casing-out-of-dart-field-names-3hj8</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwsd4r175yfqvuaiw9s3a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwsd4r175yfqvuaiw9s3a.png" alt="Manual snake case JSON mapping beside a Dust Serde renameAll example" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dart apps read and write JSON all the time.&lt;/p&gt;

&lt;p&gt;One small problem appears in many projects.&lt;/p&gt;

&lt;p&gt;The API uses &lt;code&gt;snake_case&lt;/code&gt;. The Dart model uses &lt;code&gt;camelCase&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can map every key by hand. That works, but the same casing rule is repeated in every model.&lt;/p&gt;

&lt;p&gt;Dust Serde lets the model declare the rule once.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;@SerDe(renameAll: SerDeRename.snakeCase)&lt;/code&gt;. Dust applies that rule when decoding and encoding the model.&lt;/p&gt;

&lt;p&gt;The field stays &lt;code&gt;displayName&lt;/code&gt; in Dart. The JSON key stays &lt;code&gt;display_name&lt;/code&gt; on the wire.&lt;/p&gt;

&lt;p&gt;That keeps the model easy to read and keeps API naming rules out of handwritten mapping code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/y3l1n4ung/dust/blob/main/docs/usage/serde.md#rename-strategies" rel="noopener noreferrer"&gt;Read the Dust rename strategies guide&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Dust #Serde #Dart #Flutter #CodeGeneration
&lt;/h1&gt;

</description>
    </item>
  </channel>
</rss>
