Google search engine
Home Blog Page 39

Integrating REST APIs into Your FlutterFlow App

0

FlutterFlow is a powerful no-code/low-code platform that allows users to build fully functional mobile and web applications quickly. One of its most valuable features is the ability to integrate REST APIs, enabling dynamic content, user data operations, and interactions with external services. In this blog post, we’ll walk you through the process of integrating REST APIs into your FlutterFlow project.

Why Integrate REST APIs?

REST APIs (Representational State Transfer Application Programming Interfaces) allow your app to communicate with external servers and databases. This means you can:

  • Fetch data from a backend service
  • Send user input to a server
  • Authenticate users
  • Interact with third-party services (like payment gateways, weather APIs, etc.)

Step-by-Step Guide to REST API Integration

Step 1: Understand Your API

Before integrating an API, understand the following details:

  • Base URL: The root URL for API calls
  • Endpoints: Paths for different operations (e.g., /login, /products)
  • Request Methods: GET, POST, PUT, DELETE, etc.
  • Headers: Information sent with requests (like Content-Type, Authorization)
  • Request Body: Data sent in POST or PUT requests
  • Response Format: Typically JSON

Step 2: Add the API Call in FlutterFlow

  1. Navigate to the API Calls Section:
  • Go to your FlutterFlow project.
  • On the left menu, click API Calls.
  • Click + Add API Call

2. Fill in API Details:

  • Name: Give a meaningful name (e.g., GetUserProfile).
  • Method: Choose the appropriate method (GET, POST, etc.).
  • URL: Enter the full URL or endpoint.
  • Headers: Add any headers your API needs.
  • Body Parameters: For POST/PUT requests, add key-value pairs for the body.
  • Response & Test: Click Test API Call to verify the response and map the JSON response structure.

Step 3: Use the API in Your App

After setting up the API call:

  1. Add an Action to a Widget:
  • Select a button or page.
  • Go to Actions > Backend Call > Custom API Call.
  • Select your API call and set input parameters if needed.

2. Display API Data:

  • Use the Set from Variable option to bind response data to text, image, or list widgets.
  • Use App State or Local State if you want to store data temporarily.

Step 4: Handling API Errors

Add conditional actions for API call failures:

  • Show error messages to users
  • Retry logic
  • Redirect to login if authentication fails

Step 5: Secure Your API Usage

  • Avoid hardcoding sensitive data like API keys.
  • Use secure headers and HTTPS.
  • Use authentication tokens and refresh tokens as required.

Example: Fetching a List of Products

Let’s say you want to fetch a list of products from https://api.example.com/products.

  1. Create API Call:

2. Test and Map Response:

  • Test the call and map fields like productName, price, imageURL.

3. Display in a ListView:

  • Use a ListView widget
  • Bind each item to API response data

Conclusion

Integrating REST APIs into your FlutterFlow app expands its capabilities significantly. Whether you’re creating a social app, an e-commerce platform, or a custom business tool, using REST APIs will help you build dynamic and scalable applications. With FlutterFlow’s intuitive interface and robust API integration tools, even complex data operations become manageable without writing backend code.

From Our Parent Company Aeologic

Aeologic Technologies is a leading AI-driven digital transformation company in India, helping businesses unlock growth with AI automation, IoT solutions, and custom web & mobile app development. We also specialize in AIDC solutions and technical manpower augmentation, offering end-to-end support from strategy and design to deployment and optimization.

Trusted across industries like manufacturing, healthcare, logistics, BFSI, and smart cities, Aeologic combines innovation with deep industry expertise to deliver future-ready solutions.

Feel free to connect with us:
And read more articles from FlutterDevs.com.

FlutterDevs team of Flutter developers to build high-quality and functionally-rich apps. Hire Flutterflow developer for your cross-platform Flutter mobile app project on an hourly or full-time basis as per your requirement! For any flutter-related queries, you can connect with us on Facebook, GitHub, Twitter, and LinkedIn.

We welcome feedback and hope that you share what you’re working on using #FlutterDevs. We truly enjoy seeing how you use Flutter to build beautiful, interactive web experiences.

Related: Rest API Using GetX

Related: Rest API in Flutter

Need expert help building your Flutter app? Talk to FlutterExperts for architecture, development, and consulting support.

Flutter 3.32 – What’s New in Flutter?

0

Flutter continues its rapid evolution, and the release of Flutter 3.32 brings another significant leap forward in performance, rendering capabilities, tooling, and platform-specific improvements. Whether you’re building for mobile, web, or desktop, Flutter 3.32 enhances the development experience while bringing more polish to production-ready apps.

In this blog post, we’ll break down everything that’s new and improved in Flutter 3.32—from core engine changes to ecosystem updates—so you can get the most out of this release.

Why Flutter 3.32 Matters

Flutter 3.32 represents a refinement-focused release. While it doesn’t introduce sweeping new features, it brings key advancements that contribute to:

  • Faster runtime and smoother animations
  • More robust Material 3 component support
  • Web and desktop maturity
  • Streamlined development and debugging workflows

Desktop support is no longer experimental—it’s now robust enough for shipping fully-featured desktop apps.

Key Highlights

  • Dart 3.3 support
  • Enhanced Impeller rendering engine
  • Improved DevTools and debugging
  • Updates to Material 3 support
  • Enhanced Web and Desktop performance
  • Tooling improvements and more

✅ Dart 3.3 — Smarter and More Powerful

Flutter 3.32 ships with Dart 3.3, which includes a range of performance and productivity enhancements:

  • Faster JIT and AOT compilation: Dart 3.3 improves the speed of compilation, especially during hot reload, saving valuable development time.
  • Improved type inference: Type inference is smarter, especially in complex expressions.
  • New language features: Minor syntax enhancements, better static analysis, and more efficient memory usage in certain cases.

With Dart continuing to mature, developers can expect a smoother coding experience and better runtime performance.

🧱 Impeller Rendering Engine Updates

Flutter’s next-gen renderer, Impeller, continues to improve and is now enabled by default for iOS (and optionally for Android):

  • Smoother animations
  • Reduced jank
  • Better performance in complex UIs

The goal of Impeller is to provide a consistent and high-fidelity rendering experience across platforms, and with Flutter 3.32, it’s getting closer to production readiness on Android as well.

Material 3 – More Components and Polish

Flutter 3.32 continues its push toward full Material 3 compliance with enhancements like:

  • Improved component theming
  • Updates to NavigationBar, NavigationDrawer, and BottomAppBar
  • Better support for MaterialState behaviors (hover, focus, pressed)

These updates allow developers to create modern, Google-design-compliant interfaces with less customization effort.

Web and Desktop Improvements

Web

Flutter 3.32 brings noticeable improvements for web development:

  • Reduced JavaScript bundle sizes: Smaller output means faster loading times.
  • Improved canvasKit performance
  • Better keyboard and mouse input handling

Desktop

On Windows, macOS, and Linux:

  • Improved text rendering
  • Better high-DPI display support
  • Enhanced accessibility features

Desktop support continues to mature, making Flutter a strong contender for cross-platform desktop development.

