Google search engine
Home Blog Page 8

Dismissible In Flutter

0

In Flutter, assuming you want to make a widget that can be dismissed, you can wrap the widget as the child of Dismissible. A dismissible Widget in Flutter is typically used to wrap each list item with the goal that it tends to be excused, either horizontally or vertically direction.

This blog will explore the Dismissible In Flutter. We perceive how to execute a demo program. We will figure out how to utilize the widget, including how to show the confirmation dialog, set backgrounds that will be shown when the child is being dismissed, and set dismissed directions 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::

Introduction

Constructor

Properties

Code Implement

Code File

Conclusion



Introduction:

A widget can be dismissed by dragging in the demonstrated direction. Dragging or hurling this widget in the DismissDirection makes the child slide out of view.

Demo Module ::

This demo video shows how to use the dismissible in a flutter and shows how a dismissible will work in your flutter applications. We will show a user dragging or fingering by dismissing a widget. It will be shown on your devices.

Constructor:

To utilize Dismissible, you need to call the constructor underneath:

You are required to pass the key (Key) and child (Widget). key turns out to be vital since the widget can be taken out from the widget list. If there are different dismissible widgets, ensure each has a unique key.

const Dismissible({
required Key key,
required this.child,
this.background,
this.secondaryBackground,
this.confirmDismiss,
this.onResize,
this.onUpdate,
this.onDismissed,
this.direction = DismissDirection.horizontal,
this.resizeDuration = const Duration(milliseconds: 300),
this.dismissThresholds = const <DismissDirection, double>{},
this.movementDuration = const Duration(milliseconds: 200),
this.crossAxisEndOffset = 0.0,
this.dragStartBehavior = DragStartBehavior.start,
this.behavior = HitTestBehavior.opaque,
})

Be mindful not to involve the index as a key as dismissing a widget can change the index of different widgets. The second required property is a child where you want to pass the widget that can be dismissed.

Another significant property is onDismissed. It’s a callback function tolerating one boundary of type DismissDirection. Inside, you can characterize what to do after the widget has been dismissed. For instance, you can eliminate the widget from the list.

Properties:

There are some properties of Dismissible are:

  • > key — This property is used to control if it should be replaced.
  • > child — This property is used below this widget in the tree.
  • > background — This property is used to stack behind the child. It secondaryBackground is set, it’s only shown when the child is being dragged down or to the right.
  • secondaryBackground — This property is used to stack behind the child. It’s only shown when the child is being dragged up or to the left.
  • > confirmDismiss— This property is used to allow the app to confirm or veto a pending dismissal.
  • > onResize — This property is used for the callback that will be called when the widget changes size.
  • > onDismissed — This property is used for the callback that will be called when the widget has been dismissed.
  • > direction — This property is used to the direction in which the widget can be dismissed. Defaults to DismissDirection.horizontal.
  • > resizeDuration — This property is used to the amount of time the widget will spend contracting before onDismissed is called. Defaults to const Duration(milliseconds: 300).
  • > dismissThresholds — This property is used to the offset threshold the item has to be dragged to be considered dismissed. Defaults to const <DismissDirection, double>{}.
  • > movementDuration — This property is used to the duration to dismiss or back to the original position if not dismissed. Defaults to const Duration(milliseconds: 200).
  • > crossAxisEndOffset — This property is used to the end offset across the main axis after the card is dismissed. Defaults to 0.0.
  • > dragStartBehavior — This property is used for how the drag start behavior is handled. Defaults to DragStartBehavior.start.

How to implement code in dart file :

You need to implement it in your code respectively:

Create a new dart file called main.dart inside the lib folder.

We will make a basic ListView where the thing can be dismissed. The ListView is made utilizing the accompanying values.

 List<String> items = [
"Watch",
"Jeans",
"Shirt",
"T-Shirt",
"Cup",
"Shoes",
"Cap",
"Shorts",
"Trouser",
"Lower",
];

Here is the code for building the ListView. The itemBuilder, which is utilized to construct the list of items, returns a Dismissible. Notwithstanding the required arguments (key and child), an onDismissed callback is additionally passed. The model tells you the best way to set various actions for every direction.

ListView.builder(
itemCount: items.length,
padding: const EdgeInsets.symmetric(vertical: 16),
itemBuilder: (BuildContext context, index) {
return Dismissible(
key: Key('item ${items[index]}'),
onDismissed: (DismissDirection direction) {
if (direction == DismissDirection.startToEnd) {
print("Add to favorite");
} else {
print('Remove item');
}

setState(() {
items.removeAt(index);
});
},
child: ListTile(
leading: const Icon(
Icons.card_giftcard_rounded,
color: Colors.black,
),
title: Text(
items[index],
style: TextStyle(
color: Colors.black.withOpacity(.6), fontSize: 18),
),
subtitle: Text(
"This Gift is For you",
style: TextStyle(color: Colors.green.withOpacity(.6)),
),
),
);
}
),

When we run the application, we ought to get the screen’s output like the underneath screen capture.

Output

> Showing Confirmation

Dismissible is frequently utilized for deleting an activity. On the off chance that you think the performed activity is critical and can’t be scattered, it’s smarter to show affirmation before the activity is characterized inside onDismissed is performed.

You can do it by passing confirmDismissCallback to the constructor. A callback acknowledges one parameter of type DismissDirection and returns Future<bool>. The below model shows an AlertDialog where the client can confirm to delete the item or cancel the action.

confirmDismiss: (DismissDirection direction) async {
return await showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: const Text("Remove Gift"),
content: const Text("Are you sure you want to remove this item?"),
actions: <Widget>[
ElevatedButton(
onPressed: () => Navigator.of(context).pop(true),
child: const Text("Yes")),
ElevatedButton(
onPressed: () => Navigator.of(context).pop(false),
child: const Text("No"),
),
],
);
},
);
}

> Setting Backgrounds

The default dismiss direction is horizontal. You can swipe to the right or left. Swiping left or right might result in an alternate action, relying upon what you characterize in the onDismissed callback. Flutter additionally permits you to set various widgets that will be shown when the child is being dismissed.

Utilize the background to characterize the widget to be shown when the child is swiped to the right and the secondary background for the widget when the child is swiped to the left. Assuming you just set the background, it will be utilized for the two directions.

background: Container(
color: Colors.blue,
child: Padding(
padding: const EdgeInsets.all(15),
child: Row(
children: const [
Icon(Icons.favorite, color: Colors.red),
SizedBox(
width: 8.0,
),
Text('Move to favorites',
style: TextStyle(color: Colors.white)),
],
),
),
),
secondaryBackground: Container(
color: Colors.red,
child: Padding(
padding: const EdgeInsets.all(15),
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: const [
Icon(Icons.delete, color: Colors.white),
SizedBox(
width: 8.0,
),
Text('Move to trash',
style: TextStyle(color: Colors.white)),
],
),
),
),

When we run the application, we ought to get the screen’s output like the underneath screen capture.

Final Output

Code File:

import 'package:flutter/material.dart';
import 'package:flutter_dismissible_demo/splash_screen.dart';

void main() {
runApp(const MyApp());
}

class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);

@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primarySwatch: Colors.teal,
),
debugShowCheckedModeBanner: false,
home: const Splash(),
);
}
}

class DismissibleDemo extends StatefulWidget {
const DismissibleDemo({Key? key}) : super(key: key);

@override
State<DismissibleDemo> createState() => _DismissibleDemoState();
}

