<?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: toykam</title>
    <description>The latest articles on DEV Community by toykam (@dev_toykam).</description>
    <link>https://dev.to/dev_toykam</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F686480%2F5f826ca9-838d-476f-ac71-3401fab1bcf1.jpg</url>
      <title>DEV Community: toykam</title>
      <link>https://dev.to/dev_toykam</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dev_toykam"/>
    <language>en</language>
    <item>
      <title>Stop Feeding Your AI Agents Fluff: Introducing API to MOJ Converter</title>
      <dc:creator>toykam</dc:creator>
      <pubDate>Thu, 19 Feb 2026 17:14:14 +0000</pubDate>
      <link>https://dev.to/dev_toykam/stop-feeding-your-ai-agents-fluff-introducing-api-to-moj-converter-2g3b</link>
      <guid>https://dev.to/dev_toykam/stop-feeding-your-ai-agents-fluff-introducing-api-to-moj-converter-2g3b</guid>
      <description>&lt;h2&gt;
  
  
  🤖 The "Unstructured" Problem
&lt;/h2&gt;

&lt;p&gt;We are living in the golden age of AI Agents. We want them to book flights, manage infrastructure, and interact with third-party services. But there's a major bottleneck: &lt;strong&gt;Context.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI Agents (powered by LLMs) are incredibly smart, but they struggle with the same thing humans do—information overload.&lt;/p&gt;

&lt;p&gt;When you point an agent to a standard API documentation page (like Swagger UI or Postman Documenter), you're asking it to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Parse HTML layout.&lt;/li&gt;
&lt;li&gt; Ignore navigation bars, footers, and CSS.&lt;/li&gt;
&lt;li&gt; Understand which endpoints are relevant.&lt;/li&gt;
&lt;li&gt; Piece together scattered parameters and schemas.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It's inefficient. It burns tokens. And often, the agent gets lost.&lt;/p&gt;

&lt;h2&gt;
  
  
  💡 Agents Crave Structure
&lt;/h2&gt;

&lt;p&gt;Unlike a blog post or an e-commerce site where the content is the value, API documentation is about &lt;strong&gt;data structure&lt;/strong&gt;. Agents don't need the marketing fluff about "how easy our API is." They need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Path&lt;/strong&gt;: &lt;code&gt;/v1/users&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Method&lt;/strong&gt;: &lt;code&gt;POST&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Params&lt;/strong&gt;: &lt;code&gt;{ "name": "string" }&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They understand structured data (JSON) natively. So why are we feeding them HTML?&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠 Solving It: API Doc to JSON
&lt;/h2&gt;

&lt;p&gt;I realized that if I wanted my agents to be reliable, I needed a translation layer. Something that sits between the human-readable documentation and the machine brain.&lt;/p&gt;

&lt;p&gt;So, I teamed up with &lt;strong&gt;@antigravity&lt;/strong&gt; to build &lt;strong&gt;&lt;a href="https://apidoctojson.vercel.app" rel="noopener noreferrer"&gt;API to MOJ Converter&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is MOJ?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Machine-Optimized JSON&lt;/strong&gt;. It's a stripped-down, token-efficient format that prioritizes structural predictability over human readability.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;⚡️ Universal Ingestion&lt;/strong&gt;: It supports &lt;strong&gt;Swagger/OpenAPI&lt;/strong&gt; (v2, v3) and public &lt;strong&gt;Postman Collections&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;🔍 Deep Scraping&lt;/strong&gt;: It doesn't just read the page; it finds the underlying configuration. Hidden &lt;code&gt;swagger-config.json&lt;/code&gt;? Nested Postman API calls? We handle that complexity for you.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;🛡 Type Safety&lt;/strong&gt;: It simplifies complex nested schemas into flat, predictable type definitions that LLMs can easily generate.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;🎨 Developer Experience&lt;/strong&gt;: Built with a sleek dark-mode UI, using &lt;strong&gt;Monaco Editor&lt;/strong&gt; (the engine behind VS Code) for real-time verification.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🏗 The Stack
&lt;/h2&gt;