DevTools and Debugging

Developer tooling sees a boost in this release:

  • Faster widget inspector performance
  • Improved memory and CPU profiling
  • Simplified performance overlays

You’ll also notice enhancements to error messages, stack traces, and hot reload stability, making development smoother and more efficient.

Performance and Stability

Flutter 3.32 includes a wide range of under-the-hood optimizations:

  • Reduced memory usage
  • Lower frame build times
  • Improved list view scrolling performance

These changes mean apps run faster, feel more responsive, and consume fewer resources on devices.

Package Ecosystem Updates

Many popular packages have also been updated to align with Flutter 3.32, including:

  • google_fonts
  • flutter_localizations
  • camera
  • firebase_* plugins

Make sure to check compatibility and update dependencies accordingly.

Migration and Compatibility

Flutter 3.32 is mostly backward-compatible, but it’s always a good idea to:

  • Run flutter upgrade
  • Use flutter doctor to check your environment
  • Review deprecations in the official changelog

No major breaking changes are expected for most apps, but testing is recommended.

The Road Ahead

The Flutter team continues to focus on:

  • Completing Material 3 support
  • Full rollout of Impeller on Android
  • Improving startup times
  • More seamless DevTools integration

Flutter’s momentum remains strong as it evolves into a true “write once, run anywhere” framework for modern apps.

Conclusion

Flutter 3.32 is a solid, incremental release that brings stability, performance, and tooling improvements. Whether you’re building beautiful mobile apps, interactive web experiences, or robust desktop applications, this update provides the tools you need to build better, faster, and more consistently.

From Our Parent Company Aeologic

Aeologic Technologies is a leading AI-driven digital transformation company in India, helping businesses unlock growth with AI automation, IoT solutions, and custom web & mobile app development. We also specialize in AIDC solutions and technical manpower augmentation, offering end-to-end support from strategy and design to deployment and optimization.

Trusted across industries like manufacturing, healthcare, logistics, BFSI, and smart cities, Aeologic combines innovation with deep industry expertise to deliver future-ready solutions.

Feel free to connect with us:
And read more articles from FlutterDevs.com.

FlutterDevs team of Flutter developers to build high-quality and functionally-rich apps. Hire Flutterflow developer for your cross-platform Flutter mobile app project on an hourly or full-time basis as per your requirement! For any flutter-related queries, you can connect with us on Facebook, GitHub, Twitter, and LinkedIn.

We welcome feedback and hope that you share what you’re working on using #FlutterDevs. We truly enjoy seeing how you use Flutter to build beautiful, interactive web experiences.

Related: SMS Using Twilio In Flutter

Related: Using SharedPreferences in Flutter

Need expert help building your Flutter app? Talk to FlutterExperts for architecture, development, and consulting support.

Flutter Code Obfuscation: Improving App Security

0

Software developers must protect their code against any harmful action once their application is released into the world. There are genuine risks of reverse engineering, manipulation, and exploitation that could seriously harm your work.

This blog will explore the Flutter Code Obfuscation: Improving App Security. We will examine how code obfuscation can help you protect your code and stop it from being abused in your Flutter applications.

If you’re looking for the best Flutter app development company for your mobile application then feel free to contact us at — support@flutterdevs.com


Table Of Contents:

What is reverse engineering?

What is code obfuscation?

Implement Code

Reading the Obfuscating stack trace

Conclusion



What is reverse engineering?

The process of disassembling hardware or software to gain a comprehensive grasp of its architecture, design, and operation is known as reverse engineering.
Reverse engineering can be applied to software to find bugs, retrieve private data, or even replicate the program itself. Software for reverse engineering makes private data accessible, which could be exploited maliciously.

What is code obfuscation?

In software development, code obfuscation is a common technique used to make source code harder to read and comprehend.
This method changes the code into a version that is comparable but much harder to understand. Code obfuscation’s primary objective is to stop or significantly hinder reverse engineering.

Implement Code:

Run the Flutter build command in release mode with the –obfuscate and –split-debug-info arguments to add code obfuscation to your Flutter application.
The directory to which Flutter should output debug files is specified by the –split-debug-info option. This command will produce a symbol mapping in the context of obfuscation. Here’s an illustration of how to make use of these choices.

flutter build apk --obfuscate --split-debug-info=/path/to/your/project/directory

Save the generated symbols file after the obfuscation procedure is finished. If you want to later de-obfuscate a stack trace, you will need this file.

Reading the Obfuscating stack trace:

Use the following procedures to make a stack trace produced by an obfuscated application human-readable in order to debug it:

  • Locate the file with the matching symbols. For instance, app.android-arm64.symbols would be required in the event of a crash from an Android arm64 device.
  • Flutter symbolizes both the symbols file and the stack trace, which is saved in a file. For instance:
flutter symbolize -i <stack trace file> -d /out/android/app.android-arm64.symbols

Run flutter symbolize -h to learn more about the symbolize command.

Conclusion:

In the article, I have explained the Flutter Code Obfuscation: Improving App Security basic structure in Flutter; you can modify this code according to your choice. This was a small introduction to the  Flutter Code Obfuscation: Improving App Security, On User Interaction from my side, and it’s working using Flutter.

I hope this blog will provide you with sufficient information on trying the Flutter Code Obfuscation: Improving App Security in your projects. It is strongly advised to obfuscate your code before launching your application. By making it considerably more difficult for malevolent actors to reverse-engineer your application bundle, this crucial step increases the security of your app. This gives your application and code an extra degree of security. So please try it.

❤ ❤ Thanks for reading this article ❤❤

If I got something wrong? Let me know in the comments. I would love to improve.

Clap 👏 If this article helps you.


From Our Parent Company Aeologic

Aeologic Technologies is a leading AI-driven digital transformation company in India, helping businesses unlock growth with AI automation, IoT solutions, and custom web & mobile app development. We also specialize in AIDC solutions and technical manpower augmentation, offering end-to-end support from strategy and design to deployment and optimization.

Trusted across industries like manufacturing, healthcare, logistics, BFSI, and smart cities, Aeologic combines innovation with deep industry expertise to deliver future-ready solutions.

Feel free to connect with us:
And read more articles from FlutterDevs.com.

FlutterDevs team of Flutter developers to build high-quality and functionally-rich apps. Hire Flutter developer for your cross-platform Flutter mobile app project on an hourly or full-time basis as per your requirement! For any flutter-related queries, you can connect with us on FacebookGitHubTwitter, and LinkedIn.

We welcome feedback and hope that you share what you’re working on using #FlutterDevs. We truly enjoy seeing how you use Flutter to build beautiful, interactive web experiences.

Related: Flutter AI Agents: Building Autonomous Workflows in Mobile Apps (With Code Samples)

Related: Improve code style using lint rules in Flutter

Related: Pin Code Fields In Flutter

Need expert help building your Flutter app? Talk to FlutterExperts for architecture, development, and consulting support.


Explore Design Patterns in Flutter

0