class _DismissibleDemoState extends State<DismissibleDemo> {
List<String> items = [
"Watch",
"Jeans",
"Shirt",
"T-Shirt",
"Cup",
"Shoes",
"Cap",
"Shorts",
"Trouser",
"Lower",
];

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.teal,
centerTitle: true,
automaticallyImplyLeading: false,
title: const Text("Flutter Dismissible Demo"),
),
body: ListView.builder(
itemCount: items.length,
padding: const EdgeInsets.symmetric(vertical: 16),
itemBuilder: (BuildContext context, int index) {
return Dismissible(
background: Container(
color: Colors.blue,
child: Padding(
padding: const EdgeInsets.all(15),
child: Row(
children: const [
Icon(Icons.favorite, color: Colors.red),
SizedBox(
width: 8.0,
),
Text('Move to favorites',
style: TextStyle(color: Colors.white)),
],
),
),
),
secondaryBackground: Container(
color: Colors.red,
child: Padding(
padding: const EdgeInsets.all(15),
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: const [
Icon(Icons.delete, color: Colors.white),
SizedBox(
width: 8.0,
),
Text('Move to trash',
style: TextStyle(color: Colors.white)),
],
),
),
),
key: ValueKey<String>(items[index]),
onDismissed: (DismissDirection direction) {
setState(() {
items.removeAt(index);
});
},
confirmDismiss: (DismissDirection direction) async {
if (direction == DismissDirection.startToEnd) {
return await showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: const Text("Add Gift to Cart"),
content: const Text(
"Are you sure you want to add this gift in your cart"),
actions: <Widget>[
ElevatedButton(
onPressed: () => Navigator.of(context).pop(true),
child: const Text("Yes")),
ElevatedButton(
onPressed: () => Navigator.of(context).pop(false),
child: const Text("No"),
),
],
);
},
);
} else {
return await showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: const Text("Remove Gift"),
content: const Text(
"Are you sure you want to remove this gift item?"),
actions: <Widget>[
ElevatedButton(
onPressed: () => Navigator.of(context).pop(true),
child: const Text("Yes")),
ElevatedButton(
onPressed: () => Navigator.of(context).pop(false),
child: const Text("No"),
),
],
);
},
);
}
},
child: ListTile(
leading: const Icon(
Icons.card_giftcard_rounded,
color: Colors.black,
),
title: Text(
items[index],
style: TextStyle(
color: Colors.black.withOpacity(.6), fontSize: 18),
),
subtitle: Text(
"This Gift is For you",
style: TextStyle(color: Colors.green.withOpacity(.6)),
),
),
);
},
));
}
}

Conclusion:

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

I hope this blog will provide you with sufficient information on Trying the Dismissible in your flutter projectsWe will show you what the Introduction is and what are the construction and properties of the Dismissible and make a demo program for working with Dismissible in your flutter applications. 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! You can connect with us on FacebookGitHubTwitter, and LinkedIn for any flutter-related queries.

We welcome feedback and hope 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


How to Debug and Fix Errors in FlutterFlow Projects?

0

Debugging is an essential part of app development, and even though FlutterFlow simplifies the process, errors and issues can still arise. Understanding how to debug and fix errors effectively can save you time and frustration. This guide will cover common errors, debugging techniques, and solutions to ensure your FlutterFlow project runs smoothly.

1. Understanding Common Errors in FlutterFlow

Before diving into debugging, let’s look at some of the most common errors developers face when working with FlutterFlow:

a. API & Backend Issues

  • API calls failing due to incorrect endpoints, parameters, or authentication issues.
  • Incorrect Firebase database rules restricting access to read/write data.
  • Missing API keys or incorrect configurations.

b. UI & Navigation Errors

  • Widgets not displaying correctly due to layout issues.
  • Page navigation not working because of incorrect route settings.
  • Overlapping UI elements causing bad user experience.

c. State Management Issues

  • Data not updating in real-time due to improper Firestore integration.
  • Variables and states not persisting when switching pages.
  • Conditional visibility not working properly due to incorrect logic.

d. Performance & Optimization Issues

  • Slow app performance due to unoptimized images or inefficient queries.
  • Excessive API calls causing rate limits.
  • App crashes due to memory overload.

2. Debugging Tools in FlutterFlow

FlutterFlow provides built-in tools and third-party integrations to help debug your app efficiently.

a. Run/Test Mode in FlutterFlow

  • Use the Run Mode feature to preview your app and check for UI errors.
  • The Test Mode allows you to simulate API requests and check real-time data flow.

b. Debug Console & Error Logs

  • The debug console in FlutterFlow helps identify errors related to API calls, database connections, and UI rendering.
  • If your app crashes, check the error logs to find the exact issue.

c. Firebase Debugging

  • Use Firebase Emulator Suite to test Firestore, Authentication, and Functions locally.
  • Check Firebase Console → Logs for errors in authentication and Firestore queries.

d. Browser Console for Web Apps

  • If debugging a FlutterFlow web app, open the browser’s developer console (Chrome: Ctrl + Shift + I → Console tab) to check for warnings and errors.

3. Fixing Errors in FlutterFlow

a. Debugging API & Backend Issues

 Problem: API call is not returning data.
 Solution:

  1. Check if the API endpoint URL is correct.
  2. Verify that API headers and parameters match the API documentation.
  3. Enable CORS if your API restricts cross-origin requests.
  4. Use Postman or cURL to test the API before integrating it into FlutterFlow.

 Problem: Firestore database data is not loading.
 Solution:

  1. Check Firebase rules (Firebase → Firestore → Rules). Example of an open rule:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
}
}
}

2. Verify that the Firestore collection name matches what you are using in FlutterFlow.

3. Enable Firebase logs to see database read/write failures.

b. Fixing UI & Navigation Errors

 Problem: Button click doesn’t navigate to the next page.
 Solution:

  1. Check if the navigation action is correctly set (onClick → Navigate to Page).
  2. Ensure the destination page exists in the project.
  3. Use debug mode to inspect page transitions.

 Problem: UI elements are not displaying correctly.
 Solution:

  1. Use Container → Debug Mode to inspect layouts.
  2. Check padding, margin, and constraints to avoid overlapping.
  3. Ensure visibility conditions are correct (if using conditional rendering).

c. Resolving State Management Issues

 Problem: Data disappears when navigating between pages.
 Solution:

  1. Use App State variables instead of local state variables for persistent data.
  2. Check if data is being cleared on navigation (avoid resetting variables unnecessarily).
  3. Use Firestore Streams for real-time updates instead of manual fetches.

 Problem: Toggle switch/button not updating UI correctly.
 Solution:

  1. Ensure the widget is connected to a state variable.
  2. Use Set State Action to refresh UI elements dynamically.
  3. If using Firestore, verify that data updates are reflected in real-time.

d. Fixing Performance & Optimization Issues

 Problem: App is running slowly.
 Solution:

  1. Optimize Firestore queries by using where clauses to fetch only relevant data.
  2. Reduce API calls by caching responses or using local state storage.
  3. Compress images using WebP format instead of PNG/JPEG.

 Problem: App is crashing unexpectedly.
 Solution:

  1. Open Flutter DevTools to check memory usage and leaks.
  2. Enable error tracking in Firebase Crashlytics.
  3. Check if any dependencies conflict with each other.

4. Best Practices to Avoid Errors in FlutterFlow

To prevent issues before they occur, follow these best practices:

a. Use Version Control

  • Always save different versions of your project in GitHub or Firebase Hosting.
  • Keep a backup before making major changes.

b. Test Features in Stages

  • Instead of building everything at once, test UI components and API calls separately.
  • Use FlutterFlow’s Run Mode frequently to check for early issues.

c. Follow Firebase & API Documentation

  • Read the official Firebase & API documentation before integrating them into your app.
  • Keep track of API updates to avoid deprecated methods.

d. Monitor Logs & Analytics

  • Use Google Analytics for Firebase to track user interactions and errors.
  • Regularly check Firestore logs for failed queries and permission issues.

Conclusion

Debugging in FlutterFlow is straightforward if you follow a structured approach. By identifying common errors, using built-in debugging tools, and applying best practices, you can quickly resolve issues and build a stable FlutterFlow app. Whether it’s fixing API issues, UI glitches, or performance problems, proper debugging will save time and enhance user experience.

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.

List Of Dates Between Two Given Dates In Flutter & Dart

0

While creating applications with Flutter and Dart, there may be circumstances where you want to separate a list of dates between two given dates.