&lt;p&gt;We built this using &lt;strong&gt;Next.js 14&lt;/strong&gt;, &lt;strong&gt;TailwindCSS&lt;/strong&gt;, and &lt;strong&gt;TypeScript&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;One of the coolest technical challenges was the &lt;strong&gt;Ingestion Engine&lt;/strong&gt;. Swagger UIs are often dynamically rendered single-page apps (SPAs). We had to build a robust scraper that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Fetches the HTML.&lt;/li&gt;
&lt;li&gt; Parses identifying scripts (like &lt;code&gt;swagger-initializer.js&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt; Recursively resolves configuration URLs until it finds the actual Open API Spec.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For &lt;strong&gt;Postman&lt;/strong&gt;, we reverse-engineered the structure of their public documentation pages to fetch the raw collection JSON directly from their gateway API, bypassing the heavy client-side rendering.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 What's Next?
&lt;/h2&gt;

&lt;p&gt;Right now, it's a web tool. But the vision is bigger.&lt;/p&gt;

&lt;p&gt;We are currently building an &lt;strong&gt;API for the Converter&lt;/strong&gt;. Imagine sending a &lt;code&gt;POST&lt;/code&gt; request with a documentation URL and getting back the clean MOJ JSON instantly. You could plug this directly into your LangChain or AutoGPT pipelines to let your agents "learn" APIs on the fly.&lt;/p&gt;

&lt;h2&gt;
  
  
  👋 Try It Out
&lt;/h2&gt;

&lt;p&gt;The tool is live and free to use:&lt;br&gt;
👉 &lt;strong&gt;&lt;a href="https://apidoctojson.vercel.app" rel="noopener noreferrer"&gt;https://apidoctojson.vercel.app&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Give it a spin with your favorite documentation link and let me know if it helps your agents work smarter, not harder!&lt;/p&gt;

</description>
      <category>api</category>
      <category>ai</category>
      <category>llm</category>
      <category>devtool</category>
    </item>
    <item>
      <title>Why Abstracting Business Logic from the Start Saves You Hours of Refactoring: A Lesson from Swapping GetX to GoRouter</title>
      <dc:creator>toykam</dc:creator>
      <pubDate>Thu, 07 Nov 2024 20:16:20 +0000</pubDate>
      <link>https://dev.to/dev_toykam/why-abstracting-business-logic-from-the-start-saves-you-hours-of-refactoring-a-lesson-from-swapping-getx-to-gorouter-2bma</link>
      <guid>https://dev.to/dev_toykam/why-abstracting-business-logic-from-the-start-saves-you-hours-of-refactoring-a-lesson-from-swapping-getx-to-gorouter-2bma</guid>
      <description>&lt;p&gt;In Software development, navigation is one of the most crucial parts of a user experience. So when I decided to switch my navigation from GetX to GoRouter, I thought it would be a simple swap—until I realized that navigation was directly referenced in every single screen of my app. What could have been a smooth transition turned into a challenge, and I quickly found myself wishing I had abstracted my navigation logic from the very beginning.&lt;/p&gt;

&lt;p&gt;This experience taught me a valuable lesson about the power of abstraction in Flutter apps. In this article, I’ll walk you through why abstracting navigation functionalities early on is essential and how it could save you from hours of code refactoring in the future. Let's dive in!&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;The Problem: Tight Coupling with GetX Navigation&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;When I first built my app, I used GetX for navigation. It worked well, but all my navigation calls were scattered across individual screens. At the time, it felt natural to do &lt;code&gt;Get.to()&lt;/code&gt; directly whenever I needed to move between screens. However, when I decided to transition to GoRouter for its powerful deep-linking capabilities, I realized this choice came at a cost: I had to replace &lt;code&gt;Get.to()&lt;/code&gt; calls in every file where navigation happened.&lt;/p&gt;

&lt;p&gt;If I had taken the time to abstract my navigation logic into a single service, swapping routing libraries would have been far simpler. But why, exactly, is abstraction so beneficial, and how can we make it work for our navigation needs?&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Understanding the Power of Abstraction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Abstraction, in simple terms, is the process of separating implementation details from the main logic. In the case of navigation, it means centralizing routing logic in one place, separate from individual screens. This approach allows us to modify or swap the routing library without touching every screen component directly.&lt;/p&gt;

&lt;p&gt;Let’s look at the key benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Maintainability&lt;/strong&gt;: With navigation logic centralized, we only need to make updates in one place, keeping our code more organized and manageable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flexibility&lt;/strong&gt;: When it comes to swapping routing solutions, abstraction allows for seamless transitions by updating just the navigation service.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Separation of Concerns&lt;/strong&gt;: Screens stay focused on UI logic, and routing is handled in one centralized service, creating a cleaner codebase.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Implementing a Navigation Service in Flutter&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;So, how can we apply this in a Flutter app? Let’s start by creating a simple &lt;code&gt;NavigationService&lt;/code&gt; that abstracts our routing logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Step 1: Define the Abstract Class&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Define an abstract class, &lt;code&gt;NavigationService&lt;/code&gt;, with essential navigation methods like &lt;code&gt;navigateTo&lt;/code&gt;, &lt;code&gt;goBack&lt;/code&gt;, and &lt;code&gt;replaceRoute&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;abstract class NavigationService {
  void navigateTo(String route, {Map&amp;lt;String, String&amp;gt;? params});
  void goBack();
  void replaceRoute(String route, {Map&amp;lt;String, String&amp;gt;? params});
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This abstract class will serve as the blueprint, and each router-specific implementation will need to follow it.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Step 2: Implement the NavigationService for Each Router&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Here’s an implementation of &lt;code&gt;NavigationService&lt;/code&gt; using GoRouter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GoRouter Implementation&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';

class GoRouterNavigationService implements NavigationService {
  final GoRouter _router;

  GoRouterNavigationService(this._router);

  @override
  void navigateTo(String route, {Map&amp;lt;String, String&amp;gt;? params}) {
    _router.go(route, extra: params);
  }

  @override
  void goBack() {
    _router.pop();
  }

  @override
  void replaceRoute(String route, {Map&amp;lt;String, String&amp;gt;? params}) {
    _router.pushReplacement(route, extra: params);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;GetX Implementation&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'package:get/get.dart';

class GetXNavigationService implements NavigationService {
  @override
  void navigateTo(String route, {Map&amp;lt;String, String&amp;gt;? params}) {
    Get.toNamed(route, arguments: params);
  }

  @override
  void goBack() {
    Get.back();
  }

  @override
  void replaceRoute(String route, {Map&amp;lt;String, String&amp;gt;? params}) {
    Get.offNamed(route, arguments: params);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Step 3: Set Up Dependency Injection&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Now, we introduce Dependency Injection (DI) using the &lt;code&gt;get_it&lt;/code&gt; package to decide which navigation service to use. This will allow us to swap between different router libraries (like GoRouter or GetX) without changing the rest of the app’s code.&lt;/p&gt;

&lt;p&gt;To get started, first add get_it to your &lt;code&gt;pubspec.yaml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dependencies:
  get_it: ^7.2.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, set up DI in your app initialization:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'package:get_it/get_it.dart';

final getIt = GetIt.instance;

void setupNavigationService() {
  // if you want to use GoRouter
  getIt.registerSingleton&amp;lt;NavigationService&amp;gt;(GoRouterNavigationService());
  // if you want to use GetRouter
  getIt.registerSingleton&amp;lt;NavigationService&amp;gt;(GetXNavigationService());
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Step 4: Initialize DI in main.dart&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In your &lt;code&gt;main.dart&lt;/code&gt;, call the dependency injection (&lt;code&gt;get_it&lt;/code&gt;) initialization function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;void main() {

  setupNavigationService();

  runApp(MyApp());
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Step 5: Using the NavigationService in Your App&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Now, when you need to navigate, you simply retrieve the &lt;code&gt;NavigationService&lt;/code&gt; from &lt;code&gt;get_it&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'package:get_it/get_it.dart';

class SomeScreen extends StatelessWidget {
  final NavigationService _navigationService = GetIt.instance&amp;lt;NavigationService&amp;gt;();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            _navigationService.navigateTo('/someRoute');
          },
          child: Text('Navigate'),
        ),
      ),
    );
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This way, you don’t have to worry about the routing logic inside your individual screens. Instead, you rely on the abstract &lt;code&gt;NavigationService&lt;/code&gt; that points to whichever routing library you're using at the moment.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;The Benefits in Action: A Cleaner, More Scalable Codebase&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;By using DI, I can easily switch between GoRouter and GetX without touching the screens. This keeps the app modular, flexible, and easy to maintain. Want to change the navigation library in the future? Just update the DI configuration.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusion: The Value of Early Abstraction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If I had abstracted navigation from the beginning, I could have easily swapped between routing libraries without major changes. This lesson taught me the importance of abstraction not only for navigation but across all layers of an app. It keeps the code flexible, testable, and maintainable. So, if you’re starting a Flutter app, consider abstracting navigation—and other core features—from the start to save time in the long run.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Now, I’d love to hear from you!&lt;/strong&gt; Which part of your app’s business logic are you planning to abstract next? Or, if you’ve already implemented abstraction elsewhere in your app, how did you go about it? Drop a comment below and share your experience—I’d love to learn from your approach!&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>mobile</category>
    </item>
    <item>
      <title>My Journey into Nested Functions in Dart: From Curiosity to Clarity.</title>
      <dc:creator>toykam</dc:creator>
      <pubDate>Sun, 03 Nov 2024 12:58:10 +0000</pubDate>
      <link>https://dev.to/dev_toykam/my-journey-into-nested-functions-in-dart-from-curiosity-to-clarity-2kc3</link>
      <guid>https://dev.to/dev_toykam/my-journey-into-nested-functions-in-dart-from-curiosity-to-clarity-2kc3</guid>
      <description>&lt;p&gt;While scrolling through Stack Overflow questions one day, I stumbled upon a piece of &lt;a href="https://stackoverflow.com/questions/79151280/flutter-tried-to-send-a-request-of-type-formdata-frommap-to-laravel-but-it-was" rel="noopener noreferrer"&gt;code&lt;/a&gt; that used something called a "nested function." Although I'd seen similar code structures before, I hadn't yet explored the concept of nesting functions in Dart, and I was intrigued.&lt;/p&gt;

&lt;p&gt;Determined to learn more, I dove into a hands-on experiment with DartPad and consulted ChatGPT, which provided a thorough explanation. Here, I’ll share my journey of discovery, including what I learned about nested functions, how they can be used effectively, and a real-life example of where it is applicable.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Stack Overflow Question That Sparked It All&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The Stack Overflow post was a bit over my head at first, mainly because it introduced nested functions without much context. I’d used functions plenty of times but hadn’t thought about why or how one function could exist within another. Intrigued by the structure, I realized it was time to understand this concept more deeply.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;First Steps: Experimenting on DartPad&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;To get a hands-on feel for nested functions, I opened DartPad and started with a simple example:&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2F2jwr0ukk7iqzl3uwt4mp.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.amazonaws.com%2Fuploads%2Farticles%2F2jwr0ukk7iqzl3uwt4mp.png" alt="Sample code illustrating what nested functions looks like." width="800" height="207"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This example illustrated the basic setup: &lt;code&gt;outerFunction&lt;/code&gt; contained another function, &lt;code&gt;innerFunction&lt;/code&gt;, which was only accessible within the outer function. Running the code confirmed that the inner function would print its message only when called inside &lt;code&gt;outerFunction&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Turning to ChatGPT for Insight&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Still curious about practical applications and the inner workings of nested functions, I turned to ChatGPT for a deeper explanation. Here’s what I learned:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Are Nested Functions?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nested functions are simply functions defined within other functions. In Dart, they allow you to encapsulate functionality within another function, restricting access to only where it’s needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to Use Them&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nested functions are especially useful when you need to create helper functions that assist the outer function but don’t need to be available outside of it. This encapsulation keeps the code tidy and prevents unnecessary exposure of functions that have limited relevance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to Use Nested Functions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nested functions aren’t just a coding trick—they’re a practical solution for certain scenarios. Here are a few situations where using nested functions can make your code more efficient and readable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Encapsulating Helper Logic:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a function has multiple steps or requires small, task-specific operations, nested functions help keep that logic organized and close to where it’s used. These helper functions often don’t need to be available outside the main function, so nesting them keeps the code clean and maintains scope boundaries.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Avoiding Clutter in the Global Scope:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By limiting the scope of helper functions to where they’re needed, nested functions help reduce the number of global or class-level functions, which can make your code easier to maintain and read.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Improving Readability in Large Functions:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a function grows too large, breaking down its logic into smaller, readable chunks can help. Nested functions allow you to segment the functionality within the main function without polluting the global or class-level namespace.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Avoiding Redundant Parameter Passing:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nested functions can access the variables of their outer function without needing them as parameters, which simplifies the code. This can be particularly useful when multiple helper functions depend on the same set of variables.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Real-Life Use Case: Validating a Form in a Flutter App&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;One practical example of using nested functions is in a form validation scenario in a Flutter app. Imagine we have a form with multiple fields, and each field needs specific validation. Instead of writing separate validation functions in the global scope, we can create a single function that validates the form and nest each field’s validation logic within it. Here’s how it could look:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;void validateForm(String username, String email, String password) {
  bool isFormValid = true;

  // Nested function to validate the username
  void validateUsername() {
    if (username.isEmpty) {
      print("Username cannot be empty.");
      isFormValid = false;
    } else if (username.length &amp;lt; 4) {
      print("Username must be at least 4 characters long.");
      isFormValid = false;
    }
  }

  // Nested function to validate the email
  void validateEmail() {
    if (!email.contains("@")) {
      print("Please enter a valid email address.");
      isFormValid = false;
    }
  }

  // Nested function to validate the password
  void validatePassword() {
    if (password.length &amp;lt; 6) {
      print("Password must be at least 6 characters long.");
      isFormValid = false;
    }
  }

  // Calling all validation functions
  validateUsername();
  validateEmail();
  validatePassword();

  // Final validation result
  if (isFormValid) {
    print("Form is valid.");
  } else {
    print("Form validation failed.");
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, each field has its validation logic nested within &lt;code&gt;validateForm&lt;/code&gt;. This approach keeps the form validation logic &lt;strong&gt;self-contained&lt;/strong&gt;, making it easy to understand, &lt;strong&gt;maintain&lt;/strong&gt;, and &lt;strong&gt;debug&lt;/strong&gt;. The nested functions (&lt;code&gt;validateUsername&lt;/code&gt;, &lt;code&gt;validateEmail&lt;/code&gt;, and &lt;code&gt;validatePassword&lt;/code&gt;) are only accessible within &lt;code&gt;validateForm&lt;/code&gt;, encapsulating them within the context where they’re needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Final Thoughts&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Experimenting with nested functions demonstrates their importance in organizing code effectively. Dart’s flexibility allows for clean and readable code, especially when small helper functions serve specific tasks, keeping the global scope uncluttered and improving maintainability. This approach is particularly useful in scenarios like form validation, where encapsulating logic within a larger function enhances tidiness and modularity. Understanding when and why to use nested functions adds a valuable tool to a developer's coding toolkit.&lt;/p&gt;

&lt;p&gt;I’d love to hear from you! What are some other use cases for nested functions that you’ve encountered in your projects? Share your experiences and examples in the comments below. Your insights could help others discover new ways to implement this powerful concept in their own code!&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>functions</category>
      <category>dart</category>
      <category>programming</category>
    </item>
    <item>
      <title>Creating Receipt Sharing Functionality in a Flutter Fintech App</title>
      <dc:creator>toykam</dc:creator>
      <pubDate>Thu, 31 Oct 2024 13:52:17 +0000</pubDate>
      <link>https://dev.to/dev_toykam/creating-receipt-sharing-functionality-in-a-flutter-fintech-app-23g5</link>
      <guid>https://dev.to/dev_toykam/creating-receipt-sharing-functionality-in-a-flutter-fintech-app-23g5</guid>
      <description>&lt;p&gt;In today's digital landscape, sharing transaction receipts effortlessly is crucial for any fintech application. Users often need to share transaction details for various reasons, and implementing a receipt-sharing feature can greatly enhance their experience. In this article, we'll explore how to create this functionality in a Flutter app using the screenshot package to capture receipt widgets as images.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Step 1: Setting Up Your Flutter Environment&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Make sure you have Flutter installed and create a new Flutter project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flutter create fintech_app
cd fintech_app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Step 2: Adding Dependencies&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Add the &lt;code&gt;screenshot&lt;/code&gt; and &lt;code&gt;share_plus&lt;/code&gt; packages to your pubspec.yaml:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dependencies:
  flutter:
    sdk: flutter
  screenshot: ^3.1.0
  share_plus: ^4.0.10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;flutter pub get&lt;/code&gt; to install the packages.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Step 3: Designing the Receipt Model&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Define a simple model for a transaction receipt in a file called receipt_model.dart:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Receipt {
  final String id;
  final double amount;
  final String date;
  final String recipient;

  Receipt({required this.id, required this.amount, required this.date, required this.recipient});
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Step 4: Creating the Receipt Widget&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Next, create a widget to display the receipt details and wrap it in a Screenshot widget. You can add this to your main widget or in a separate file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'package:flutter/material.dart';
import 'package:screenshot/screenshot.dart';
import 'receipt_model.dart';

class ReceiptWidget extends StatelessWidget {
  final Receipt receipt;
  final ScreenshotController screenshotController;

  ReceiptWidget({required this.receipt, required this.screenshotController});

  @override
  Widget build(BuildContext context) {
    return Screenshot(
      controller: screenshotController,
      child: Card(
        child: Column(
          children: [
            ListTile(
              title: Text("Receipt for ${receipt.recipient}"),
              subtitle: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Text("Amount: \$${receipt.amount}"),
                  Text("Date: ${receipt.date}"),
                  Text("ID: ${receipt.id}"),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Step 5: Implementing the Share Functionality&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;To share the screenshot, first, you need to capture it and then share it as an image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'package:share_plus/share_plus.dart';
import 'package:screenshot/screenshot.dart';

void shareReceipt(ScreenshotController screenshotController) async {
  final imageFile = await screenshotController.capture();
  if (imageFile != null) {
    // Share the image file
    Share.shareFiles([imageFile.path], text: 'Here is my receipt!');
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Step 6: Adding the Share Button&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In your main widget or wherever you want to display the receipt, add a button to capture and share the receipt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'package:flutter/material.dart';
import 'package:screenshot/screenshot.dart';
import 'receipt_model.dart';
import 'share_receipt.dart'; // Import your sharing function

class ReceiptScreen extends StatelessWidget {
  final Receipt receipt = Receipt(id: '12345', amount: 50.0, date: '2024-10-31', recipient: 'John Doe');
  final ScreenshotController screenshotController = ScreenshotController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Receipt')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ReceiptWidget(receipt: receipt, screenshotController: screenshotController),
            ElevatedButton(
              onPressed: () =&amp;gt; shareReceipt(screenshotController),
              child: Text("Share Receipt"),
            ),
          ],
        ),
      ),
    );
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Step 7: Testing the Functionality&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Run your app, and when you click the "Share Receipt" button, it should capture the receipt as an image and present the sharing options on your device.&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2Fj3i44djym0qr8fmduhbl.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.amazonaws.com%2Fuploads%2Farticles%2Fj3i44djym0qr8fmduhbl.png" alt="Result when the share button is clicked" width="800" height="1780"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Adding receipt-sharing functionality to your fintech app using the screenshot package is a straightforward way to enhance user experience. By allowing users to capture and share transaction details as images, you provide a more flexible and visually appealing method for managing their finances.&lt;/p&gt;

&lt;p&gt;Feel free to expand on this by adding features like formatting the image or customizing the receipt layout!.&lt;/p&gt;

&lt;p&gt;We’d love to hear your thoughts! If you have a different approach to implementing receipt-sharing functionality in your Flutter app or project, please share it in the comments below!&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>fintech</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Shorebird x Flutter: Some Things You Should Know.</title>
      <dc:creator>toykam</dc:creator>
      <pubDate>Tue, 01 Aug 2023 14:46:54 +0000</pubDate>
      <link>https://dev.to/dev_toykam/shorebird-x-flutter-some-things-you-should-know-3n1m</link>
      <guid>https://dev.to/dev_toykam/shorebird-x-flutter-some-things-you-should-know-3n1m</guid>
      <description>&lt;p&gt;Shorebird is a fantastic CLI tool designed to simplify the process of quickly pushing product updates or fixes to users without the hassle of waiting for app store reviews from platforms like Apple or Google. It's a handy tool that allows developers to make immediate changes and improvements to their apps, making life easier for both developers and end-users alike.&lt;/p&gt;

&lt;p&gt;If you're a mobile Flutter developer, having Shorebird in your toolbox is a real asset. However, to make the most of this tool, there are some essential things you should know. These insights will help you understand how Shorebird operates and empower you to use it effectively in your development workflow.&lt;/p&gt;

&lt;p&gt;Below are the things you must understand so as to use Shorebird effectively.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shorebird Updater&lt;/li&gt;
&lt;li&gt;Release Update&lt;/li&gt;
&lt;li&gt;Patch Update&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Shorebird Updater:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Shorebird Updater serves as the engine responsible for managing the download and installation of new updates (patches) on your users' devices whenever they become available. To ensure smooth functionality, the updater needs to be packaged with your application. As a result, during the installation process of Shorebird, &lt;a href="https://docs.shorebird.dev/faq#how-does-shorebird-relate-to-flutter" rel="noopener noreferrer"&gt;a forked version of the Flutter engine&lt;/a&gt; will also be downloaded since it includes the necessary components of the updater. This ensures that your app stays up-to-date effortlessly, providing your users with the latest improvements and fixes without any delays. &lt;br&gt;
Don't worry; we have a guide that explains how to set up Shorebird on your computer, &lt;a href="https://dev.to/dev_toykam/shorebird-x-flutter-340h"&gt;here&lt;/a&gt;.&lt;br&gt;
You can read more about this &lt;a href="https://docs.shorebird.dev/faq#how-does-shorebird-relate-to-flutter" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Release Update:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This scenario is comparable to when we execute the following commands in Flutter.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flutter build appbundle // for android
flutter build ipa // for ios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you run the above command, the build/artifacts you obtain are the same as those you get from using the &lt;code&gt;shorebird release [platform]&lt;/code&gt; command. However, there's an important distinction between the two processes. When you execute the shorebird release command, it employs a modified version of the Flutter engine (a forked version) to create the build/artifacts. The reason for using this modified version is to seamlessly integrate the updater we discussed earlier into the build. This ensures that the updater becomes an integral part of the final application package, enabling it to effectively handle updates on users' devices. In simple terms, the shorebird release command ensures that your app includes the necessary tools to manage updates smoothly for your users. &lt;br&gt;
The build/artifacts obtained from &lt;code&gt;shorebird release [platform]&lt;/code&gt; command must be distributed to your users so as to be able to get later patch update on that release.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;shorebird release android // for android
shorebird release ios-alpha // for ios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;All release obtained from the &lt;code&gt;shorebird release [platform]&lt;/code&gt; command must be distributed to user (for example: uploading it to google play / apple store) as they are not available to them over-the-air.&lt;/p&gt;

&lt;p&gt;Shorebird saves the compiled Dart code from your application in order to make updates smaller in size.&lt;/p&gt;

&lt;p&gt;To view the list of your app releases, simply run the command &lt;code&gt;shorebird releases list&lt;/code&gt; in your terminal or command prompt.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For a more detailed understanding of the process, you can refer to the documentation provided &lt;a href="https://docs.shorebird.dev/code_push/release" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Patch Update:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After you have published your release update, you have the capability to quickly push fixes/features, which are referred to as patches, to your users. Once these updates are ready, they will be automatically downloaded the moment your users open your app on their devices. The changes will then take effect the next time your users use your app.&lt;/p&gt;

&lt;p&gt;To push a patch, simply run any of the commands below depending on the platform you want to push a patch for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;shorebird patch android // for android
shorebird patch ios-alpha // for ios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The command mentioned above will carry out the following action:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Builds the artifacts for the update.&lt;/li&gt;
&lt;li&gt;Downloads the corresponding release artifacts.&lt;/li&gt;
&lt;li&gt;Generates a patch using the diff between the release and the current changes.&lt;/li&gt;
&lt;li&gt;Uploads the patch artifacts to the Shorebird backend&lt;/li&gt;
&lt;li&gt;Promotes the patch to the stable channel.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That covers the basics, but it's not the entirety of what you need to know. There's more to explore and understand beyond what has been mentioned so far.&lt;/p&gt;

&lt;p&gt;It's essential to keep in mind that not all updates you make to your app can be provided as patches using Shorebird. Shorebird's patch updates are specifically designed for changes that involve Dart code only (at least for now). If your update includes changes to assets or platform-specific code, you'll need to distribute it as a new release update instead as discussed above.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When you push a patch, you don't need to publish the store,  as the patch will be available your users with the help of the updater packaged in to your app as discussed earlier.&lt;br&gt;
You also don't need to update the version or build number&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Thank you for taking the time to explore this article with us. We hope you found it informative and engaging. Your interest and support inspire us to continue creating valuable content for you.&lt;/p&gt;

&lt;p&gt;If you have any questions, feedback, or suggestions, we would love to hear from you. Feel free to reach out and share your thoughts.&lt;/p&gt;

</description>
      <category>codepush</category>
      <category>flutter</category>
      <category>mobile</category>
      <category>flutterdev</category>
    </item>
    <item>
      <title>Shorebird x Flutter</title>
      <dc:creator>toykam</dc:creator>
      <pubDate>Sun, 30 Jul 2023 17:02:51 +0000</pubDate>
      <link>https://dev.to/dev_toykam/shorebird-x-flutter-340h</link>
      <guid>https://dev.to/dev_toykam/shorebird-x-flutter-340h</guid>
      <description>&lt;p&gt;In a world where app updates are the lifeblood of user experience, imagine a cloud service that empowers developers to seamlessly deliver the latest features and improvements directly to users' devices in real time.&lt;/p&gt;

&lt;p&gt;Meet &lt;strong&gt;&lt;a href="https://shorebird.dev/" rel="noopener noreferrer"&gt;Shorebird&lt;/a&gt;&lt;/strong&gt; – a groundbreaking cloud service designed to revolutionize app development and distribution. It offers developers an ingenious solution to effortlessly push app updates straight to users' devices, streamlining the update process and ensuring users always have access to the most cutting-edge features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Requirements for Using Shorebird&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Create an account on shorebird &lt;a href="https://console.shorebird.dev/" rel="noopener noreferrer"&gt;console&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Install Shorebird on your computer:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Make sure to have git installed before you start the shorebird installation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Windows
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Set-ExecutionPolicy RemoteSigned -scope CurrentUser # Needed to execute remote scripts
iwr -UseBasicParsing 'https://raw.githubusercontent.com/shorebirdtech/install/main/install.ps1'|iex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;MacOS
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl --proto '=https' --tlsv1.2 https://raw.githubusercontent.com/shorebirdtech/install/main/install.sh -sSf | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;When you install Shorebird, it will be placed in a special folder called &lt;strong&gt;~/.shorebird/bin&lt;/strong&gt; on your computer. This folder is added to your PATH, which means you can run Shorebird commands from any location in your terminal or command prompt.&lt;/p&gt;

&lt;p&gt;Inside the &lt;strong&gt;~/.shorebird/bin/cache/flutter&lt;/strong&gt; directory, Shorebird also includes a modified version of Flutter and Dart. This customized version of Flutter has been enhanced with Shorebird's code push feature, allowing you to easily deliver app updates directly to users' devices.&lt;/p&gt;

&lt;p&gt;The best part is that this modified Flutter and Dart installation won't interfere with any existing installations of Flutter and Dart that you may have on your system. You can continue using your usual versions of Flutter and Dart for other projects without any issues.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once the installation is completed, &lt;strong&gt;Shorebird&lt;/strong&gt; should be available on your computer. Run the command below to see the available commands shipped with shorebird:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;shorebord help
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&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.amazonaws.com%2Fuploads%2Farticles%2Fc6ucxtnjp4uh4dvq2d0j.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.amazonaws.com%2Fuploads%2Farticles%2Fc6ucxtnjp4uh4dvq2d0j.png" alt="Shorebird Complete Installation" width="800" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"shorebird doctor" is a helpful command you can run to check if Shorebird and its components are properly installed and configured on your system. It ensures that everything is in place, so you can use Shorebird without any problems.&lt;/p&gt;
&lt;/blockquote&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2F8j8cdflhhovs7jn15wny.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.amazonaws.com%2Fuploads%2Farticles%2F8j8cdflhhovs7jn15wny.png" alt="Shorebird Doctor output" width="800" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Login into your account:
After you've completed Step 1 and Step 2, the next thing to do is to log in to your Shorebird account using the Shorebird Command Line Interface (CLI) we installed in Step 2. It's a straightforward process – just open your terminal or command prompt and enter the following command:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;shorebird login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you execute this command, Shorebird will generate a unique login URL. You should copy and paste this URL into your web browser. Once you open the URL, it will take you to a page where you can select the Google account that you used to create your Shorebird account.&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2Fh3fl7mlj68o0u7qgt2px.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.amazonaws.com%2Fuploads%2Farticles%2Fh3fl7mlj68o0u7qgt2px.png" alt="Shorebird login output" width="800" height="227"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose the correct Google account from the list, and you'll be instantly logged in to your Shorebird account through the CLI. The best part is that you won't be required to grant any additional access or permissions – it's a secure and seamless process.&lt;/p&gt;

&lt;p&gt;Now you're all set to take full advantage of Shorebird's features and easily manage app updates and distribution for your projects!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/dev_toykam/shorebird-x-flutter-some-things-you-should-know-3n1m"&gt;Visit here to continue to explore the magical abilities of Shorebird&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Now that we've completed the requirement step, it's time to look ahead to our next article. In the upcoming piece, we'll explore how we can use Shorebird to distribute app updates to our users effectively. This is where things get really interesting, as we'll get hands-on with Shorebird's features and see how it simplifies the entire app update process.&lt;/p&gt;

&lt;p&gt;Throughout the article, we'll guide you through the different commands and functionalities that Shorebird offers. Together, we'll learn how to seamlessly deliver updates, ensuring our users always get the latest and greatest features.&lt;/p&gt;

&lt;p&gt;Get ready for an exciting journey as we dive into the world of Shorebird and revolutionize how we handle app updates for our users. So, stay tuned, and let's take our app distribution game to a whole new level!&lt;/p&gt;

&lt;p&gt;Thank You.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>codepush</category>
    </item>
    <item>
      <title>Getting Started As A Flutter Developer: Basic Things To Know.</title>
      <dc:creator>toykam</dc:creator>
      <pubDate>Mon, 21 Nov 2022 19:04:08 +0000</pubDate>
      <link>https://dev.to/dev_toykam/getting-started-as-a-flutter-developer-basic-things-to-know-39gi</link>
      <guid>https://dev.to/dev_toykam/getting-started-as-a-flutter-developer-basic-things-to-know-39gi</guid>
      <description>&lt;p&gt;Hi, I am Abdulkabir Toyyib, a mobile developer (Flutter). As a beginner in any tech stack, we can get stuck at the beginning of our learning phase because we don't know the basic things to learn to get started. In this article, I will be listing and explaining (&lt;em&gt;will try my best&lt;/em&gt;) the basic things to know to get started as a flutter developer.&lt;br&gt;
Yeah, let's get to it.&lt;/p&gt;

&lt;p&gt;Below are the basic things to learn to get started as &lt;strong&gt;Flutter Developer&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dart Programming Language&lt;/li&gt;
&lt;li&gt;OOP (Object Oriented Programming)&lt;/li&gt;
&lt;li&gt;The Flutter Widgets&lt;/li&gt;
&lt;li&gt;Navigation&lt;/li&gt;
&lt;li&gt;State Management&lt;/li&gt;
&lt;li&gt;Working With External Data (API)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Dart Programming Language&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Dart is a programming language created by google, it is the programming with which the Flutter framework is developed. So to learn Flutter, you must have a basic understanding of the dart Language.&lt;br&gt;
To learn more about dart, visit any of the links below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dart.dev/guides" rel="noopener noreferrer"&gt;Dart.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dart-tutorial.com/" rel="noopener noreferrer"&gt;Dart Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;OOP (Object Oriented Programming)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;As the name suggests, Object-Oriented Programming or OOPs refers to languages that use objects in programming, they use objects as a primary source to implement what is to happen in the code. Objects are seen by the viewer or user, performing tasks assigned by you. Object-oriented programming aims to implement real-world entities like inheritance, hiding, polymorphism, etc. in programming. The main aim of OOP is to bind together the data and the functions that operate on them so that no other part of the code can access this data except that function. &lt;br&gt;
Flutter is based on OOP, basic understanding of OOP is required. To learn more about OOP in Dart, &lt;a href="https://dart-tutorial.com/object-oriented-programming/oop-in-dart/" rel="noopener noreferrer"&gt;click here&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Flutter Widgets&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Why are these widgets important, they are because that is what Flutter is all about. Widgets are key components required to build beautiful UIs in Flutter. Understanding the type, use and when to use these widgets is important to be a Flutter Developer. A flutter developer must be familiar with the Flutter widgets, what they are used for and how they work with each other&lt;/p&gt;

&lt;p&gt;Examples of these widgets are Scaffold, Container, Text, Padding, SizedBox, etc, you can read more about these widgets on the flutter doc page, link below. &lt;br&gt;
&lt;a href="https://docs.flutter.dev/development/ui/widgets" rel="noopener noreferrer"&gt;Flutter Widgets&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Navigation&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This requires you to learn how to move from point A to point B in a Flutter app, this is when you will learn about the &lt;a href="https://docs.flutter.dev/development/ui/navigation" rel="noopener noreferrer"&gt;Flutter Navigator&lt;/a&gt;. Like moving from the login screen to the home page after a user has successfully logged in to the app.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;State Management&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;State management refers to the state of one or more user interface controls in a graphical user interface, such as text fields, OK buttons, radio buttons, etc. This is especially the case when the state of any particular message or form on the page depends on factors outside of the current page, or available throughout several pages. For example, consider a user who is logged in and sees the 'welcome' message on their first visit to any page, but not on subsequent page visits. Does each page manage the state of the user being logged in? That would create too much copy-pasting and duplication of code. Instead, you can use a state management pattern for handling messages (this may also include handling error messages and informative messages, along with the described welcome message) and then call this to receive a message as it becomes available.&lt;/p&gt;

&lt;p&gt;To Manage State in a flutter project, you can use the following state management packages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pub.dev/packages/rxdart" rel="noopener noreferrer"&gt;RxDart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bloclibrary.dev/#/gettingstarted" rel="noopener noreferrer"&gt;Bloc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://riverpod.dev/" rel="noopener noreferrer"&gt;Riverpod&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To learn more about state management in flutter, &lt;a href="https://flutter.dev/learn" rel="noopener noreferrer"&gt;click here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Working With External Data (APIs)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Yeah, working with external data will require you to use data that are not locally available in your App. This is where you learn how to get data from other services.&lt;br&gt;
Examples are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Getting the list of banks using the Paystack API&lt;/li&gt;
&lt;li&gt;Getting the list of state and LCDA from an API&lt;/li&gt;
&lt;li&gt;Getting a user's detail from a backend service.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To learn about how to communicate with API in Flutter &lt;a href="https://docs.flutter.dev/cookbook/networking/fetch-data" rel="noopener noreferrer"&gt;click here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thank you for reading, kindly share if this was helpful.&lt;br&gt;
If you have more tips for beginners to get started with flutter, kindly drop them in the comment below.&lt;/p&gt;

</description>
      <category>deno</category>
      <category>javascript</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Flutter: Getting Started.</title>
      <dc:creator>toykam</dc:creator>
      <pubDate>Wed, 16 Nov 2022 23:32:43 +0000</pubDate>
      <link>https://dev.to/dev_toykam/flutter-getting-started-10ml</link>
      <guid>https://dev.to/dev_toykam/flutter-getting-started-10ml</guid>
      <description>&lt;h2&gt;
  
  
  Introduction: What is Flutter?
&lt;/h2&gt;

&lt;p&gt;Flutter is a mobile app development framework that allows developers to create cross-platform apps. It uses the Dart programming language and provides a set of pre-built UI widgets, which are used to build the user interface of an app. Flutter also offers a set of core libraries for common tasks such as accessing the device camera or local storage, and it provides tools for building custom widgets.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the Benefits of Using Flutter?
&lt;/h2&gt;

&lt;p&gt;Flutter is a mobile app development framework that is used to create native apps for both iOS and Android.&lt;/p&gt;

&lt;p&gt;Flutter has many benefits, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;It is open source, which means it can be customized by anyone.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It has a large community of developers that are constantly contributing to it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It is backed by Google, which means that it will always have the latest updates and features.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It provides a single codebase for both iOS and Android apps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Its UI components are built with Material Design in mind, so they look great on any device.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Get Started with Flutter Development?
&lt;/h2&gt;

&lt;p&gt;To get started with flutter, you can start with the resources below.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.flutter.dev/" rel="noopener noreferrer"&gt;Flutter Documentation&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://codelabs.developers.google.com/codelabs/first-flutter-app-pt1#0" rel="noopener noreferrer"&gt;Google Colabs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://search.brave.com/search?q=Flutter%3A+Getting+Started.&amp;amp;source=web" rel="noopener noreferrer"&gt;Google Search&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you will prefer to watch an online video, below are the list of youtube channel I will recommend you start with.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/c/flutterdev" rel="noopener noreferrer"&gt;Flutter Channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=1ukSR1GRtMU&amp;amp;list=PL4cUxeGkcC9jLYyp2Aoh6hcWuxFDX6PBJ" rel="noopener noreferrer"&gt;Flutter Ninja&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@Destiny_Ed/playlists" rel="noopener noreferrer"&gt;Destiny Ed&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also to improve and fast-track your learning process, you can join flutter communities, below are the list (not all) of flutter communities you can join.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/flutterbyteconf" rel="noopener noreferrer"&gt;FlutterBytesConf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/codeclannigeria" rel="noopener noreferrer"&gt;Codeclan Nigeria&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Flutter is bae, you should try it, 😊.&lt;/p&gt;

&lt;p&gt;Thank you for reading, after trying it out, come give feedback on your experience, also if you have any questions on flutter, you can ask in the comment section below.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>crossplatform</category>
      <category>mobile</category>
    </item>
    <item>
      <title>My Goals at Zuri Internship Program</title>
      <dc:creator>toykam</dc:creator>
      <pubDate>Sun, 15 Aug 2021 07:30:20 +0000</pubDate>
      <link>https://dev.to/dev_toykam/my-goals-for-zuri-internship-4k44</link>
      <guid>https://dev.to/dev_toykam/my-goals-for-zuri-internship-4k44</guid>
      <description>&lt;h3&gt;
  
  
  Background
&lt;/h3&gt;

&lt;p&gt;I am Abdulkair Toyyib Inuolaji, a software developer with 5 years of playing with code experience. Apart from UI development (Frontend), I am a full-stack developer, from backend to backend. I prioritize functionality to UI, that's why I love backend development a lot. I have always wanted to do learn UI development, but all I see online is the theory and principles of design, then I found the Zuri Internship Program, and I applied, then was selected, and here is my first task.&lt;/p&gt;

&lt;h3&gt;
  
  
  Zuri
&lt;/h3&gt;

&lt;p&gt;There are 10 stages in the Zuri Internship Program starting from stage 1, participants who can graduate from stage 1 to 10 within 8 weeks will be select for an internship program. Here is my first task to move to stage 2. To know more about the Zuri Internship Program, &lt;a href="'https://zuri.team'"&gt;click here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  My Goals at Zuri
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;At the end of the 8 weeks program with Zuri, I should be able to develop a complex mobile app UI using flutter, with complex animations and user experience interactions.&lt;/li&gt;
&lt;li&gt;I want to have a network of co-developer who can work together to develop solutions, as the saying, 'Your network is your net worth'.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So Help Me God.&lt;/p&gt;

&lt;p&gt;Do you want to learn Mobile App Development using flutter, UI development using figma or web development? these tutorial below will get you started.&lt;/p&gt;

&lt;h4&gt;
  
  
  Flutter Tutorial
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=x0uinJvhNxI" rel="noopener noreferrer"&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.amazonaws.com%2Fuploads%2Farticles%2Fg5do8nglip2jpum75bih.jpg" alt="Flutter tutorial" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Figma Tutorial
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=Gu1so3pz4bA" rel="noopener noreferrer"&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.amazonaws.com%2Fuploads%2Farticles%2Fq9ndv6ktj1a8rm27ds6q.jpg" alt="Flutter tutorial" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Web Development Tutorial
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=Q33KBiDriJY" rel="noopener noreferrer"&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.amazonaws.com%2Fuploads%2Farticles%2Fv777cjvm189ijvei3zan.jpg" alt="Flutter tutorial" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Congratulations you have reached the end of this article. I am very happy ☺️☺️☺️ you got here. Feel free to leave a comment below, also advice is also welcome for improvement as this is my first article.&lt;/p&gt;

</description>
      <category>zuri</category>
      <category>internship</category>
      <category>goals</category>
    </item>
  </channel>
</rss>