Consider creating a virtual zoo. You start by creating a simple Animal class. However, you also need to include other species, such as birds, elephants, and lions. Although you could create a different class for every animal, you find that you’re repeatedly writing the same code. This method is not only inefficient, but it also makes your code more difficult to manage and adapt.

The design patterns enter the scene at this point. Design patterns are tried-and-true solutions to typical software design problems. They offer a framework for organising your classes to make them easier to comprehend, more reusable, and maintainable.

This blog will Explore Design Patterns in Flutter. We will see how to execute a demo program in your Flutter applications.

If you’re looking for the best Flutter app development company for your mobile application then feel free to contact us at — support@flutterdevs.com


Table Of Contents:

Design Patterns in Flutter

Design Patterns: What Is Their History?

What Makes Design Patterns Important?

Design Pattern Types

Conclusion



Design Patterns in Flutter:

Design patterns can be applied to Flutter to solve common issues in app development. To make sure that a class has only one instance, for instance, use the Singleton pattern; to notify widgets of changes, use the Observer pattern; and to effectively manage the state of an application, use a variety of state management patterns.

Design Patterns: What Is Their History?

The discipline of architecture is where the idea of design patterns first emerged. In 1977, an architect named Christopher Alexander wrote a book titled A Pattern Language that suggested utilising patterns to identify effective design practices in the disciplines of urban planning and building architecture. This concept was then applied to programming approaches by software developers Ward Cunningham and Kent Beck.

With the 1994 publication of Design Patterns: Elements of Reusable Object-Oriented Software, the idea of design patterns gained traction. This book, authored by the Gang of Four (GoF)—Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides—introduced 23 design patterns and is regarded as a seminal work in the field of software engineering. Design patterns are becoming an essential component of software development. Design pattern knowledge is currently considered a crucial ability for software developers, and many more patterns have been identified and published.

What Makes Design Patterns Important?

The software developer can profit from design patterns in many ways, including:-

  1. Reusable Solutions: Design patterns offer reliable and tested solutions for typical issues in software design. They can be utilised to lessen the difficulties that developers commonly encounter in their day-to-day programming tasks and are regarded as industry best practices.
  2. Communication: Design patterns facilitate communication among developers by offering a standardised language and being tailored to the issue they address. For instance, developers may easily identify the type of solution they are discussing when they refer to a “Singleton” or “Factory” pattern.
  3. Efficiency: By providing tried-and-true solutions, design patterns can aid in accelerating development. This can enhance the readability and organisation of the code and assist avoid little errors that could cause bigger issues.
  4. Code Maintainability: Code that follows design patterns is usually easier to read and maintain since it is more structured and comprehensible. Additionally, they promote reuse and can aid in avoiding anti-patterns or code smells.
  5. Learning OO Principles: Encapsulation, inheritance, and polymorphism are just a few of the object-oriented design principles that developers may better comprehend and implement with the help of design patterns.

Design Pattern Types:

The three main categories of design patterns are structural, behavioural, and creational.

  • Object creation techniques are covered by creational patterns, which aim to build things in a situation-appropriate way.
  • The way things interact with one another, or the composition of objects, is related to structural patterns.
  • To make sure that entities are communicating correctly, behavioural patterns are employed.
Creational Structural Behavioral
Singleton Adapter Chain of Responsibility
Factory Method Bridge Command
Abstract Factory Composite Interpreter
Builder Decorator Iterator
Prototype Facade Mediator
  Flyweight Memento
  Proxy Observer
    State
    Strategy
    Template Method
    Visitor

Conclusion:

In the article, I have explained the  Design System with Atomic Design basic structure in a flutter; you can modify this code according to your choice. This was a small introduction to the  Design System with Atomic Design in Flutter, On User Interaction from my side, and it’s working using Flutter.

I hope this blog will provide you with sufficient information on trying the Design System with Atomic Design in Flutter in your projects. When used with Flutter, the atomic design pattern and design systems offer a streamlined and effective method for creating modular, scalable, and testable user interfaces. The interface can be made consistent, less redundant, and easier to design, and reusable parts: atoms, molecules, creatures, templates, and pages.

We can create Flutter apps that are both technically sound and aesthetically pleasing by fusing the strength of design systems with atomic design principles. Using this method will surely improve your development workflow, making your codebase more structured, reusable, and future-proof, regardless of how big or small your project is. So please try it.

❤ ❤ Thanks for reading this article ❤❤

If I got something wrong? Let me know in the comments. I would love to improve.

Clap 👏 If this article helps you.


From Our Parent Company Aeologic

Aeologic Technologies is a leading AI-driven digital transformation company in India, helping businesses unlock growth with AI automation, IoT solutions, and custom web & mobile app development. We also specialize in AIDC solutions and technical manpower augmentation, offering end-to-end support from strategy and design to deployment and optimization.

Trusted across industries like manufacturing, healthcare, logistics, BFSI, and smart cities, Aeologic combines innovation with deep industry expertise to deliver future-ready solutions.

Feel free to connect with us:
And read more articles from FlutterDevs.com.

FlutterDevs team of Flutter developers to build high-quality and functionally-rich apps. Hire Flutter developer for your cross-platform Flutter mobile app project on an hourly or full-time basis as per your requirement! For any flutter-related queries, you can connect with us on FacebookGitHubTwitter, and LinkedIn.

We welcome feedback and hope that you share what you’re working on using #FlutterDevs. We truly enjoy seeing how you use Flutter to build beautiful, interactive web experiences.

Need expert help building your Flutter app? Talk to FlutterExperts for architecture, development, and consulting support.


Multi-Item Picker Componentin FlutterFlow

0

FlutterFlow is a powerful visual app builder that allows you to create fully functional mobile and web applications without writing extensive code. While it provides many built-in components, sometimes you need a more tailored solution. In this blog, we’ll walk you through the process of creating a custom multi-item picker widget in FlutterFlow.

Why a Multi-Item Picker?

A multi-item picker is essential when users need to select more than one option from a list. Common use cases include selecting interests, tags, categories, or filtering items in e-commerce and survey apps.

FlutterFlow doesn’t have a built-in multi-select component, but with the help of custom widgets, you can easily build one that integrates seamlessly into your app.

Step 1: Set Up Your Custom Widget in FlutterFlow

To start, create a new custom widget in FlutterFlow:

  1. Go to the Custom Code section in the left panel.
  2. Under Widgets, click + Add.
  3. Name it something like MultiItemPickerComponent.
  4. Define the parameters:
  • items (List, required): The list of all items to display.
  • initialSelectedItems (List, optional): The list of items that should appear pre-selected.
  • title (String, optional): Title of the picker UI.
  • searchHintText (String, optional): Placeholder for the search input field.
  • width, height, maxHeight (optional): For layout customization.

Step 2: Writing the Widget Code

Here’s a simplified version of a FlutterFlow-compliant widget (no function callbacks):

// Automatic FlutterFlow imports
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/custom_code/widgets/index.dart'; 
import '/flutter_flow/custom_functions.dart'; 
import 'package:flutter/material.dart';
// Begin custom widget code
// DO NOT REMOVE OR MODIFY THE CODE ABOVE!