This article will explore the List Of Dates Between Two Given Dates In Flutter & Dart. We will perceive how to execute a demo program and we are going to learn about how we can use it 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::

Using a For loop

Using List.generate()

Conclusion



Using a For loop:

In this underneath example, we’ll characterize a function named getDaysInBetween that takes two contentions, startDate, and endDate, and returns a list of dates between them including the limits.

The code:

List<DateTime> getDaysInBetween(DateTime startDate, DateTime endDate) {
List<DateTime> days = [];
for (int i = 0; i <= endDate.difference(startDate).inDays; i++) {
days.add(startDate.add(Duration(days: i)));
}
return days;
}

// try it out
void main() {
DateTime startDate = DateTime(2023, 5, 5);
DateTime endDate = DateTime(2023, 5, 15);

List<DateTime> days = getDaysInBetween(startDate, endDate);

// print the result without time
days.forEach((day) {
print(day.toString().split(' ')[0]);
});
}

When we run the application, we ought to get the screen’s output like the underneath screen Console Output.

2023-05-05
2023-05-06
2023-05-07
2023-05-08
2023-05-09
2023-05-10
2023-05-11
2023-05-12
2023-05-13
2023-05-14
2023-05-15

Process finished with exit code 0

Using List.generate():

You can get a list of dates between two given dates by utilizing the List.generate() technique and pass the number of days between the beginning and end date as the length parameter.

The code:

List<DateTime> getDaysInBetween(DateTime startDate, DateTime endDate) {
final daysToGenerate = endDate.difference(startDate).inDays + 1;
return List.generate(daysToGenerate, (i) => startDate.add(Duration(days: i)));
}

// try it out
void main() {
DateTime startDate = DateTime(2023, 5, 10);
DateTime endDate = DateTime(2023, 5, 15);

List<DateTime> days = getDaysInBetween(startDate, endDate);

// print the result without time
days.forEach((day) {
print(day.toString().split(' ')[0]);
});
}

When we run the application, we ought to get the screen’s output like the underneath screen Console Output.

2023-05-11
2023-05-12
2023-05-13
2023-05-14
2023-05-15

Process finished with exit code 0

Conclusion:

In the article, I have explained the list of dates between two given dates in Flutter & Dart; you can modify this code according to your choice. This was a small introduction to List Of Dates Between Two Given Dates In Flutter & Dart User Interaction from my side, and it’s working using Flutter.

I hope this blog will provide you with sufficient information on Trying the List Of Dates Between Two Given Dates In Flutter & Dart of your projects. 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 hourly or full-time 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 how you use Flutter to build beautiful, interactive web experiences.


By Shaiq khan on June 14, 2023.

Canonical link

Exported from Medium on December 4, 2023.

FlutterFlow For MVP Development

0

This blog will explore FlutterFlow for MVP development. How creating an MVP is made easier by FlutterFlow’s drag-and-drop interface, low-code platform, rapid prototyping, and many other notable features. We’ve covered the basics of developing an MVP, the primary justifications for using FlutterFlow, and a few successful company examples that have used this low-code approach.

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

Key Reasons

What is FlutterFlow?

Why Choose FlutterFlow For MVP Development?

Conclusion



Introduction:

Every company must validate its product idea in the rapidly evolving world of digital ecosystems before devoting a substantial amount of time and resources to the development phase. The idea of an MVP (Minimum Viable Product) enters the picture here. One of the best ways to test the functionality, potential, and user experience of your digital product before making a significant investment in full-fledged development is to build an MVP.

In order to lower the failure risk during product development, Proof of Concepts (PoCs) and Minimum Viable Products (MVPs) are frequently essential components. MVPs allow companies to quickly test their ideas in the market and get insightful feedback for future development. FlutterFlow stands out as a game-changer as developers and entrepreneurs look for useful frameworks and tools to create MVPs. It provides an affordable and aesthetically pleasing platform for MVP development.

Key Reasons:

A minimum viable product, or MVP, is the minimalist version of your product that only includes just enough features to validate the business idea and attract early adopters. It encompasses very limited features and functions essential to delivering value to first users and obtain enhancement feedback. Instead of investing many resources, fortune, and time into creating a fully developed product, it is favorable to create an MVP for mobile apps or websites to collect user feedback and validate market demand. These benefits include the following:

The bare minimum version of your product that has just enough features to verify the business concept and draw in early adopters is known as a minimum viable product, or MVP. It just includes the bare minimum of features and capabilities necessary to provide value to initial users and gather feedback for improvement. It is better to produce an MVP for websites or mobile apps to get user input and confirm market need rather than spending a lot of money, time, and resources on a fully developed product. Among these advantages are the following:

  • Idea Validation: Businesses may test and validate the features and potential of their applications in the real world with an MVP. It assists them in determining whether or not the target market will find their app idea appealing. Before investing in lengthy development, companies can evaluate user engagement and improve the product based on user feedback by releasing a basic and minimalistic version of the actual product.
  • Resource Efficiency: Businesses that think about creating a whole application from the ground up will have to spend a lot of money, time, and effort. But with MVP development, they can avoid failure risks and make efficient use of their resources.
  • Faster Time to Market: Developing an MVP undoubtedly aids companies in launching their products swiftly. Because MVPs can be created quickly, companies can outperform rivals who might still be bogged down in the process of creating a more comprehensive product.
  • Cost Efficiency: When developing an MVP, everything is kept clear and simple, from design to development. As a result, the MVP development cost is significantly reduced because the minimal viable product only has the functionality necessary to carry out key tasks. This economical strategy is especially beneficial for new businesses and entrepreneurs with tight funds.
  • Gathering User Feedback: Obtaining early user feedback is a primary motivation for developing an MVP. Businesses can find defects, learn about consumer preferences, and make sure that the product is improved to match user expectations by getting early feedback on the MVP.
  • Iterative Improvements: If you want a dependable framework for quick prototypes, iteration, and improvement, MVPs are your best bet. Based on customer experience and feedback, it enables companies to improve their product, address issues found, and make it more effective and efficient. Companies can succeed in this cutthroat industry by implementing this economical, iterative development strategy.

What is FlutterFlow?

One way to describe FlutterFlow is as a low-code development platform that facilitates quicker, easier, and more effective app creation. FlutterFlow, which is based on Google’s Flutter framework, enables fans to create web and mobile apps without the need for coding or development expertise. That means that because of its simple drag-and-drop feature, FlutterFlow may be used for MVP development by developers, designers, and even non-technical users who are not tech users.

Developers use FlutterFlow because of its cross-platform compatibility and quick MVP development process. Using a visual interface provided by this low-code/no-code platform, developers can create applications by rearranging text boxes and buttons on a screen. Furthermore, FlutterFlow is adaptable to both straightforward and intricate projects since it permits the insertion of unique Dart code. In addition to being compatible with Firebase, it provides capabilities like cloud storage, safe data management, real-time databases, and authentication to further expedite app development.

Why Choose FlutterFlow For MVP Development?

When developing a Minimum Viable Product (MVP), you must work quickly, strategically, and economically. And FlutterFlow, the low-code/no-code development ally, can help you accomplish it with ease. FlutterFlow is a robust platform that makes app development easier with its drag-and-drop tools, visual interface, and smooth integration features. Both experienced and novice developers can create MVPs in the low-code environment without having to worry about complicated coding. The following are the main justifications for selecting FlutterFlow for developing MVPs:

  • Drag and Drop Interface: FlutterFlow’s drag-and-drop interface, which enables users to construct intricate app user interfaces without writing a single line of code, is one of the main reasons to utilise it for MVP development. Components like buttons, text boxes, and images can be easily arranged on canvas by dragging and dropping them to create user interfaces that are easy to understand. This feature enables faster prototyping, making it easy for everyone, especially non-tech users, to start building apps.
  • 10 Times Faster Development: Rapid iteration and development are essential when creating an MVP, and FlutterFlow is excellent at this. Compared to native application development, which uses a typical coding method, developers may produce MVPs 10 times faster with our low-code development platform. You can save a tonne of time by avoiding the need to create complicated code scripts thanks to the drag-and-drop feature, pre-made components, and simple deployment.
  • Visual Builder: One of FlutterFlow’s most useful features is its visual builder, which is why the majority of business owners choose this low-code/no-code platform to create MVPs. Users can design apps in real time and see the interface changes they make instantly with FlutterFlow’s user-friendly visual builder. Designing interactive prototypes that mimic the functionality and user experience of the real app will be much quicker.

Conclusion:

In the article, I have explained the FlutterFlow For MVP Development basic structure; you can modify this code according to your choice. This was a small introduction to the FlutterFlow For MVP Development On User Interaction from my side, and it’s working using Flutterflow.

I hope this blog will provide you with sufficient information on Trying FlutterFlow For MVP Development in your projects. For companies looking to create minimal viable products (MVPs), FlutterFlow is unquestionably revolutionary. FlutterFlow is a good choice for MVP development because of its user-friendly UI, drag-and-drop capabilities, large component libraries, and quick interaction with third-party APIs and backend providers like Firebase and Supabase. 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 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 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.


Custom QR Code Generator in Flutterflow — Custom Widget

0

QR codes offer a quick and convenient way to share data like URLs, contact information, Wi-Fi credentials, and more. By simply scanning a QR code with apps like Google Lens (Android), Apple Camera (iOS), or your own custom-built app, users can instantly access the embedded content.

In this guide, We’ll learn how to create a Custom QR Code Generator using Flutterflow. We’ll walk you through building a reusable widget that can be easily integrated into your FlutterFlow app. With customizable colors, shapes, you can generate QR codes that match your app’s style and branding!

Package overview

Here’s a Flutter package you can use to build your own QR code generator widget.

You can explore Flutter packages on pub.dev, the official package repository for Dart and Flutter. One popular and well-maintained option for generating QR codes is qr_flutter, known for its reliability and community support.

The package maintains strong metrics including Likes, Pub Points (up to 150), and a high Popularity rating (out of 100%). You can learn more about how these scores work here.
 It also supports web, making it easy to preview and test your widget directly in FlutterFlow’s Run/Test mode.

Setup FlutterFlow 

  1. Go to FlutterFlow Website
     Visit flutterflow.io and log in with your Google or GitHub account. If you don’t have an account, sign up for free.
  2.  Create a New Project
  • After logging in, click the “Create New” button on the Flutter Flow dashboard.
  • Choose “Blank App” or select from templates if you want a head start.

3. Name Your Project
 Enter a name for your app and optionally add a project description.

4. Choose a Platform
 Select the platforms you’re building for: Android, iOS, Web, or All.

5. Set Up Firebase (Optional but Recommended)

  • You can skip this for now or connect your Firebase project.
  • Firebase enables authentication, Firestore database, storage, and more.

6. Select a Layout
 Choose a layout like mobile app, tablet, or web view based on your target platform.

7. Start Building Your App
 Once inside the project, you can:

  • Drag and drop widgets from the UI builder
  • Add pages, components, and navigation
  • Connect backend APIs or Firebase
  • Use Custom Functions and Custom Widgets for advanced logic

8. Run/Test Your App

  • Use the Run/Test tab to preview your app in real-time on the web.
  • You can also use the FlutterFlow Preview App on mobile for live testing.

Defining the Custom Action

  1. From the Navigation Menu (present on the left), select Custom Functions.
  2. Go to the Custom Actions tab and click + Create.
  3. Enter the action name as QrCode
  4. Add the package

Most well-known packages provide a simple usage example to help you get started quickly. On the qr_flutter package page, if you scroll down, you’ll find an Examples section. It includes a basic QR code generation snippet that serves as a great starting point for integrating the package into your app.

5. Add this Code in your Custom Code Widget.

// 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!

import 'package:qr_flutter/qr_flutter.dart';

import 'package:qr_flutter/qr_flutter.dart';

class QrCode extends StatefulWidget {
const QrCode({
super.key,
this.width,
this.height,
});

final double? width;
final double? height;

@override
State<QrCode> createState() => _QrCodeState();
}

class _QrCodeState extends State<QrCode> {
TextEditingController qrCodeController = TextEditingController();
String qrData = '';

@override
void dispose() {
qrCodeController.dispose();
super.dispose();
}

void generateQrCode() {
setState(() {
qrData = qrCodeController.text;
});
}

@override
Widget build(BuildContext context) {
return Container(
child: Column(
children: [
TextFormField(
controller: qrCodeController,
decoration: InputDecoration(
hintText: "Enter your text",
hintStyle: TextStyle(
color: Colors.black,
),
border: OutlineInputBorder(
borderSide: BorderSide(color: Colors.black, width: 1),
borderRadius: BorderRadius.circular(20))),
),
const SizedBox(
height: 50,
),

QrImageView(
data: qrData,
version: QrVersions.auto,
size: 300,
),
const SizedBox(
height: 50,
),
Container(
height: 50,
width: 160,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20),
color: Colors.green,
),
child: MaterialButton(
onPressed: generateQrCode,
child: Text("Generate Qr Code"),
),
)
],
),
);
}
}

You can easily modify this code to support different types of QR code data such as URLs, phone numbers, email addresses, or even vCard/contact information. Instead of just plain text (like a name), predefined data formats allow users to generate QR codes that directly open links, dial numbers, or send emails when scanned. You can also enhance the UI with labels, validation, or by displaying the QR data below the code. Additionally, consider adding download or share functionality to improve usability.

6. After add this code then, Click the Save Button.

7. Go to the Widget Tree and click the add a click to this widget. Then navigate to the Components section, where you’ll find the custom widgets defined in your project. Locate the custom widget named “QrCode”, click on it to add it to your page, and design how you want it to appear within your layout.

8. Click the “Run” button at the top-right corner of the screen to start your FlutterFlow app.

The following shows the expression evaluation in action, running on an android emulator:

Output

Conclusion

The Custom QR Code Generator makes it easy to generate dynamic QR codes within your FlutterFlow app. Using the qr_flutter package, it ensures smooth rendering and user-friendly functionality. You can further enhance it by adding customization options, styling, or even QR scanning features to improve user experience.

References

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.

Implementing Multimedia Ads In Flutter

0

Introduction

Monetizing a Flutter app effectively requires integrating ads without compromising the user experience. Multimedia ads, including banner, interstitial, rewarded, and native ads, offer various ways to generate revenue. Google AdMob, Facebook Audience Network, and other third-party ad networks provide SDKs for integrating ads into Flutter apps.

This guide covers everything from setting up ad networks to implementing different ad types in Flutter, ensuring a smooth and optimized experience for developers and users.

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

Understanding Multimedia Ads in Mobile Apps

Popular Plugins for Multimedia Ads in Flutter

What is AdMob

Setting Up AdMob in Flutter

Implementing Different Types of Ads in Flutter

Testing Ads in Flutter

Limitations of Multimedia Ads in Flutter

Platform-Specific Limitations

Enhancing Ad Performance & Future Trends

Conclusion

Reference


1. Understanding Multimedia Ads in Mobile Apps

Before diving into implementation, let’s understand the different types of ads available:

 Types of Multimedia Ads

  1. Banner Ads
  • Small, rectangular ads displayed at the top or bottom of the screen.
  • Less intrusive and provide continuous monetization.

2. Interstitial Ads

  • Full-screen ads that appear at natural transition points in an app (e.g., between levels in a game).
  • High engagement but should be used carefully to avoid annoying users.

3. Rewarded Ads

  • Video ads that offer in-app rewards (e.g., extra lives, coins, premium content) when watched.
  • Users voluntarily interact, increasing engagement.

4. Native Ads

  • Ads are designed to blend seamlessly with the app’s UI.
  • Provide a non-disruptive experience but require more customization.