class MultiItemPickerComponent extends StatefulWidget {
  const MultiItemPickerComponent({
    Key? key,
    this.width,
    this.height,
    required this.items,
    this.initialSelectedItems,
    this.searchHintText = 'Search items...',
    this.title = 'Select Items',
    // this.buttonText = 'Done',
    this.maxHeight,
  }) : super(key: key);

  final double? width;
  final double? height;
  final double? maxHeight;
  final List<String> items;
  final List<String>? initialSelectedItems;
  final String searchHintText;
  final String title;
  // final String buttonText;

  @override
  _MultiItemPickerComponentState createState() =>
      _MultiItemPickerComponentState();
}

class _MultiItemPickerComponentState extends State<MultiItemPickerComponent> {
  final TextEditingController _searchController = TextEditingController();
  List<String> _filteredItems = [];
  List<String> _selectedItems = [];

  @override
  void initState() {
    super.initState();
    _filteredItems = widget.items;
    _selectedItems = widget.initialSelectedItems ?? [];
    _searchController.addListener(_filterItems);
  }

  @override
  void dispose() {
    _searchController.removeListener(_filterItems);
    _searchController.dispose();
    super.dispose();
  }

  void _filterItems() {
    final query = _searchController.text.toLowerCase();
    setState(() {
      _filteredItems = widget.items
          .where((item) => item.toLowerCase().contains(query))
          .toList();
    });
  }

  void _toggleItemSelection(String item) {
    setState(() {
      if (_selectedItems.contains(item)) {
        _selectedItems.remove(item);
      } else {
        _selectedItems.add(item);
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      width: widget.width ?? double.infinity,
      height: widget.height,
      constraints: BoxConstraints(
        maxHeight: widget.maxHeight ?? 400,
      ),
      decoration: BoxDecoration(
        color: Theme.of(context).cardColor,
        borderRadius: BorderRadius.circular(8),
        boxShadow: [
          BoxShadow(
            blurRadius: 4,
            color: Color(0x33000000),
            offset: Offset(0, 2),
          ),
        ],
      ),
      child: Padding(
        padding: EdgeInsets.all(16),
        child: Column(
          mainAxisSize: MainAxisSize.min,
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: [
                Text(widget.title,
                    style: Theme.of(context).textTheme.titleMedium),
                Text('${_selectedItems.length} selected',
                    style: Theme.of(context).textTheme.bodySmall),
              ],
            ),
            SizedBox(height: 12),
            TextFormField(
              controller: _searchController,
              decoration: InputDecoration(
                hintText: widget.searchHintText,
                border: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(8),
                ),
                prefixIcon: Icon(Icons.search),
                suffixIcon: _searchController.text.isNotEmpty
                    ? InkWell(
                        onTap: () {
                          _searchController.clear();
                        },
                        child: Icon(Icons.clear),
                      )
                    : null,
              ),
            ),
            SizedBox(height: 12),
            Text('Selected Items:',
                style: TextStyle(fontWeight: FontWeight.bold)),
            Wrap(
              spacing: 8,
              runSpacing: 8,
              children: _selectedItems.map((item) {
                return Chip(
                  label: Text(item),
                  onDeleted: () => _toggleItemSelection(item),
                );
              }).toList(),
            ),
            SizedBox(height: 12),
            Text('Available Items:',
                style: TextStyle(fontWeight: FontWeight.bold)),
            Expanded(
              child: ListView.builder(
                itemCount: _filteredItems.length,
                itemBuilder: (context, index) {
                  final item = _filteredItems[index];
                  final isSelected = _selectedItems.contains(item);
                  return ListTile(
                    title: Text(item),
                    trailing: Icon(
                      isSelected
                          ? Icons.check_box
                          : Icons.check_box_outline_blank,
                      color: isSelected
                          ? Theme.of(context).colorScheme.primary
                          : null,
                    ),
                    onTap: () => _toggleItemSelection(item),
                  );
                },
              ),
            ),
            SizedBox(height: 16),
          ],
        ),
      ),
    );
  }
}

Step 3: Use the Widget in Your UI

Now that your widget is added:

  1. Drag the MultiItemPickerComponent widget from the Custom Widgets tab.
  2. Pass the items list and optionally initialSelectedItems, title, or searchHintText.
  3. To retrieve selected items, bind the selected items to a local state or AppState variable using Actions in FlutterFlow.

For example:

  • On done/tap, update an AppState list variable with selected items using a custom action or logic.

Conclusion

With this custom widget, you now have a robust multi-item picker that works beautifully within the FlutterFlow environment. This approach offers flexibility, search capability, and a user-friendly interface.

This pattern — building custom widgets without callback parameters — can be reused for other advanced components. Happy building!

From Our Parent Company Aeologic

Aeologic Technologies is a leading AI-driven digital transformation company in India, helping businesses unlock growth with AI automation, IoT solutions, and custom web & mobile app development. We also specialize in AIDC solutions and technical manpower augmentation, offering end-to-end support from strategy and design to deployment and optimization.

Trusted across industries like manufacturing, healthcare, logistics, BFSI, and smart cities, Aeologic combines innovation with deep industry expertise to deliver future-ready solutions.

Feel free to connect with us:
And read more articles from FlutterDevs.com.

FlutterDevs team of Flutter developers to build high-quality and functionally-rich apps. Hire Flutterflow developer for your cross-platform Flutter mobile app project on an hourly or full-time basis as per your requirement! For any flutter-related queries, you can connect with us on Facebook, GitHub, Twitter, and LinkedIn.

We welcome feedback and hope that you share what you’re working on using #FlutterDevs. We truly enjoy seeing how you use Flutter to build beautiful, interactive web experiences.

Need expert help building your Flutter app? Talk to FlutterExperts for architecture, development, and consulting support.

Streamline your Flutter models with Freezed

Dart is fantastic, but let’s face it: defining a “model” might be difficult at times. Consider this:

  1. You must define properties and constructors.
  2. Override operator ==, hashCode, and toString.
  3. To clone the object, use the copyWith method.
  4. Take care of the (de)serialization.

That boilerplate code is a lot! Hundreds of lines can result from all of this, which raises the possibility of errors and makes your code more difficult to comprehend.

In this article, we will be explore Streamline your Flutter models with Freezed. We will learn how to execute a demo program. We will show you how to use freezed in Flutter with the freezed package in your Flutter applications.

For Freezed:

freezed | Dart package
Code generation for immutable classes that have a simple syntax/API without compromising on the features.pub.dev

If you’re looking for the best Flutter app development company for your mobile application then feel free to contact us at — support@flutterdevs.com.


Table Of Contents:

Introduction

Implementation

Code Implement

Conclusion



Introduction:

Freezed is a potent Dart code creation tool that:

  1. creates constructors, equality checks, toString, and other things automatically.
  2. simplifies null safety and immutability for your models.
  3. simplifies (de)serialization.

Freezed handles the rest, allowing you to concentrate on specifying the structure of your model.

Implementation:

Step 1: Add the dependencies

Include build_runner and bdd_widget_test in your pubspec.yaml file’s dev_dependencies section:

dependencies:
  freezed_annotation: latest version
  json_annotation: latest version

dev_dependencies:
  build_runner: latest version
  freezed: latest version
  json_serializable: latest version

Step 2: Run flutter packages get in the root directory of your app

flutter pub get

How to implement code in your file :

You need to implement it in your code respectively:

Converting a Post Model to Freezed

As an example, let’s look at a post model. The conventional definition is as follows:

class Post {
final int id;
final String title;
final String body;

Post({required this.id, required this.title, required this.body});

factory Post.fromJson(Map<String, dynamic> json) {
return Post(
id: json['id'],
title: json['title'],
body: json['body'],
);
}
}

Let’s use Freezed to rewrite it now. Make a new post.dart file and specify your model:

import ‘package:freezed_annotation/freezed_annotation.dart’;

part ‘post.freezed.dart’;
part ‘post.g.dart’;

@freezed
class Post with _$Post {
const factory Post({
required int id,
required String title,
required String body,
}) = _Post;

factory Post.fromJson(Map<String, dynamic> json) => _$PostFromJson(json);
}

This is what’s taking place:

  1. It instructs the package to create the boilerplate for the Post class using the annotation @freezed.
  2. The const factory is used to define the constructor.
  3. A fromJson method is created to handle serialisation.

Run the code generator:

dart run build_runner build

The following files will be produced as a result:

  • post.freezed.dart: The created constructors, equality, copyWith, and other utilities are contained.
  • post.g.dart: Serialisation logic is contained.

Using the Generated Code

You can use the Post model as follows, as Freezed has already done all the hard work for you:

Create a Post Instance:

final post = Post(id: 1, title: 'Hello World', body: 'This is the body of the post.');

Clone an Object with Modifications:

final updatedPost = post.copyWith(title: 'Updated Title');

Serialize to JSON:

final json = post.toJson();

Deserialize from JSON:

final newPost = Post.fromJson({
  'id': 2,
  'title': 'New Post',
  'body': 'This is a new post body.',
});

Conclusion:

In the article, I have explained how the Streamline your Flutter models with Freezed; you can modify this code according to your choice. This was a small introduction to Streamline your Flutter models with Freezed User Interaction from my side, and it’s working using Flutter.

I hope this blog will provide you with sufficient information on trying the Streamline your Flutter models with Freezed in your Flutter projectsWe will show you what the Introduction is. The agony of defining models in Dart is eliminated by Freezed. It takes care of the boilerplate so you can concentrate on creating amazing apps rather than being distracted by repeating code. So please try it.

❤ ❤ Thanks for reading this article ❤❤

If I need to correct something? Let me know in the comments. I would love to improve.

Clap 👏 If this article helps you.


From Our Parent Company Aeologic

Aeologic Technologies is a leading AI-driven digital transformation company in India, helping businesses unlock growth with AI automation, IoT solutions, and custom web & mobile app development. We also specialize in AIDC solutions and technical manpower augmentation, offering end-to-end support from strategy and design to deployment and optimization.

Trusted across industries like manufacturing, healthcare, logistics, BFSI, and smart cities, Aeologic combines innovation with deep industry expertise to deliver future-ready solutions.

Feel free to connect with us:
And read more articles from FlutterDevs.com.

FlutterDevs team of Flutter developers to build high-quality and functionally-rich apps. Hire Flutter developer for your cross-platform Flutter mobile app project on an hourly or full-time basis as per your requirement! For any flutter-related queries, you can connect with us on FacebookGitHubTwitter, and LinkedIn.

We welcome feedback and hope that you share what you’re working on using #FlutterDevs. We truly enjoy seeing how you use Flutter to build beautiful, interactive web experiences.

Related: Streamlining Payments In Flutter

Related: Exploring StreamBuilder In Flutter

Need expert help building your Flutter app? Talk to FlutterExperts for architecture, development, and consulting support.


Explore BDD in Flutter

0

In this article, we will Explore BDD in Flutter. We perceive how to execute a demo program. We will show you how to use BDD in Flutter with the bdd_widget_test package to write behaviour-driven tests in your Flutter applications.

For bdd_widget_test:

bdd_widget_test | Flutter package
A BDD-style widget testing library. Generates Flutter widget tests from *.feature files.pub.dev

If you’re looking for the best Flutter app development company for your mobile application then feel free to contact us at — support@flutterdevs.com.


Table Of Contents::

Introduction

Implementation

Code Implement

Conclusion



Introduction:

A collaborative approach to software development, behavior-driven development (BDD) focusses on the intended behaviour of the application as seen by the user in natural language. It entails using the Gherkin syntax, which explains application behaviour in Given-When-Then words, to write test scenarios in an organised manner.

This strategy guarantees that everyone involved is aware of how the application works. All of the functionality for retrieving posts and managing errors will be covered by the BDD-style test cases that we create. The example uses get_it for dependency injection and is built on a clean architecture.

Implementation:

Step 1: Add the dependencies

Include build_runner and bdd_widget_test in your pubspec.yaml file’s dev_dependencies section:

dev_dependencies:
  build_runner:latest version 
  bdd_widget_test:latest version 

Step 2: Run flutter packages get in the root directory of your app

Run the command:

flutter pub get

How to implement code in your file :

You need to implement it in your code respectively:

In the project’s test directory, create a Posts.feature file and add the following content:

Feature: Posts
    Situation: When the app is running, 
    users should see a list of posts. 
    Instead, I see the {CircularProgressIndicator} 
    widget.
    After waiting, I see a list of posts instead 
    of the {CircularProgressIndicator} widget.

   Situation: When retrieving posts, users should 
   notice an error.
   I see the phrase "Api failed error" when the 
   program is running with {sendError:true}, 
   but I don't see the {CircularProgressIndicator} widget.

Next, run the following command in your terminal:

dart run build_runner build --delete-conflicting-outputs

A posts_test.dart file and a step folder with the files i_see_posts_list.dart and the_app_is_running.dart will be produced as a result.

Now, we will create the_app_is_running.dart file:

We configure the application state and simulate PostCubit activity in this file:

import 'package:flutter_forge/presentation/bloc/post_cubit.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter_forge/main.dart';
import '../mocks.dart';
Future<void> theAppIsRunning(
  WidgetTester tester, {
  bool sendError = false,
}) async {
  if (getIt.isRegistered<PostCubit>()) {
    getIt.unregister<PostCubit>();
  }
  getIt.registerFactory(
    () => PostCubit(
      getMockUsecase(
        sendError: sendError,
      ),
    ),
  );
  await tester.pumpWidget(const MyApp());
}

Now, we will create mocks.dart file:

Depending on the sendError argument, this file either throws an error or delivers mock data:

import 'package:flutter_forge/domain/model/post_model.dart';
import 'package:flutter_forge/domain/usecases/get_posts_usecase.dart';
import 'package:get_it/get_it.dart';
import 'package:mocktail/mocktail.dart';

GetIt getIt = GetIt.instance;