2. Popular Plugins for Multimedia Ads in Flutter

Several ad plugins allow you to integrate multimedia ads into your Flutter app. Here are some of the most commonly used ones:

1. google_mobile_ads: ^5.3.1

Description:
 The official Google AdMob plugin for Flutter allows developers to integrate banner, interstitial, rewarded, and native ads. Supports ad mediation and test ads.

Basic Integration:

dependencies:
google_mobile_ads: ^5.3.1
void main() {
WidgetsFlutterBinding.ensureInitialized();
MobileAds.instance.initialize();
runApp(MyApp());
}

Show a Banner Ad:

BannerAd myBanner = BannerAd(
adUnitId: 'your-ad-unit-id',
size: AdSize.banner,
request: AdRequest(),
listener: BannerAdListener(),
)..load();

2. easy_audience_network: ^0.0.7

Description:
 A Flutter plugin for integrating Facebook Audience Network ads. Supports banner, interstitial, and rewarded video ads.

Basic Integration:

dependencies:
easy_audience_network: ^0.0.7
void main() {
WidgetsFlutterBinding.ensureInitialized();
EasyAudienceNetwork.init();
runApp(MyApp());
}

Load a Banner Ad:

EasyBannerAd(
placementId: "YOUR_PLACEMENT_ID",
bannerSize: EasyBannerSize.BANNER,
);

3. unity_ads_plugin: ^0.3.23

Description:
 Flutter plugin for integrating Unity Ads, mainly for rewarded video and interstitial ads in gaming apps.

Basic Integration:

dependencies:
unity_ads_plugin: ^0.3.23
void main() {
WidgetsFlutterBinding.ensureInitialized();
UnityAds.init(gameId: 'your-unity-game-id', testMode: true);
runApp(MyApp());
}

Show an Interstitial Ad:

UnityAds.showVideoAd(placementId: 'video');

4. applovin_max: ^4.3.1

Description:
 AppLovin MAX is a popular ad mediation platform supporting multiple networks for higher ad revenue.

Basic Integration:

dependencies:
applovin_max: ^4.3.1
void main() {
WidgetsFlutterBinding.ensureInitialized();
AppLovinMAX.initialize("YOUR_APPLOVIN_SDK_KEY");
runApp(MyApp());
}

Show an Interstitial Ad:

AppLovinMAX.showInterstitial("INTERSTITIAL_AD_UNIT_ID");

5. ironsource_mediation: ^3.1.0

Description:
 IronSource is an ad mediation platform that combines multiple ad networks to optimize revenue. Supports rewarded, interstitial, and banner ads.

Basic Integration:

dependencies:
ironsource_mediation: ^3.1.0
void main() {
WidgetsFlutterBinding.ensureInitialized();
IronSource.initialize("YOUR_APP_KEY");
runApp(MyApp());
}

Show a Rewarded Ad:

IronSource.showRewardedVideo();

6. gma_mediation_inmobi: ^1.1.0

Description:
 An ad mediation adapter for integrating InMobi ads with Google Mobile Ads SDK.

Basic Integration:

dependencies:
gma_mediation_inmobi: ^1.1.0
void main() {
WidgetsFlutterBinding.ensureInitialized();
MobileAds.instance.initialize();
runApp(MyApp());
}

Display an AdMob Interstitial with InMobi Mediation:

InterstitialAd.load(
adUnitId: 'your-admob-ad-unit-id',
request: AdRequest(),
adLoadCallback: InterstitialAdLoadCallback(
onAdLoaded: (ad) => ad.show(),
onAdFailedToLoad: (error) => print('Ad failed to load: $error'),
),
);

7. vungle: ^0.6.12

Description:
 Vungle provides in-app video ads optimized for monetization in mobile apps. Supports interstitial and rewarded video ads.

Basic Integration:

dependencies:
vungle: ^0.6.12
void main() {
WidgetsFlutterBinding.ensureInitialized();
Vungle.init('YOUR_VUNGLE_APP_ID');
runApp(MyApp());
}

Show a Rewarded Video Ad:

Vungle.playAd(placementId: "REWARDED_AD_PLACEMENT_ID")

3. What is AdMob?

AdMob is a mobile advertising platform by Google that allows app developers to monetize their apps through various ad formats, including banner ads, interstitial ads, rewarded videos, and native ads. It offers high fill rates, intelligent mediation, and detailed performance analytics, making it one of the most popular choices for app monetization.

Key Features:

  • High fill rates and competitive CPMs
  • Supports multiple ad formats
  • Advanced mediation for optimizing ad revenue
  • Integration with Google Analytics for performance tracking

Do You Need AdMob in Flutter for Ads?

AdMob is not mandatory for displaying ads in a Flutter app, but it is one of the most effective and widely used ad networks. If you want global reach, high fill rates, and seamless mediation, AdMob is a strong choice.

When to Use AdMob:

  • If you want a reliable and high-paying ad network
  • If your app targets a global audience
  • If you prefer Google’s ecosystem for analytics and optimization

When Not to Use AdMob:

  • If your app is focused on gaming (Unity Ads or AppLovin might be better)
  • If you have a social media-style app (Facebook Audience Network could be a good fit)
  • If you need aggressive ad mediation and optimization (IronSource excels in this area)

4. Setting Up AdMob in Flutter

Step 1: Create an AdMob Account

Go to AdMob and sign up.
Create a new app and register your Flutter app.
Generate Ad Unit IDs for different ad formats.

Step 2: Add AdMob Dependencies

Add the google_mobile_ads package to your Flutter project:

dependencies:
google_mobile_ads: ^3.0.0

Run:

flutter pub get

Step 3: Initialize AdMob in main.dart

void main() {
WidgetsFlutterBinding.ensureInitialized();
MobileAds.instance.initialize();
runApp(MyApp());
}

5. Implementing Different Types of Ads in Flutter

1. Banner Ads (Static ads at the screen’s top/bottom)

BannerAd myBanner = BannerAd(
adUnitId: 'your-ad-unit-id',
size: AdSize.banner,
request: AdRequest(),
listener: BannerAdListener(),
);
Container(
alignment: Alignment.bottomCenter,
child: AdWidget(ad: myBanner),
width: myBanner.size.width.toDouble(),
height: myBanner.size.height.toDouble(),
)

2. Interstitial Ads (Full-screen ads between content)

InterstitialAd.load(
adUnitId: 'your-ad-unit-id',
request: AdRequest(),
adLoadCallback: InterstitialAdLoadCallback(
onAdLoaded: (InterstitialAd ad) {
ad.show();
},
onAdFailedToLoad: (LoadAdError error) {
print('Interstitial failed: $error');
},
),
);

3. Rewarded Ads (Users earn rewards after watching an ad)

RewardedAd.load(
adUnitId: 'your-ad-unit-id',
request: AdRequest(),
rewardedAdLoadCallback: RewardedAdLoadCallback(
onAdLoaded: (RewardedAd ad) {
ad.show(onUserEarnedReward: (AdWithoutView ad, RewardItem reward) {
print("Reward earned: ${reward.amount}");
});
},
onAdFailedToLoad: (LoadAdError error) {
print('Rewarded Ad failed to load: $error');
},
),
);

4. Native Ads (Ads that blend into app UI)

NativeAd(
adUnitId: 'your-ad-unit-id',
factoryId: 'adFactoryExample',
listener: NativeAdListener(),
request: AdRequest(),
);

Best Practices for Ad Integration

Preload Ads — Load ads in advance to minimize user wait time.

Non-Intrusive Placement — Position ads in a way that doesn’t disrupt user interactions.

Rewarded Ads Over Interstitials — Encourage engagement by offering users something in return.

Ad-Free Premium Version — Provide users with an option to remove ads through an in-app purchase.


6. Testing Ads in Flutter

Using Test Ad Unit IDs

To prevent policy violations, Google AdMob provides test Ad Unit IDs. These should be used during development:

Use test Ad Unit IDs to prevent accidental ad revenue violations.