class MockPostUsecase extends Mock implements GetPostsUseCase {}

GetPostsUseCase getMockUsecase({bool sendError = false}) {
  final mock = MockPostUsecase();
  if (sendError) {
    when(() => mock.execute()).thenThrow(Exception());
  } else {
    when(() => mock.execute()).thenAnswer(
      (_) => Future.value([
        Post(id: 1, title: "test1", body: "body1"),
        Post(id: 2, title: "test2", body: "body2"),
        Post(id: 3, title: "test3", body: "body3"),
      ]),
    );
  }
  return mock;
}

Now , we will create i_see_posts_list.dart file:

We confirm that the posts are visible in this file:

import 'package:bdd_widget_test/step/i_see_text.dart';
import 'package:flutter_test/flutter_test.dart';

/// Usage: I see posts list
Future<void> iSeePostsList(WidgetTester tester) async {
  await iSeeText(tester, "test1");
  await iSeeText(tester, "body1");

  await iSeeText(tester, "test2");
  await iSeeText(tester, "body2");

  await iSeeText(tester, "test3");
  await iSeeText(tester, "body3");
}

The generated posts_test.dart file integrates the steps to define the test scenarios:

// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: unused_import, directives_ordering

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import './step/the_app_is_running.dart';
import 'package:bdd_widget_test/step/i_see_widget.dart';
import 'package:bdd_widget_test/step/i_wait.dart';
import './step/i_see_posts_list.dart';
import 'package:bdd_widget_test/step/i_dont_see_widget.dart';
import 'package:bdd_widget_test/step/i_see_text.dart';

void main() {
  group('''Posts''', () {
    testWidgets('''Users should see list of Posts''', (tester) async {
      await theAppIsRunning(tester);
      await iSeeWidget(tester, CircularProgressIndicator);
      await iWait(tester);
      await iSeePostsList(tester);
      await iDontSeeWidget(tester, CircularProgressIndicator);
    });
    testWidgets('''Users should see error while fetching posts''',
        (tester) async {
      await theAppIsRunning(tester, sendError: true);
      await iSeeText(tester, "Api failed error");
      await iDontSeeWidget(tester, CircularProgressIndicator);
    });
  });
}

Run the Tests:

Use the following command to run the tests:

flutter test

For a report on coverage, use:

flutter test --coverage && genhtml coverage/lcov.info -o coverage/html && open coverage/html/index.html

Conclusion:

In the article, I have explained the Explore BDD in Flutter; you can modify this code according to your choice. This was a small introduction to the Explore BDD in Flutter User Interaction from my side, and it’s working using Flutter.

I hope this blog will provide you with sufficient information on Trying the Explore BDD in your Flutter projectsWe will show you what the Introduction is. Writing behavior-driven tests to make sure your Flutter application satisfies user expectations is made simple by using BDD with the bdd_widget_test package. You can ship high-quality apps with confidence when every functionality is covered. So please try it.

❤ ❤ Thanks for reading this article ❤❤

If I need to correct something? Let me know in the comments. I would love to improve.

Clap 👏 If this article helps you.


From Our Parent Company Aeologic

Aeologic Technologies is a leading AI-driven digital transformation company in India, helping businesses unlock growth with AI automation, IoT solutions, and custom web & mobile app development. We also specialize in AIDC solutions and technical manpower augmentation, offering end-to-end support from strategy and design to deployment and optimization.

Trusted across industries like manufacturing, healthcare, logistics, BFSI, and smart cities, Aeologic combines innovation with deep industry expertise to deliver future-ready solutions.

Feel free to connect with us:
And read more articles from FlutterDevs.com.

FlutterDevs team of Flutter developers to build high-quality and functionally-rich apps. Hire Flutter developer for your cross-platform Flutter mobile app project on an hourly or full-time basis as per your requirement! For any flutter-related queries, you can connect with us on FacebookGitHubTwitter, and LinkedIn.

We welcome feedback and hope that you share what you’re working on using #FlutterDevs. We truly enjoy seeing how you use Flutter to build beautiful, interactive web experiences.


Need expert help building your Flutter app? Talk to FlutterExperts for architecture, development, and consulting support.

Integrating Firebase Auth in FlutterFlow: Step-by-Step Guide

0

In today’s app-driven world, user authentication is essential for most mobile and web applications. Whether you’re building a social app, e-commerce platform, or internal business tool, securely identifying users is critical. Luckily, FlutterFlow—a powerful visual development platform—makes it easy to integrate Firebase Authentication without needing to write complex code.

In this blog, we’ll walk through the step-by-step process of integrating Firebase Auth in your FlutterFlow project, covering email/password login, sign-up, and guest login.

What is Firebase Authentication?

Firebase Authentication is a service that can authenticate users using only client-side code. It supports multiple authentication methods including:

  • Email/Password
  • Phone Number
  • Google, Facebook, and other providers
  • Anonymous (Guest) sign-ins

🛠 Prerequisites

Before you get started, make sure you have the following:

  • A Firebase project
  • A FlutterFlow account
  • A project already created in FlutterFlow

Step 1: Set Up Firebase Project

  1. Go to the Firebase Console: https://console.firebase.google.com
  2. Click “Add project”, follow the setup flow, and disable Google Analytics (optional).
  3. After the project is created, go to the Project Settings > General.
  4. Under “Your apps”, click </> (Web) to register your app.
  5. Name your app (e.g., flutterflow_app) and click Register App.
  6. Copy the Firebase configuration values like apiKey, authDomain, and projectId for later use in FlutterFlow.

Step 2: Add Firebase to FlutterFlow

  1. Open your FlutterFlow project.
  2. Go to the Firebase tab on the left sidebar.
  3. Click Connect.
  4. Paste the apiKey, authDomain, projectId, and other config keys you got from Firebase.
  5. Enable the Authentication, Firestore, and Storage options based on your needs.
  6. Click Save.

Step 3: Enable Firebase Authentication

  1. In Firebase Console, go to AuthenticationSign-in Method.
  2. Enable Email/Password.
  3. Optionally enable Anonymous for guest logins.

Step 4: Add Authentication Pages in FlutterFlow

FlutterFlow comes with built-in templates for user auth. To use them:

  1. Go to the “Authentication” tab in the page list.
  2. Click + Add Auth Pages.
  3. Choose options like Sign Up, Login, Forgot Password, and Profile Page.
  4. FlutterFlow will automatically connect the UI and logic using Firebase Auth.

🧪 Step 5: Set Authentication Actions

If you’re designing a custom login page:

  1. Add TextFields for email and password.
  2. Add a Button and go to the Actions tab.
  3. Set the On Tap action to Login (Firebase Auth) or Create Account (Firebase Auth).
  4. Map the input fields to the email and password parameters.

Step 6: Implement Guest Login (Optional)

To allow guest login:

  1. Add a button labeled “Continue as Guest”.
  2. In the Actions tab, choose Firebase AuthenticationAnonymous Login.
  3. Redirect the user to your dashboard/home page after success.

Step 7: Redirect Based on Auth State

  1. Open the App Settings > App Startup Flow.
  2. Set the Initial Page to:
    • Home Page if the user is logged in.
    • Login Page if the user is not logged in.
  3. This ensures users are always directed to the correct screen on app launch.

Final Testing

  • Run your app in Test Mode or use the Run button.
  • Try creating a new user, logging in, logging out, and guest login.
  • Firebase Console will show registered users under Authentication > Users.

Bonus Tips

  • Use Firebase Firestore to store user profiles and metadata.
  • Implement user roles using custom claims for admin/user separation.
  • Add Re-authentication flow for security-sensitive operations like password change.

Conclusion

Integrating Firebase Authentication in FlutterFlow is quick and code-free for most basic implementations. It enables you to build secure, scalable apps with login, signup, and guest access—all using FlutterFlow’s visual interface and Firebase’s backend power.

Start building smarter apps today with FlutterFlow and Firebase Auth!

From Our Parent Company Aeologic

Aeologic Technologies is a leading AI-driven digital transformation company in India, helping businesses unlock growth with AI automation, IoT solutions, and custom web & mobile app development. We also specialize in AIDC solutions and technical manpower augmentation, offering end-to-end support from strategy and design to deployment and optimization.

Trusted across industries like manufacturing, healthcare, logistics, BFSI, and smart cities, Aeologic combines innovation with deep industry expertise to deliver future-ready solutions.

Feel free to connect with us:
And read more articles from FlutterDevs.com.

FlutterDevs team of Flutter developers to build high-quality and functionally-rich apps. Hire Flutterflow developer for your cross-platform Flutter mobile app project on an hourly or full-time basis as per your requirement! For any flutter-related queries, you can connect with us on Facebook, GitHub, Twitter, and LinkedIn.

We welcome feedback and hope that you share what you’re working on using #FlutterDevs. We truly enjoy seeing how you use Flutter to build beautiful, interactive web experiences.

Related: Auth using AWS Amplify In Flutter

Need expert help building your Flutter app? Talk to FlutterExperts for architecture, development, and consulting support.

Design System with Atomic Design in Flutter

0

One of the most widely used methods for design teams to arrange and maintain the modules and components they utilise is atomic design. This file structure methodology separates each page’s components.

This blog will explore the Design System with Atomic Design in Flutter. We see how to execute a demo program in your applications.

If you’re looking for the best Flutter app development company for your mobile application then feel free to contact us at — support@flutterdevs.com.


Table Of Contents:

What is a Design System?

What is an Atomic Design?

Why does Flutter require System Design?

How does it contribute to the creation of more testable code?

What benefits does Atomic Design offer a design system?

How to implement in Flutter?

Conclusion



What is a Design System?:

A design system is a group of reusable parts, rules, and ideas that guarantee UI design and development is scalable, consistent, and efficient. It emphasises a product or group of products’ visual appeal, usability, and interface coherence.

Consider the design system as an internal product of the business rather than a project, and as such, it requires updating when new components, solutions, and style guides are created. Text tone of voice, branded application concepts, rounded buttons, and code snippets.

What is an Atomic Design?:

Atomic design is a methodology that helps us to think about the user interface in a hierarchical approach and stresses the relevance of the quality of effective pattern libraries, presenting strategies to optimize the workflow of design and development in a team. You can construct user interfaces (UIs) with greater consistency and quality by using atomic design, which also describes what occurs during the development and upkeep of design systems.

Atomic design is a conceptual model that helps us think of our user interfaces as both a collection of elements and a coherent whole at the same time. It is not a linear process.

Why does Flutter require System Design?

The versatility of Flutter’s custom widget creation frequently results in redundant components and misunderstandings regarding widget granularity. Grouping widgets by page, app-wide, or a combination of both may be difficult for teams to decide. Because they are afraid of damaging current implementations or leaving out functionalities, new members may design their widgets.

By providing pre-defined, reusable components that adhere to design rules, encouraging modularity, and minimising redundancy, a design system helps to alleviate these problems. The declarative structure of Flutter makes it even easier to develop design systems, facilitating the efficient propagation of changes throughout the application and improving scalability, maintainability, and testability.

How does it contribute to the creation of more testable code?:

By dividing the user interface (UI) into discrete, modular components that are separate from the business logic of the application, design systems improve testability. Design systems serve as a UI API that the application can use, in contrast to conventional solutions where widgets communicate directly with business logic.

Widgets may be constructed separately from logic thanks to this division, which makes it easier to test with custom data, streamlines the procedure, and guarantees more dependable, maintainable code. Although this may seem too wonderful to be true, we will see how it turns out in the article’s following sections.

What benefits does Atomic Design offer a design system?:

  1. Reusable Components — You can have the components you need for any design problem by building your library. Additionally, it’s quite easy to mix and match the components.
  2. Layout that’s easy to comprehend and maintain — Atomically built applications typically have considerably easier-to-read code than more conventionally structured ones. This holds both throughout the construction process and later on when the application is being examined for reference or small adjustments.
  3. Fewer components overall – Developers are more likely to utilise pre-existing components rather than generating new ones for slight modifications if they are shown a list of atoms, molecules, and organisms before they begin working on an application.

How to implement in Flutter?

In the hierarchy of our interface design systems, each of the five phases is essential. Let’s examine each step in further detail.

1. Atoms:

The tiniest UI building blocks are called atoms. These widgets are straightforward, reusable, and independent of other elements.

// Atom demo
class CustomTextFieldAtom extends StatelessWidget {
  final String labelText;
  final TextEditingController controller;
  final bool obscureText;
  final TextInputType keyboardType;
  final String? Function(String?)? validator;
  final IconData? prefixIcon;

  const CustomTextFieldAtom({
    required this.labelText,
    required this.controller,
    this.obscureText = false,
    this.keyboardType = TextInputType.text,
    this.validator,
    this.prefixIcon,
    Key? key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return TextFormField(
      controller: controller,
      obscureText: obscureText,
      keyboardType: keyboardType,
      validator: validator,
      decoration: InputDecoration(
        labelText: labelText,
        prefixIcon: prefixIcon != null ? Icon(prefixIcon) : null,
        border: const OutlineInputBorder(),
      ),
    );
  }
}

2. Molecules:

Atomic combinations that cooperate to carry out a task are called molecules. They frequently contain tiny, reusable UI components and are a tad more complicated.

// Molecule demo: A search input
class SearchInputMolecule extends StatelessWidget {
  final String labelText;
  final Function(String)? onSearch;
  final TextEditingController controller;

  const SearchInputMolecule({
    Key? key,
    required this.labelText,
    this.onSearch,
    required this.controller,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Row(
      children: [
        GestureDetector(
          onTap: () => onSearch?.call(controller.text),
          child: CustomIcon(Icons.search),
        ),
        SizedBox(width: 10),
        Expanded(
          child: CustomTextField(
            controller: controller,
            decoration: InputDecoration(
              labelText: labelText,
            ),
          ),
        ),
      ],
    );
  }
}

3. Organisms:

Groups of molecules and/or atoms that make up a certain area of the interface are called organisms. Usually, they stand in for more substantial, independent UI elements.

// Organism demo: A search card
class SearchCardOrganism extends StatelessWidget {
  final String labelText;
  final Function(String) onSearch;
  final List<String> recentSearches;
  final TextEditingController controller;