Example test IDs:

  • Banner: ca-app-pub-3940256099942544/6300978111
  • Interstitial: ca-app-pub-3940256099942544/1033173712
  • Rewarded: ca-app-pub-3940256099942544/5224354917
const String testBannerAdUnitId = 'ca-app-pub-3940256099942544/6300978111';

Troubleshooting Common Issues

  • Ads not appearing — Ensure correct Ad Unit IDs and verify an active internet connection.
  • Crashes on startup — Initialize google_mobile_ads before attempting to load ads.
  • Interstitial Ads not displaying — Make sure the ad is fully loaded before calling .show().

7. Limitations of Multimedia Ads in Flutter

Common Challenges & Solutions

  • Ads failing to load — Verify proper configuration and use test ads during development.
  • User complaints about intrusive ads — Implement a balanced ad frequency strategy.
  • Revenue inconsistencies — Experiment with different ad placements to optimize engagement.

8. Platform-Specific Limitations

iOS App Store Policies

  • Apple enforces strict regulations against intrusive advertising.
  • Apps with excessive pop-up ads may face rejection from the App Store.

Google Play Compliance

  • Apps must adhere to Google’s Better Ads Standards.
  • Misplaced or disruptive ads can lead to app suspension.

9. Enhancing Ad Performance & Future Trends

Strategies for Maximizing Ad Revenue

  • A/B Testing — Test different ad placements to improve conversion rates.
  • Controlled Ad Frequency — Avoid overwhelming users with excessive advertisements.
  • Personalized Ad Experience — Provide an ad-free experience via a paid subscription.
  • Strategic Ad Timing — Display ads at logical transition points.

Emerging Trends in Ad Monetization

  • AI-powered ad Targeting — Uses machine learning to optimize ad delivery.
  • Augmented Reality (AR) & Virtual Reality (VR) Ads — More immersive advertising experiences.
  • Blockchain-Based Ad Networks — A decentralized approach for greater transparency.
  • Server-Side Ad Mediation — Dynamically switching between multiple ad networks to maximize revenue.

10. Conclusion

Multimedia ads are a powerful monetization tool for Flutter applications, but they must be implemented thoughtfully to maintain a positive user experience.

Key Takeaways:

  • Utilize Google AdMob or alternative networks for ad integration.
  • Implemented various ad formats effectively, including banner, interstitial, rewarded, and native ads.
  • Follow best practices to balance user engagement and revenue generation.
  • Stay updated with emerging trends to enhance ad monetization strategies.

You can maximize revenue by leveraging smart ad placements, adhering to platform policies, and optimizing performance while keeping your users engaged.


11. Reference

Get started | Flutter | Google for Developers
A mobile ads SDK for AdMob publishers who are building Flutter apps.developers.google.com

Add ads to your mobile Flutter app or game
How to use the google_mobile_ads package to show ads in Flutter.docs.flutter.dev

❤ ❤ 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 hourly or full-time 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.


Metadata Annotations in Dart

0

Dart’s metadata annotations provide our code with more details. This information can be used by the Dart runtime, tools, or libraries. Code generation, documentation, and runtime behaviour adjustment are just a few of the things that these annotations can assist with.

This blog will explore Metadata Annotations in Dart. We will also implement a demo program and teach you how to use generation, documentation, and runtime in Dart for 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 Are Metadata Annotations

Using Metadata Annotations

Code Implement

Conclusion



What Are Metadata Annotations:

The @ symbol and the class name, which may contain constructor arguments, are used in Dart to create metadata annotations. These annotations can be applied to fields, parameters, classes, or methods. Dart comes with several built-in annotations. Custom annotations can be defined by us.

This is an illustration of a basic metadata annotation:

@deprecated
void newMethod() {
}

Using Metadata Annotations:

Developers in Flutter make extensive use of metadata annotations to add more details about classes, methods, and widgets.

  • @required: This signifies that to invoke a method, a parameter must be supplied.
  • @deprecated: Indicates that a feature is no longer supported.
  • @override: Shows that a method in a superclass is being overridden.
  • @optional: This means that a variable or method is only for internal use and shouldn’t be directly accessed.
  • @protected: This signifies that a variable or method is only for internal use and shouldn’t be directly accessed.
  • @visibleForTesting: This signifies that a variable or method is exclusively for testing and shouldn’t be directly accessed.

An illustration of the usage of the @required annotation in Flutter is provided here:

class MyWidget extends StatelessWidget {
  final String title;

  MyWidget(@required this.title);

  @override
  Widget build(BuildContext context) {
    return Text(title);
  }
}

Code Implement:

=> Creating Custom Annotations

It’s easy to create a custom annotation in Dart. We specify a parameter-accepting class. We use instances of this class to annotate our code.

=> Defining a Custom Annotation

To provide classes or methods with descriptive information, we will develop a new annotation named @CustomAnnotations.

class CustomAnnotations {
  final String description;

  const Info(this.description);
}

Here, we define CustomAnnotations, a custom metadata annotation that accepts a description argument. We can apply this annotation to a class or method to use it:

@CustomAnnotations('This is a custom annotation')
class DemoClass {
  @CustomAnnotations('This is a annotation example')
  int add(int a, int b) => a + b;
  @CustomAnnotations('Subtracts the second number from the first.')
  int subtract(int a, int b) => a - b;
}

=> Using Metadata Annotations for Code Generation

By using the dart:mirrors package, we can take advantage of Dart’s reflection capabilities to access metadata annotations at runtime. It’s crucial to remember that dart:mirrors has restrictions, especially when used in online applications that use tree shaking. Here’s how to get our personalised annotations back:

import 'dart:mirrors';

void getAnnotations(Type type) {
  final classMirror = reflectClass(type);
  final classAnnotations = classMirror.metadata;

  for (var annotation in classAnnotations) {
    if (annotation.reflectee is CustomAnnotations) {
      final CustomAnnotations = annotation.reflectee as CustomAnnotations;
      print('Class Annotation: ${CustomAnnotations.description}');
    }
  }

  // Check method annotations
  classMirror.declarations.forEach((key, value) {
    if (value is MethodMirror) {
      final methodAnnotations = value.metadata;
      for (var annotation in methodAnnotations) {
        if (annotation.reflectee is CustomAnnotations) {
          final customAnnotations = annotation.reflectee as CustomAnnotations;
          print('Method ${MirrorSystem.getName(key)} Annotation:             ${customAnnotations.description}');
        }
      }
    }
  });
}

void main() {
  getAnnotations(DemoClass);
}

When we run the application, we ought to get the above code output like the underneath console output the annotations associated with the DemoClass class and its methods:

Class Annotation: This is a custom annotation
Method demo Annotation: This is a annotation example
Method subtract Annotation: Create a demo class for annotation example

Conclusion:

In the article, I have explained the Metadata Annotations basic structure in a dart; you can modify this code according to your choice. This was a small introduction to the Metadata Annotations On User Interaction from my side, and it’s working using Dart.

I hope this blog will provide you with sufficient information on Trying the Metadata Annotations in Dart in your projects. Dart’s robust custom annotations feature lets us add metadata to our classes and functions, making our code easier to read and maintain. 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: Sum Of a List Of Numbers In Dart

Related: Explore Advanced Dart Enum

Sum Of a List Of Numbers In Dart

0

This blog will explore the Sum Of a List Of Numbers In Dart. We will also implement a demo program, and learn how to calculate the sum of a list of numbers in a dart 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::

Using fold() Method

Using a For loop

Using The reduce() Method

Using The Sum From The Collection Package

Using A for-each loop

Conclusion



Using fold() Method:

The fold() technique (for the List class) is a higher-order capability that applies a given function to every component in an assortment and collects the outcomes. In the model above, we pass an anonymous function that adds the two contentions (the aggregator and the ongoing value) together.

void main() {
List<double> numbers = [1, 3, 5, 7, 9, 0.7, -2, 0.38, -0.38];
double sum = numbers.fold(0, (a, b) => a + b);
print(sum);
}

When we run the application, we ought to get the screen’s output like the underneath screen Console Output.

23.7

Process finished with exit code 0

Using a For loop:

For loop is a famous flow control that has been around for quite a while in most programming languages, including Dart. This is likewise an incredible asset that assists us with computing numerous things, remembering to track down the sum of the components for a given list.

void main() {
final myListNumbers = [1, 3, 5, 7, 9, 4.2, 6.1, -6, -2.5];

var sum = 0.0;
for (var i = 0; i < myListNumbers.length; i++) {
sum += myListNumbers[i];
}
print(sum);
}

When we run the application, we ought to get the screen’s output like the Console Output on the underneath screen.

26.799999999999997

Process finished with exit code 0

In this methodology, we utilize a for loop to iterate over the list of numbers (the two numbers and pairs) and add every element to a variable named sum.

Using The reduce() Method:

The reduce() method is like the fold() strategy, however, it doesn’t accept an initial value as its most memorable contention. All things considered, it involves the principal element in the collection as the initial value and applies the given capability to the excess elements. For this situation, we pass a similar function as in the fold() example.

void main() {
final numbers = [1, 3, 5, 7.7, -2.2, 3, 4, 5, 6, 7];
var sum = numbers.reduce((a, b) => a + b);
print(sum);
}

When we run the application, we ought to get the screen’s output like the underneath screen Console Output.

39.5

Process finished with exit code 0

Using The Sum From The Collection Package:

First imports this package, we need to add this line.

import 'package:collection/collection.dart';

At the main look, this might appear to be the most limited approach. Thus, a few developers favor utilizing different ways to deal with this one.

// ignore: depend_on_referenced_packages
import 'package:collection/collection.dart';

void main() {
final numbers = [150, 80, 0, 35, 2, 95];
var sum = numbers.sum;
print(sum);
}

When we run the application, we ought to get the screen’s output, like the console output on the underneath screen.

362

Process finished with exit code 0

Using A for-each loop:

In this methodology, we utilize a for-each loop to iterate over the list and add every element to the sum variable.

void main() {
final numbers = [6, 12, 18, 24, 30];
var sum = 0;
numbers.forEach((number) {
sum += number;
});
print(sum);
}

When we run the application, we ought to get the screen’s output like the Console Output on the underneath screen.

90

Process finished with exit code 0

Conclusion:

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

I hope this blog will provide you with sufficient information on Trying the Sum Of a List Of Numbers In the Dart of your projects. 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: Inbuild List Methods In Dart

Related: Metadata Annotations in Dart


2026 Best Practices: Exception Handling in Flutter for Beginne…

0

In this article, we will Explore Exception Handling In FlutterWe will learn about exception handling. An exception is an unusual state or occurrence that arises during program execution and disrupts the regular flow of code within 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 Exception In Flutter?

Why Need To Exception Handling?

Type Of Exception In Flutter

How To Handle Exception?

Conclusion



What Is Exception In Flutter?

Exceptions are errors in the code that show something unexpected happened. When an unusual or unwanted situation arises, like when you try to divide a number by zero, access a null reference, encounter a formate exception, lose a network connection, etc., Flutter throws an exception. If the exception is not handled correctly, the program might end.

Why Need To Exception Handling?

There are some needs for exception handling are:

  • > Creating dependable and sturdy Flutter applications requires knowing how to handle exceptions. You can detect exceptions, log them, and take the necessary steps to address problems and offer a positive user experience.
  • > Using Flutter’s exception-handling feature will safeguard your application from crashing in the event of unforeseen errors. It all comes down to handling these errors with ease to keep your app functioning properly and provide a better user experience.
  • > It offers a methodical approach to handling mistakes, enabling you to show error messages that are easy to understand or recover from with grace.
  • > Exception handling improves the maintainability of the application by separating the error-handling code from the regular code.

Type Of Exception In Flutter:

Dart Exceptions

  • FormatException: This happens when you attempt to parse a value in an incorrect format, such as trying to parse an integer from a non-numeric string.
  • RangeError: Raised in situations where a value or index is outside of a valid range, such as when a list’s out-of-bounds index is accessed.

> Flutter-Specific Exceptions

  •  PlatForm Exception: Encountered frequently when working with code specific to a platform, such as when calling native platform functions. Errors about device features, like location, permissions, camera access, and so forth, could be among them.

> Custom Exceptions

By defining new exception classes in Flutter that extend pre-existing Dart exception classes, like “Exception” or “Error,” you can create your exceptions. It is beneficial in assisting you in better classifying and managing particular application errors.

> Async/Await Exceptions

Exceptions that can happen when using asynchronous functions such as async/await and future. Errors about database queries, network requests, timeouts, etc. could be among them.

Async/await is frequently used for network requests and asynchronous operations, and try-catch blocks are used to handle exceptions. Async/await and Dart’s Future offer an organized method for managing asynchronous errors.

How To Handle Exception?

There are several ways we can deal with exceptions, some of which are listed below.

> Using Try And Catch.

We can handle the exception with the help of the Try/Catch block.

  •  Try: The code block where an exception can happen is called a try block. You can insert those codes that allow exceptions to occur in the try block. while the program is running.
  • Catch: Any exceptions thrown in the try block are caught and handled in a catch block. To use the catch keyword to identify particular exceptions.
  •  Finally: The finally block is optional and is always run, regardless of whether an exception arises. The try/catch block is followed by the execution of a block.
Future<void> youMethod() async {
var url = Uri.parse('https://jsonplaceholder.typicode.com/posts');

try {
final response = await http.get(url).timeout(Duration(seconds: 5));

if (response.statusCode == 200) {
print("You response data is here==->${response.body}");
} else {
print("Not Getting success");
}
}catch (error, _) {
print(error.toString());
}finally {
print('API call completed.');
}
}

Conclusion:

In the article, I have explained the Exception Handling In Flutter; you can modify this code according to your choice. This was a small introduction to Exception Handling 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 Exception Handling In Flutter of your projects. Using exception handling in Flutter is essential to improving, simplifying, and managing your application. Exception handling is a crucial part of creating a dependable and adaptable Flutter application. 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 a 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.


Securing Your Flutter App By Adding SSL Pinning

0

Introduction

As cyber threats continue to rise, it is crucial to ensure secure communication between your Flutter app and the backend server. While HTTPS encrypts data in transit, it does not protect against Man-in-the-Middle (MITM) attacks, where hackers intercept and modify network traffic.

SSL Pinning is one of the most effective security measures to prevent unauthorized connections, ensuring your app communicates only with trusted servers.

By the end of this guide, you’ll be equipped with advanced security techniques to protect your Flutter app from API hijacking and MITM attacks.

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

Understanding SSL/TLS and Its Vulnerabilities

How SSL Pinning Works

Implementing SSL Pinning in Flutter

Challenges & Limitations

Future Improvements & Scope

Final Thoughts


1. Understanding SSL/TLS and Its Vulnerabilities

What is SSL/TLS?

SSL (Secure Sockets Layer) and TLS (Transport Layer Security) are cryptographic protocols that secure communication between a client (Flutter app) and a server. They encrypt data to prevent interception and modification by malicious actors. TLS is the modern and more secure successor to SSL.

Why Default SSL/TLS is Not Enough?

Even with HTTPS, attackers can still exploit security loopholes. Some common threats include:

  • Proxy-Based Man-in-the-Middle (MITM) Attacks — Tools like Burp Suite and Charles Proxy can intercept API traffic, even when HTTPS is enabled.
  • Compromised Certificate Authorities (CA) — If a trusted CA is hacked, attackers can issue fraudulent certificates to impersonate legitimate websites.
  • Weak SSL Implementations — Older versions like TLS 1.0 and 1.1 have security flaws that make them vulnerable to attacks such as POODLE and BEAST.

2. How SSL Pinning Works