  const SearchCardOrganism({
    Key? key,
    required this.labelText,
    required this.onSearch,
    required this.controller,
    this.recentSearches = const [],
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Card(
      elevation: 4,
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: [
          SearchInputMolecule(
            labelText: labelText,
            onSearch: onSearch,
            controller: controller,
          ),
          if (recentSearches.isNotEmpty)
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: Wrap(
                spacing: 8,
                children: recentSearches
                    .map((search) => ActionChip(
                          label: Text(search),
                          onPressed: () {
                            controller.text = search;
                            onSearch(search);
                          },
                        ))
                    .toList(),
              ),
            ),
        ],
      ),
    );
  }
}

4. Template:

Templates combine creatures to provide a page with its skeleton or structure. The layout is specified, but specific content is left to be added later.

class SearchPageTemplate extends StatelessWidget {
  final String pageTitle;
  final String searchLabel;
  final Function(String) onSearch;
  final TextEditingController searchController;
  final List<String> recentSearches;

  const SearchPageTemplate({
    Key? key,
    required this.pageTitle,
    required this.searchLabel,
    required this.onSearch,
    required this.searchController,
    this.recentSearches = const [],
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: CustomAppBar(pageTitle),
      body: Column(
        children: [
          Padding(
            padding: const EdgeInsets.all(16.0),
            child: SearchCardOrganism(
              labelText: searchLabel,
              onSearch: onSearch,
              controller: searchController,
              recentSearches: recentSearches,
            ),
          ),
         // Body Widgets     
        ],
      ),
    );
  }
}

5. Page:

The last step is creating pages, where particular data is entered into templates to produce completely functional screens. They serve as a representation of the real user interface that the user uses.

class ProductSearchPage extends StatefulWidget {
  @override
  _ProductSearchPageState createState() => _ProductSearchPageState();
}

class _ProductSearchPageState extends State<ProductSearchPage> {
  final TextEditingController _searchController = TextEditingController();
  List<String> _recentSearches = [];
  List<Product> _searchResults = [];

  void _handleSearch(String query) {
    setState(() {
      // Update recent searches
      if (!_recentSearches.contains(query)) {
        _recentSearches.insert(0, query);
        if (_recentSearches.length > 5) {
          _recentSearches = _recentSearches.take(5).toList();
        }
      }

      // Perform search logic
      _searchResults = _performProductSearch(query);
    });
  }

  List<Product> _performProductSearch(String query) {
    // Simulated search logic
  }

  @override
  Widget build(BuildContext context) {
    return SearchPageTemplate(
      pageTitle: 'Product Search',
      searchLabel: 'Search Products',
      onSearch: _handleSearch,
      searchController: _searchController,
      recentSearches: _recentSearches,
      resultWidget: ListView.builder(
        itemCount: _searchResults.length,
        itemBuilder: (context, index) {
          final product = _searchResults[index];
          return ListTile(
            title: Text(product.title),
            subtitle: Text('\$${product.price}'),
          );
        },
      ),
    );
  }
}

Conclusion:

In the article, I have explained the  Design System with Atomic Design basic structure in a flutter; you can modify this code according to your choice. This was a small introduction to the  Design System with Atomic Design in Flutter, On User Interaction from my side, and it’s working using Flutter.

I hope this blog will provide you with sufficient information on trying the Design System with Atomic Design in Flutter in your projects. When used with Flutter, the atomic design pattern and design systems offer a streamlined and effective method for creating modular, scalable, and testable user interfaces. The interface can be made consistent, less redundant, and easier to design, and reusable parts: atoms, molecules, creatures, templates, and pages.

We can create Flutter apps that are both technically sound and aesthetically pleasing by fusing the strength of design systems with atomic design principles. Using this method will surely improve your development workflow, making your codebase more structured, reusable, and future-proof, regardless of how big or small your project is. So please try it.

❤ ❤ Thanks for reading this article ❤❤

If I got something wrong? Let me know in the comments. I would love to improve.

Clap 👏 If this article helps you.


From Our Parent Company Aeologic

Aeologic Technologies is a leading AI-driven digital transformation company in India, helping businesses unlock growth with AI automation, IoT solutions, and custom web & mobile app development. We also specialize in AIDC solutions and technical manpower augmentation, offering end-to-end support from strategy and design to deployment and optimization.

Trusted across industries like manufacturing, healthcare, logistics, BFSI, and smart cities, Aeologic combines innovation with deep industry expertise to deliver future-ready solutions.

Feel free to connect with us:
And read more articles from FlutterDevs.com.

FlutterDevs team of Flutter developers to build high-quality and functionally-rich apps. Hire Flutter developer for your cross-platform Flutter mobile app project on an hourly or full-time basis as per your requirement! For any flutter-related queries, you can connect with us on FacebookGitHubTwitter, and LinkedIn.

We welcome feedback and hope that you share what you’re working on using #FlutterDevs. We truly enjoy seeing how you use Flutter to build beautiful, interactive web experiences.


Need expert help building your Flutter app? Talk to FlutterExperts for architecture, development, and consulting support.

Virkningen af ​​gamification på casinoengagement

Game-baseret tilgang bliver i stigende grad en vigtig taktik i spillesektoren, hvilket øger deltagerens engagement og tro. Ved at inkludere spilinspirerede elementer i traditionelle spilinteraktioner kan ledere skabe en yderligere interaktiv og underholdende atmosfære. I henhold til en 2023-årig undersøgelse fra Gaming Innovation Group Innovation Organization kan Gamification øge deltagerens fortsættelsesgrad med op til tredive procent.

Et væsentligt firma, der bruger spilmekanik, er BetMGM, der har implementeret et incitamentersystem, der gør det muligt for spillere at få tokens gennem gameplay. Sådanne kreditter kan indløses for forskellige frynsegoder, der omfatter gratis indsatser og eksklusive oplevelser. Du kan finde ud af yderligere detaljer om deres projekter om deres Officiel | autoriseret | certificeret} websted .

Inden for året 2022 lancerede Wynn Las Vegas en interaktiv mobilapp, der indeholder udfordringer og resultattavler, der opfordrede spillere til at kæmpe for præmier. Dette projekt øger ikke kun legemødet, men plejer også en følelse af samvær blandt deltagerne. For mere information om effektiviteten af ​​gamification i spilsteder, se The New York Times .

Game Mechanics -metoder indeholder ofte funktioner såsom gennemførelsestokens, belønningspunkter og interaktive udfordringer, der kan forbedre deltagerinteraktionen betydeligt. Oplev mere om disse engagerende funktioner på online casino.

Som tendensen til gamification fortsætter til at udvide, skal kasinoer koncentrere sig om at skabe betydelige og opfyldende møder for spillere. Ved at gøre det kan de ikke kun øge engagementet, men også opbygge langsigtet tro på et udfordrende marked.