SSL Pinning ensures that your app only trusts a specific SSL certificate or public key, even if a trusted CA issues a different valid certificate. This protects against MITM attacks.

How SSL Pinning Validates Secure Connections:

  1. The app requests data from the server over HTTPS.
  2. The server presents its SSL certificate.
  3. The app verifies the presented certificate against a pinned certificate or public key stored in the app.
  4. If they match, the connection is established; otherwise, the request is blocked.

Without SSL Pinning, an attacker can use a fake certificate to intercept requests and steal sensitive data, including login credentials and payment details.


3. Types of SSL Pinning

1. Certificate Pinning (Recommended)

  • Stores and verifies the entire SSL certificate.
  • Provides the highest security as certificates change less frequently.

Limitation: The app must be updated when the certificate expires.

2. Public Key Pinning

  • Pins only the public key extracted from the SSL certificate.
  • Allows certificate renewal without requiring an app update (as long as the public key remains the same).

Limitation: If the backend changes the public key, the app will reject requests until updated.

3. CA Pinning (Least Secure)

  • Pins the Certificate Authority (CA) that issued the SSL certificate.
  • Allows multiple certificates signed by the CA.

Limitation: If the CA is compromised, attackers can issue fraudulent certificates that pass validation.


3. Implementing SSL Pinning in Flutter

We will implement SSL pinning using two popular networking libraries:

  • http – For simple HTTP requests.
  • Dio – For advanced networking with interceptors.

Step 1: Extract the SSL Certificate Hash

Before implementing SSL pinning, you need to retrieve your server’s SSL certificate fingerprint. Run the following command in a terminal:

openssl s_client -connect your-api.com:443 -showcerts </dev/null 2>/dev/null | openssl x509 -fingerprint -sha256 -noout

 Example Output:

SHA256 Fingerprint=AB:CD:EF:12:34:56:78:90:AA:BB:CC:DD:EE:FF:11:22:33:44:55:66

Copy this fingerprint; it will be used in the Flutter implementation.

Step 2: SSL Pinning with http Package

  1. Add Dependencies

Update pubspec.yaml:

dependencies:
http: ^0.13.4

2. Create a Secure HTTP Client

import 'dart:io';
import 'package:http/http.dart' as http;
class SecureHttpClient extends http.BaseClient {
  final HttpClient _httpClient = HttpClient();
SecureHttpClient() {
    _httpClient.badCertificateCallback = (cert, host, port) {
      final pinnedCert =
          "AB:CD:EF:12:34:56:78:90:AA:BB:CC:DD:EE:FF:11:22:33:44:55:66"; 
      final certFingerprint = cert.sha256.toString().toUpperCase();
      return certFingerprint == pinnedCert;
    };
  }
@override
  Future<http.StreamedResponse> send(http.BaseRequest request) async {
    return _httpClient
        .getUrl(Uri.parse(request.url.toString()))
        .then((req) => req.close())
        .then((resp) => http.StreamedResponse(resp, resp.statusCode));
  }
}
void main() async {
  final client = SecureHttpClient();
try {
    final response = await client.get(Uri.parse('https://your-api.com'));
    if (response.statusCode == 200) {
      print('Secure Connection Established');
    }
  } catch (e) {
    print('SSL Pinning Failed: $e');
  }
}

Improvements:

  • Converts the SSL certificate fingerprint dynamically for comparison.
  • Uses an override method to ensure all requests pass through the secured client.

Step 3: Implement SSL Pinning with Dio Package

1. Add Dependencies

Update pubspec.yaml:

dependencies:
dio: ^5.0.0
flutter_ssl_pinning: ^2.0.0

2. Implement SSL Pinning with Dio Interceptor

import 'package:dio/dio.dart';
import 'package:flutter_ssl_pinning/flutter_ssl_pinning.dart';
Future<void> setupDioWithSslPinning() async {
  Dio dio = Dio();
dio.interceptors.add(
    DioFlutterSSLPinning(
      allowedSHAFingerprints: [
        "AB:CD:EF:12:34:56:78:90:AA:BB:CC:DD:EE:FF:11:22:33:44:55:66"
      ],
      onBadCertificate: () => print('SSL Pinning Failed'),
      onValidCertificate: () => print('Secure Connection Established'),
    ),
  );
try {
    final response = await dio.get("https://your-api.com");
    print('Response: ${response.data}');
  } catch (e) {
    print('Error: $e');
  }
}

3. Call this function in main.dart:

void main() {
setupDioWithSslPinning();
}

Improvements:

  • Uses Dio’s interceptor to enforce SSL pinning globally.
  • Provides callback methods for failed or successful pinning verification.

4. Challenges & Limitations

SSL pinning enhances security, but it comes with certain challenges and limitations that developers must address:

Certificate Expiry

SSL certificates have expiration dates, usually every one or two years. If an expired certificate remains pinned in the app, it will cause connection failures.
Solution: Implement automated certificate renewal using services like Let’s Encrypt. Additionally, notify users to update the app before the certificate expires by tracking expiration dates programmatically.

Debugging Issues

When SSL pinning fails, diagnosing the issue in production becomes difficult, as the app may not provide detailed error messages.
Solution: Implement extensive logging for SSL failures in debug mode. Use feature flags to disable SSL pinning temporarily in testing environments but enforce it in production.

Device Compatibility

Older Android and iOS devices may not support modern SSL/TLS standards, leading to connection issues.
Solution: Ensure that the app enforces at least TLS 1.2 or higher. Perform testing across a range of devices and OS versions to check for compatibility issues.

Manually Updating Certificates

If a certificate changes, users must update the app to continue using SSL pinning, which can cause disruptions.
Solution: Instead of pinning the entire certificate, use public key pinning, which remains valid even if the certificate is reissued. Alternatively, configure the app to fetch updated certificates securely from a remote server.

Man-in-the-Middle (MITM) Bypass

Attackers using rooted or jailbroken devices may attempt to bypass SSL pinning by modifying the app’s network configurations.
Solution: Implement root and jailbreak detection tools. For Android, libraries like RootBeer can detect rooted devices, while iOS can use JailMonkey. Additionally, encrypt sensitive data within the app to minimize risks.

App Store Rejections

Both Apple and Google have strict security policies. Improper SSL pinning implementation can lead to app store rejections, particularly if it restricts connections too aggressively.
Solution: Follow best practices by allowing fallback mechanisms. Avoid hardcoding certificates directly in the code and ensure a smooth user experience even if SSL pinning fails.


5. Future Improvements & Scope

Automated Certificate Management

To reduce manual updates, SSL certificates can be managed dynamically using automation tools. Services like Let’s Encrypt provide automatic renewal, ensuring that applications always use valid certificates.

AI-Driven Threat Detection

Advanced security measures will likely integrate AI-powered monitoring to detect MITM attacks in real time. Future applications may analyze network behaviors to identify suspicious activities and enhance protection dynamically.

Zero-Trust Security Model

A zero-trust approach requires continuous authentication and verification for all network requests rather than relying solely on SSL pinning. Implementing this model can further improve app security.

Post-Quantum Cryptography

With advancements in quantum computing, traditional SSL encryption methods may become vulnerable. The adoption of post-quantum cryptographic standards will ensure long-term security for encrypted communications.

Dynamic SSL Pinning

Instead of hardcoding SSL certificates, future implementations may allow apps to retrieve and update SSL pinning configurations dynamically from a trusted backend. This would eliminate the need for frequent app updates while maintaining security.


6. Final Thoughts

SSL pinning is a powerful security feature that protects Flutter applications from MITM attacks, ensuring encrypted communications remain secure. However, it introduces challenges such as certificate expiration, debugging difficulties, and update management. Developers should implement best practices, such as automated certificate updates, dynamic SSL pinning, and fallback mechanisms, to maintain a balance between security and usability.

Would you like me to add implementation code examples for automated certificate updates or root detection? Let me know!

❤ ❤ 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 a Flutter developer for your cross-platform Flutter mobile app project hourly or full-time 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.