Google search engine
Home Blog Page 5

Best Practices for State Management in Flutter Apps

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

What is State Management in Flutter?

Types of State in Flutter

Popular State Management Approaches in Flutter

When to Use Which State Management Approach?

Best Practices for State Management in Flutter

Conclusion

Reference


Introduction

State management is one of the most crucial aspects of Flutter development. It determines how data flows and updates across your app, impacting performance, maintainability, and user experience.

Choosing the right state management approach depends on the complexity of your app, the size of your development team, and the features you need to implement.

In this guide, we will cover:
 1. What state management is and why it’s important
 2. Types of state in Flutter
 3. Popular state management solutions
 4. Best practices for writing scalable and efficient apps

What is State Management in Flutter?

In simple terms, state is the data that changes during the lifecycle of an app.

For example:

  • The current theme (dark/light mode)
  • A user’s login status
  • A list of items in a shopping cart

State management ensures that when the state changes, the UI updates accordingly.

Types of State in Flutter

There are two types of state in Flutter:

Ephemeral (UI) State

  • Temporary state that doesn’t need to be shared across widgets.
  • Example: TextField input, animations, page scroll position
  • Best handled using StatefulWidget

App State (Global State)

  • State that needs to be shared across multiple screens.
  • Example: User authentication, theme settings, cart items, API data
  • Requires a state management solution

Popular State Management Approaches in Flutter

Flutter provides multiple ways to manage state. Below are the most commonly used approaches, along with their advantages and best use cases.

1. setState() (Basic Approach)

  • Best For: Small apps, UI-related state
  • Complexity: Low
  • Pros:
     Simple and easy to implement
     No extra dependencies required
  • Cons:
     Not scalable for large apps
     Causes unnecessary widget rebuilds

2. InheritedWidget (Built-in Flutter Solution)

  • Best For: Low-level state sharing between widgets
  • Complexity: Medium
  • Pros:
     Part of Flutter’s core framework (no extra package)
     Good for sharing state across widget trees
  • Cons:
     Complex to manage for large apps
     Requires manual updates and rebuilds

3. Provider (Recommended for Most Apps)

  • Best For: Small to medium apps needing shared state
  • Complexity: Medium
  • Pros:
     Easy to integrate and scalable
     Built on InheritedWidget (efficient state updates)
     Good community support
  • Cons:
     Not ideal for complex business logic
     Requires understanding of ChangeNotifier

4. Riverpod (Better Alternative to Provider)

  • Best For: Scalable apps with dependency injection
  • Complexity: Medium
  • Pros:
     Eliminates the limitations of Provider
     Safer and more flexible with auto-dispose
     Works well with dependency injection
  • Cons:
     Slight learning curve compared to Provider

5. Bloc (Business Logic Component)

  • Best For: Large, enterprise-level apps
  • Complexity: High
  • Pros:
     Predictable state management with events & states
     Well-structured and testable
     Good for apps needing explicit state transitions
  • Cons:
     Boilerplate-heavy (requires defining events, states, and blocs)
     Steep learning curve for beginners

6. GetX (Lightweight and Fast)

  • Best For: Apps needing minimal boilerplate
  • Complexity: Low to Medium
  • Pros:
     Simple and requires less code
     Built-in dependency injection and routing
     Lightweight and high-performance
  • Cons:
     Not officially recommended by Flutter
     Can lead to less structured code if misused

7. Redux (Predictable State Management)

  • Best For: Apps needing a centralized state management solution
  • Complexity: High
  • Pros:
     Good for apps needing time-travel debugging
     Scales well for large applications
  • Cons:
     Boilerplate-heavy and complex
     Overkill for simple apps

When to Use Which State Management Approach?

Using setState() for Local UI State

Use setState for small state updates within a single widget.

class CounterScreen extends StatefulWidget {
@override
_CounterScreenState createState() => _CounterScreenState();
}

class _CounterScreenState extends State<CounterScreen> {
int _counter = 0;

void _incrementCounter() {
setState(() {
_counter++;
});
}

@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(child: Text('Counter: $_counter')),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
child: Icon(Icons.add),
),
);
}
}

 Best For: Small, simple apps
 Not suitable for: Large apps with shared state

Using Provider (Recommended for Most Apps)

Provider is a lightweight and efficient state management solution that builds on InheritedWidget.

Installation

dependencies:
provider: ^6.0.5

Implementation

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

// 1. Create a ChangeNotifier class
class CounterModel extends ChangeNotifier {
int _counter = 0;
int get counter => _counter;

void increment() {
_counter++;
notifyListeners(); // Notifies widgets to rebuild
}
}

void main() {
runApp(
ChangeNotifierProvider(
create: (context) => CounterModel(),
child: MyApp(),
),
);
}

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: CounterScreen(),
);
}
}

class CounterScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Text('Counter: ${context.watch<CounterModel>().counter}'),
),
floatingActionButton: FloatingActionButton(
onPressed: () => context.read<CounterModel>().increment(),
child: Icon(Icons.add),
),
);
}
}

Best For: Medium-sized apps with moderate state sharing
Not suitable for: Very complex business logic

Using Riverpod (Better Provider Alternative)

Riverpod is a safer and more powerful version of Provider with dependency injection.

Installation

dependencies:
flutter_riverpod: ^2.3.6

Implementation

import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter/material.dart';

// Define a state provider
final counterProvider = StateProvider<int>((ref) => 0);

void main() {
runApp(ProviderScope(child: MyApp()));
}

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: CounterScreen(),
);
}
}

class CounterScreen extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final counter = ref.watch(counterProvider);

return Scaffold(
body: Center(child: Text('Counter: $counter')),
floatingActionButton: FloatingActionButton(
onPressed: () => ref.read(counterProvider.notifier).state++,
child: Icon(Icons.add),
),
);
}
}

Using Bloc (For Large Apps with Complex Logic)

Bloc (Business Logic Component) is one of the most powerful state management solutions for Flutter. It follows a predictable state transition approach using:

  1. Events → Trigger state changes (e.g., “Increment Counter”).
  2. States → Define what UI should display (e.g., “Counter: 0”).
  3. Bloc → The core logic that takes events and produces states.

Step 1: Install Dependencies

Add the following to pubspec.yaml:

dependencies:
flutter_bloc: ^8.1.3
equatable: ^2.0.5

Step 2: Create a Bloc for Counter Management

Define Events (counter_event.dart)

import 'package:equatable/equatable.dart';

abstract class CounterEvent extends Equatable {
@override
List<Object> get props => [];
}

class IncrementEvent extends CounterEvent {}
class DecrementEvent extends CounterEvent {}

Define States (counter_state.dart)

import 'package:equatable/equatable.dart';

abstract class CounterState extends Equatable {
@override
List<Object> get props => [];
}

class CounterInitial extends CounterState {
final int counterValue;
CounterInitial(this.counterValue);

@override
List<Object> get props => [counterValue];
}
  • CounterInitial(0) → Starts with 0
  • Equatable ensures efficient state comparison, preventing unnecessary rebuilds.

Create Bloc (counter_bloc.dart)

import 'package:flutter_bloc/flutter_bloc.dart';
import 'counter_event.dart';
import 'counter_state.dart';

class CounterBloc extends Bloc<CounterEvent, CounterState> {
CounterBloc() : super(CounterInitial(0)) {
on<IncrementEvent>((event, emit) {
final newValue = (state as CounterInitial).counterValue + 1;
emit(CounterInitial(newValue)); // Emit new state
});

on<DecrementEvent>((event, emit) {
final newValue = (state as CounterInitial).counterValue - 1;
emit(CounterInitial(newValue));
});
}
}
  • on<IncrementEvent>() → Increases counter
  • on<DecrementEvent>() → Decreases counter
  • Uses emit() to update the state

Step 3: Integrate Bloc into UI (main.dart)

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'counter_bloc.dart';
import 'counter_event.dart';
import 'counter_state.dart';

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

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: BlocProvider(
create: (context) => CounterBloc(),
child: CounterScreen(),
),
);
}
}

class CounterScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Flutter Bloc Example')),
body: Center(
child: BlocBuilder<CounterBloc, CounterState>(
builder: (context, state) {
if (state is CounterInitial) {
return Text('Counter: ${state.counterValue}', style: TextStyle(fontSize: 24));
}
return Container();
},
),
),
floatingActionButton: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
FloatingActionButton(
onPressed: () => context.read<CounterBloc>().add(IncrementEvent()),
child: Icon(Icons.add),
),
SizedBox(width: 20),
FloatingActionButton(
onPressed: () => context.read<CounterBloc>().add(DecrementEvent()),
child: Icon(Icons.remove),
),
],
),
);
}
}

Best For: Large-scale apps needing maintainability
Not suitable for: Small projects due to complexity

Best Practices for State Management in Flutter

1. Keep Business Logic Separate from UI

  • Use Provider, Riverpod, or Bloc to separate logic from widgets.
  • Avoid using setState() in deeply nested widgets.

2. Choose the Right State Management Solution

  • Use setState() for UI-related state (e.g., toggling a switch).
  • Use Provider/Riverpod for medium-sized apps.
  • Use Bloc for large-scale apps.

3. Use Immutable State

  • Immutable state reduces bugs.
  • Use final and const wherever possible.

4. Optimize Performance

  • Use const constructors for widgets to avoid unnecessary rebuilds.
  • Use select() in Provider/Riverpod to listen to specific state changes.

5. Use Dependency Injection for Scalability

  • Riverpod and GetIt allow easy dependency injection for maintainable code.

Conclusion:

Choosing the right state management approach depends on your app’s size and complexity:

setState() → Best for small apps with simple UI updates.
 InheritedWidget → Useful for low-level state sharing.
 Provider → Recommended for small to medium apps needing shared state.
 Riverpod → Scalable and efficient, great for dependency injection.
 Bloc → Best for large apps with complex state management needs.
 GetX → Lightweight, fast, and minimal boilerplate.
 Redux → Ideal for centralized state management in enterprise apps.

Choose based on your app’s size, complexity, and scalability needs!

By following best practices, you can build efficient, maintainable, and high-performing Flutter apps.


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.


References:

List of state management approaches
A list of different approaches to managing state.docs.flutter.dev

Top Flutter State Management Packages
Check out the top Flutter State Management Packages like GetX, Riverpod, BLoC, Provider, and MobX to help you manage…www.dhiwise.com

Flutter State Management – Essential Guide and Best Practices
Discover the essential guide to Flutter state management. Learn best practices and key factors to improve your Flutter…solguruz.com


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.

Voice Recorder in FlutterFlow

0

FlutterFlow enables powerful app development with drag-and-drop tools and state management — no custom code required. In this guide, you’ll learn how to build a Voice Recorder feature from scratch, with recording, playback, and saved voice notes.

You’ll create:

  • A mic permission flow
  • A record button
  • A list of audio recordings
  • Playback functionality using FlutterFlow’s built-in widgets

Let’s walk through the full setup!

Step 1: Create the Data Schema

First, define a local Data Type to store each audio note.

Data Type Name: voiceNoteDS

Fields:

  • audioPath (String): the file path of the recording
  • createdAt (DateTime): the date and time when it was recorded

This structure will be used to store and display each recording in a list.

Step 2: Create App State Variable

Next, set up a persistent App State variable to hold all voice notes:

App State Variable

  • Name: voiceNotesAS
  • Type: List<Data (voiceNoteDS)>
  • Persistence: ✅ Enabled

This variable will update every time a recording is saved, keeping the list even when the app is closed and reopened.

Step 3: Add Microphone Permission

Before recording, we must ask the user for microphone access.

How to do it:

  1. Open the Action Flow for your record button.
  2. Add the Request Permission action.
  3. Choose Permission Type: microphone

This ensures the app can access the mic before recording begins.

Step 4: Setup Voice Recording Logic (Visual Flow)

Refer to your flow (see screenshot Step 5). You’ll use a conditional to toggle recording on and off.

Logic Flow:

  • Condition: isRecording == false
  • ✅ TRUE → Start Recording → Set isRecording = true
  • ❌ FALSE → Stop Recording → Set isRecording = false → Save file path → Create new voiceNoteDS item → Add to voiceNotesAS

You’ll use the following actions:

  • Start Audio Recording
  • Stop Audio Recording
  • Update Page/App State
  • Append to List (voiceNotesAS)

Step 5: Design the UI

Here’s how the layout is structured:

🔹 Main Layout

  • Stack for overlapping mic button at bottom
  • Column to hold title and recordings list
  • ListView for displaying each recorded item

🎵 Inside ListView:

Each item includes:

  • The recording timestamp (using createdAt)
  • A Play button using Audio Player widget, with audioPath as the file input

 UI Preview

Here’s a screenshot of the working UI:

You can see:

  • The page title “Voice Recorder”
  • A card-style list of saved recordings with play buttons
  • A floating red microphone button to toggle recording

🎯 The clean layout is perfect for voice notes, chat messages, or interviews.

Final Result

When you’re done:

  • Tap the mic button to start/stop recording.
  • Recordings are saved locally with timestamps.
  • They appear in a scrollable ListView.
  • Each item includes a play button to listen to the audio.

And all of this is built inside FlutterFlow using built-in widgets, actions, and state — no Dart code needed!

Wrap-Up

You’ve successfully created a fully functional Voice Recorder app in FlutterFlow with:

  • Mic permission handling
  • Dynamic UI
  • Persistent storage
  • Instant playback

This feature can now be reused in note-taking apps, audio journals, or messaging apps.

Let me know if you’d like this exported as PDF, Markdown, or submitted to the FlutterFlow Marketplace as a reusable component!

Conclusion

In this tutorial, you’ve learned how to create a complete Voice Recorder in FlutterFlow — without writing any custom code. From setting up the data structure and managing app state, to designing a clean UI and handling microphone permissions, each step was accomplished using FlutterFlow’s built-in tools and visual logic.

This voice recorder feature is not only practical but also reusable across various app use cases like:

  • Personal voice memos
  • Chat voice messages
  • Task reminders
  • Audio logs

By combining widgets like Audio Recorder, Audio Player, and ListView, along with state management, you’ve built a real-world feature that enhances user experience and app functionality.

Now that your voice recording component is ready, you can extend it even further — perhaps by uploading audio to Firebase Storage, syncing with user accounts, or transcribing notes using AI tools.

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.

Keep exploring, and keep building smarter with FlutterFlow!

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.

Document Scanner in FlutterFlow 

0

In the digital age, being able to scan and store documents on-the-go is more than a convenience — it’s a necessity. Whether it’s students scanning their notes, professionals saving receipts, or individuals digitizing important papers, having a document scanner built directly into a mobile app adds incredible value.

In this blog, we’ll explore how to create a fully functional document scanner inside FlutterFlow, using a native plugin (cunning_document_scanner) and custom widgets/actions for scanning, previewing, and downloading images.

What You’ll Build

We’re going to build a FlutterFlow Document Scanner app that:

  • 📸 Scans books or documents via the camera.
  • 🖼️ Shows the scanned image in a bottom sheet.
  • ⬇️ Lets users download the scanned image to their device.

All this will be built using:

  • 2 Widgets: DocumentScanner and ScannerDoc
  • 1 Custom Action: takeScanner
  • Plugin: cunning_document_scanner: ^1.2.3

🛠️ Tools & Packages Required

To enable scanning and saving functionality, we’ll use:

dependencies:
cunning_document_scanner: ^1.2.3

Make sure these packages are added in your FlutterFlow project’s pubspec.yaml file via the “Custom Code > Dependencies” tab.

Widget Structure

DocumentScanner Widget

This is the main screen of the app. It contains a button or icon that initiates the scan process.

What it does:

  • Calls the takeScanner custom action when tapped.
  • Stores the list of scanned image paths.
  • Navigates to the ScannerDoc screen to show results.

🔧 Dart Code:

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

import 'dart:io';

import 'package:cunning_document_scanner/cunning_document_scanner.dart';

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

final double? width;
final double? height;

@override
State<DocumentScanner> createState() => _DocumentScannerState();
}

class _DocumentScannerState extends State<DocumentScanner> {
List<String> _pictures = [];
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),
),
body: SingleChildScrollView(
child: Column(
children: [
ElevatedButton(
onPressed: onPressed, child: const Text("Add Pictures")),
for (var picture in _pictures) Image.file(File(picture))
],
)),
),
);
}

void onPressed() async {
List<String> pictures;
try {
pictures = await CunningDocumentScanner.getPictures() ?? [];
if (!mounted) return;
setState(() {
_pictures = pictures;
});
} catch (exception) {
// Handle exception here
}
}
}

ScannerDoc Widget

This widget displays the scanned images in a bottom sheet.

Features:

  • Scrollable image viewer (for multiple scans).
  • Tappable image preview.
  • Download button next to each image for saving.

🔧 Dart Code:

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

import 'package:cunning_document_scanner/cunning_document_scanner.dart';
import 'dart:io';

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

final double? width;
final double? height;

@override
State<ScannerDoc> createState() => _ScannerDocState();
}

class _ScannerDocState extends State<ScannerDoc> {
List<String> _pictures = [];
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),
),
body: SingleChildScrollView(
child: Column(
children: [
ElevatedButton(
onPressed: onPressed, child: const Text("Add Pictures")),
for (var picture in _pictures) Image.file(File(picture))
],
)),
),
);
}

void onPressed() async {
List<String> pictures;
try {
pictures = await CunningDocumentScanner.getPictures() ?? [];
if (!mounted) return;
setState(() {
_pictures = pictures;
});
} catch (exception) {
// Handle exception here
}
}
}

Custom Action: takeScanner

This action integrates the cunning_document_scanner plugin and launches the native camera interface.

🔧 Dart Code:

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

import 'dart:io';
import 'dart:async';
import 'package:cunning_document_scanner/cunning_document_scanner.dart';

Future<List<FFUploadedFile>?> takeScanner() async {
// Add your function code here!
try {
// Panggil scanner untuk mengambil gambar dokumen
List<String>? pictures = await CunningDocumentScanner.getPictures();

// Jika hasilnya kosong, return null
if (pictures == null || pictures.isEmpty) {
return null;
}

// Konversi hasil path gambar menjadi List<FFUploadedFile>
List<FFUploadedFile> uploadedFiles = pictures.map((path) {
File file = File(path);
return FFUploadedFile(
name: path.split('/').last, // Mengambil nama file dari path
bytes: file.readAsBytesSync(), // Membaca file sebagai bytes
);
}).toList();

return uploadedFiles;
} catch (e) {
print('Error scanning document: $e');
return null;
}
}

How It Works:

  • Calls the scanner.
  • Returns a list of scanned image paths.
  • Passes these paths back to the widget for display.

Adding the Download Button

Inside the ScannerDoc bottom sheet, we add a Download button. This button triggers another custom action that saves the image to the user’s gallery.

Putting It All Together (User Flow)

  1. Open App → DocumentScanner widget.
  2. Click “Scan” → launches camera via takeScanner.
  3. User scans pages → list of image paths returned.
  4. Navigate to ScannerDoc → show images in bottom sheet.
  5. User taps “Download” → image saved to gallery.

Customizing the UI

FlutterFlow allows you to:

  • Use custom containers to style your bottom sheet
  • Add animation when showing the scanned image
  • Support light/dark themes
  • Add optional text fields (e.g. label your scans)

You can also:

  • Combine this with OCR tools to extract text
  • Convert images to PDF using another custom action
  • Sync with Firebase to store scanned files in the cloud

Permissions to Handle

Be sure to request permissions for:

  • Camera Access
  • Storage Access (Android only)

Use permission_handler to manage this properly in custom code.

Final Testing Tips

  • Test on a real device (scanning and file saving might not work on emulators).
  • Verify permissions are granted.
  • Check for multiple image support if needed.
  • Add error handling for denied permissions.

Conclusion

By combining FlutterFlow’s visual development power with native Flutter packages like cunning_document_scanner, you can create a production-ready document scanner in just a few hours. With reusable widgets, clean actions, and smooth UI, your app can offer a premium scanning experience without depending on third-party apps.

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.

CupertinoRadio Widget in FlutterFlow 

FlutterFlow is a powerful low-code platform that allows you to build Flutter applications visually — without writing traditional Flutter code. While FlutterFlow is known for its Material design components, it also supports Cupertino (iOS-style) widgets, like the CupertinoRadio, giving you more design flexibility.

In this blog, we’ll explore what the CupertinoRadio widget is, how to use it in FlutterFlow, and when to choose it over the standard Material-style radio buttons.

What is CupertinoRadio?

The CupertinoRadio widget is part of Flutter’s Cupertino design system, which replicates the native iOS look and feel. It functions similarly to a traditional radio button, allowing users to select a single item from a list of options. The key difference is in the styling — it’s built to look and behave like a native iOS component.

In FlutterFlow, the CupertinoRadio widget gives your app a native iOS experience while maintaining the benefits of low-code development.

When Should You Use CupertinoRadio in FlutterFlow?

Use CupertinoRadio when:

  • You’re designing an app specifically for iOS.
  • You want to give your users a native Apple-style UI.
  • You’re using other Cupertino elements like CupertinoNavigationBar or CupertinoSwitch.

How to Use CupertinoRadio in FlutterFlow?

Currently, FlutterFlow doesn’t have a direct drag-and-drop CupertinoRadio widget like in Flutter code. However, you can mimic its functionality by using the Custom Widget feature, or by creating iOS-style radio buttons using standard widgets + logic.

Here are two methods to implement Cupertino-style radio buttons in FlutterFlow:

Method 1: Using FlutterFlow Widgets (Visual No-Code)

Step-by-Step Guide:

  1. Create a List of Options:
  • Use a Column or ListView.
  • Add a Row inside for each option.
  1. Add a Circle Indicator:
  • Use a Container with a border to represent the radio circle.
  • Use conditional visibility to show a filled circle inside if selected.
  1. Add Text Label:
  • Add a Text widget next to the radio icon to show the option.
  1. Add Selection Logic:
  • Define a State Variable (e.g., selectedOption) of type String or Int.
  • Set a GestureDetector or InkWell around the Row.
  • On Tap → Update State to set the selected option.
  1. Dynamic Styling:
  • Change the container color or add an inner circle when it matches the selected option.

💡 This method visually mimics CupertinoRadio and works well in FlutterFlow’s no-code interface.

Method 2: Using a Custom Widget (for Exact iOS Look)

If you want to use the actual Flutter CupertinoRadio widget inside FlutterFlow:

Step-by-Step:

  1. Go to the Custom Widgets Tab.
  2. Create a New Custom Widget
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class CustomCupertinoRadio extends StatefulWidget {
  final String groupValue;
  final String value;
  final Function(String) onChanged;

  const CustomCupertinoRadio({
    required this.groupValue,
    required this.value,
    required this.onChanged,
  });

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

class _CustomCupertinoRadioState extends State<CustomCupertinoRadio> {
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () => widget.onChanged(widget.value),
      child: Row(
        children: [
          CupertinoRadio<String>(
            value: widget.value,
            groupValue: widget.groupValue,
            onChanged: (String? val) {
              if (val != null) {
                widget.onChanged(val);
              }
            },
          ),
          SizedBox(width: 8),
          Text(widget.value),
        ],
      ),
    );
  }
}

  1. Add the Widget to Your Page:
  • Pass groupValue, value, and onChanged as parameters.
  • Bind them to FlutterFlow State Variables to manage selection.

✅ This gives you a pixel-perfect native iOS radio control inside FlutterFlow.

 Styling Tips

  • Match your radio buttons with Cupertino themes (light backgrounds, clean spacing).
  • Combine them with other Cupertino elements like CupertinoListTile or CupertinoFormRow.
  • Use minimalist fonts like San Francisco to enhance the iOS feel.

 Important Considerations

  • CupertinoRadio is great for iOS-themed apps. If you are targeting Android, it’s better to use RadioButton or conditionally render based on platform.
  • FlutterFlow doesn’t support all native Flutter widgets visually, but Custom Widgets give you full power.

Conclusion

The CupertinoRadio widget is a great way to bring native iOS design elements into your FlutterFlow projects. While it may require a bit of extra work compared to drag-and-drop widgets, the payoff is a more polished and platform-specific UI.

Whether you simulate the look using FlutterFlow’s visual tools or integrate a custom widget, CupertinoRadio lets you build an intuitive and stylish iOS experience — right inside FlutterFlow.

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.

Explore Dart String Interpolation

0

In this article, we will be Explore Dart String Interpolation. We will learn how to execute a demo program. We will show you many demo for understanding string interpolations in your Dart 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

Dart String Interpolation Demo 1

Demo 2 – Embedding Expressing Dart String Interpolation

Demo 3 – Multi-Line Strings

Demo 4 – Method & Properties access into String

Conclusion



Introduction:

It is possible to incorporate variable values into string literals in Dart. Here, the String Interpolation feature in Dart offers a more lucid method of displaying text in Dart, allowing us to do away with the laborious string concatenation method that we previously employed (where we use the + Operator to concatenate text).

We can encapsulate a variable value or expression inside a string in Dart by utilising String Interpolation. Syntax looks like this: $variableName or ${expression}.

Dart String Interpolation Demo 1:

Here are some examples that will help you better grasp string interpolations.

void main() {
  String name = 'Sam';
  int age = 28;

  String greeting = 'Hello, $name! You are $age years old.';
  print(greeting); // Output: Hello, Sam! You are 28 years old.
}

Name and age are two variables with values that are inserted into a string greeting using the $name & $age syntax, as you can see in the source code above.

Demo 2 – Embedding Expressing Dart String Interpolation:

You must use ${}, or curly braces, when doing any calculations or when employing expressions.

void main() {
  int a = 3;
  int b = 2;

  String result = 'The sum of $a and $b is ${a + b}.';
  print(result); // Output: The sum of 3 and 2 is 5.
}

In this case, the final string result is embedded within the string after a + b is done.

Demo 3 – Multi-Line Strings:

void main() {
  String firstName = 'Sam';
  String lastName = 'Thomas';

  String introduction = '''
  My name is $firstName $lastName.
  I am expert in Dart.
  ''';

  print(introduction);
  // Output:
  // My name is John Doe.
  // I am expert in Dart.
}

We may construct a multiline string in Dart and interpolate the variable into it by utilising triple quotes.

Demo 4 – Method & Properties access into String:

We may also integrate method and property access in Dart by using the string interpolation technique, as seen in the example below.

void main() {
  DateTime currentDate= DateTime.now();

  String currentTime = 'Current time is: ${currentDate.hour}:${currentDate.minute}:${currentDate.second}';
  print(currentTime);
  // Output: Current time is: HH:MM:SS (actual time values)
}

Here, DateTime is being used to obtain the current DateTime. Using the syntax ${currentDate.hours}, ${currentDate.minute}, and ${currentDate.second}, we can readily access the attributes of the now() Class Object, which include hours, minutes, and seconds, into strings.

Conclusion:

In the article, I have explained how the Explore Dart String Interpolation; you can modify this code according to your choice. This was a small introduction to Explore Dart String Interpolation 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 Dart String Interpolation in your Flutter projectsThe best method for retrieving values from dynamic strings in Dart is String Interpolation. This makes your code much easier to read and maintain. String interpolation is a crucial method in Flutter Dart programming, regardless of whether you are working with basic string concatenation or intricate data representation. 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.


Custom Camera Component in Flutterflow

0

In today’s mobile-first world, integrating camera functionality into your app isn’t just a cool feature — it’s a necessity. Whether you’re building a social app, e-commerce platform, or document scanner, capturing photos natively provides an intuitive and engaging user experience.

That’s where our Custom Camera Component for FlutterFlow comes in. In this blog, we’ll walk through what this component does, how it works, and how you can easily integrate it into your project — no manual camera configuration required.

What is the Custom Camera Component?

The Custom Camera Component is a plug-and-play widget built with Flutter and fully compatible with FlutterFlow. It allows users to take pictures directly from within your app. Once the photo is captured, the component displays the image in a bottom sheet preview, allowing for instant confirmation or further action.

It simplifies camera integration into a single, reusable, and UI-friendly interface.

What Is It?

The Custom Camera Component allows users to:

  • Open the device’s camera
  • Capture a photo when the “Take Picture” button is tapped
  • Display the captured image in a bottom sheet
  • Store the image as a base64 string for further use

How It Works — State Management

To manage the photo-capturing flow, two AppState variables are used:

  1. makePhoto (Boolean): This is used to trigger the photo capture when set to true.
  2. fileBase64 (String): This stores the captured image in base64 format, which can later be used for previewing or uploading.

Make sure both variables are created in your FlutterFlow App State (Settings > App State):

  • makePhotoBoolean (default: false)
  • fileBase64String

🚀 Key Features

  • One-Tap Access to Camera — Launch the device’s camera with a single tap.
  • 🖼 Real-time Image Preview — Shows the captured image immediately in a bottom sheet.
  • 🛠 Modular & Reusable — Easily drop this component into any screen or flow.
  • FlutterFlow Ready — No manual platform code required; just drag, drop, and go.

How It Works

When added to your app, the component renders a button labeled “Take Picture.” Here’s what happens under the hood:

  1. User taps “Take Picture” — The component calls the device’s native camera using image_picker or camera package logic.
  2. Camera opens — The device camera interface is launched, allowing the user to capture a photo.
  3. Image captured — After the user takes the photo, the captured image is saved temporarily.
  4. Bottom sheet appears — The image is displayed in a styled bottom sheet, where users can review or confirm the picture.

All of this happens in a smooth, intuitive flow that keeps users engaged and on-task.

📲 Use Cases

The Custom Camera Component is perfect for:

  • User profile pictures
  • Product listings in a marketplace
  • Document or receipt uploads
  • Field data capture
  • Social sharing apps

Custom Widget Code: CameraPhoto

Here’s the complete code for the camera component:

// Automatic FlutterFlow imports
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/custom_code/widgets/index.dart'; // Imports other custom widgets
import '/flutter_flow/custom_functions.dart'; // Imports custom functions
import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:camera/camera.dart';

class CameraPhoto extends StatefulWidget {
const CameraPhoto({
Key? key,
this.width,
this.height,
}) : super(key: key);

final double? width;
final double? height;

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

class _CameraPhotoState extends State<CameraPhoto> {
CameraController? controller;
late Future<List<CameraDescription>> _cameras;

@override
void initState() {
super.initState();
_cameras = availableCameras();
}

@override
void didUpdateWidget(covariant CameraPhoto oldWidget) {
super.didUpdateWidget(oldWidget);
if (FFAppState().makePhoto) {
controller!.takePicture().then((file) async {
Uint8List fileAsBytes = await file.readAsBytes();
final base64 = base64Encode(fileAsBytes);

FFAppState().update(() {
FFAppState().fileBase64 = base64;
FFAppState().makePhoto = false;
});
}).catchError((error) {});
}
}

@override
void dispose() {
controller?.dispose();
super.dispose();
}

@override
Widget build(BuildContext context) {
return FutureBuilder<List<CameraDescription>>(
future: _cameras,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasData && snapshot.data!.isNotEmpty) {
if (controller == null) {
controller =
CameraController(snapshot.data![0], ResolutionPreset.max);
controller!.initialize().then((_) {
if (!mounted) return;
setState(() {});
});
}
return controller!.value.isInitialized
? MaterialApp(home: CameraPreview(controller!))
: Container();
} else {
return const Center(child: Text('No cameras available.'));
}
} else {
return const Center(child: CircularProgressIndicator());
}
},
);
}
}

Custom Function to Convert base64 to File

When previewing or uploading the image, you’ll need to convert it back to a file. Here’s a helpful custom function for that:

import 'dart:convert';
import '/flutter_flow/uploaded_file.dart';

FFUploadedFile? base64toFile(String base64Img) {
final bytes = base64Decode(base64Img);
final file = FFUploadedFile(bytes: bytes);
return file;
}

How to Use This Component

  1. Add CameraPhoto widget to any page.
  2. Add a button with an Action to:
     Set App State → makePhoto = true
  3. Use a Conditional widget or Bottom Sheet to detect when fileBase64 is updated and show the image using base64toFile(fileBase64).
  4. Done! You’ve got a working custom camera integration.

🧩 How to Use in Your FlutterFlow App

  1. Add the component to any screen.
  2. No additional setup required — no Firebase or platform channels.
  3. Customize UI (optional) by changing the button style, icon, or sheet design.

Because it uses standard Flutter widgets and is pre-wired for camera access, there’s no platform-specific setup needed beyond the usual permissions in Android/iOS (which FlutterFlow handles with ease).

Conclusion

Integrating native camera access doesn’t need to be complicated. With this Custom Camera Component, you get a fast, reliable, and visually polished solution that enhances the usability of your app.

Whether you’re building a new FlutterFlow project or improving an existing one, this component makes capturing and previewing images a breeze.

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.

Flutter: Socket.IO WebSockets Client

0

In this article, we will explore Flutter: Socket.IO WebSockets Client. We will learn how to execute a demo program. We will show you how to use Socket.IO Client with the socket_io_client package in your Flutter applications.

For Socket IO Client:

socket_io_client | Dart package
Dartlang port of socket. io-client for web, flutter, dartvm to usepub.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:

What is Socket.IO

How Socket.IO Works

Implementation

Code Implement

Conclusion



What is Socket.IO:

By allowing real-time connection between clients and servers, the Flutter library Socket.IO allows us to enable or superpower Flutter apps. WebSocket Technology is ideal for developing applications such as online gaming, real-time chat, and more.

How Socket.IO Works:

We set up a real-time, bidirectional data transfer between the client application (Flutter) and the backend server, which will function as a WebSockets server.

Actions to take:

  • Create a connection between the server and the client.
  • Any event or message that comes in from the server will be heard by the Flutter app.
  • Data will be broadcast to the backend by Emet Events.
  • Always cut off the client-server connection when it is no longer required.

Implementation:

Step 1: Add the dependencies

Add dependencies to pubspec . yaml file.

dependencies:
  flutter:
    sdk: flutter
  socket_io_client: ^latest version

Step 2: Import

import 'package:socket_io_client/socket_io_client.dart' as IO;

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

How to implement code in dart file:

=> Initialize SocketIO in Flutter:-

  • onConnect: A callback is initiated when a WebSocket connects.
  • onDisconnect: The onDisconnect method allows us to continuously check for socket disconnections caused by certain sockets.
IO.Socket socket = IO.io('http://localhost:3000',
  OptionBuilder()
      .setTransports(['websocket']) 
      .setExtraHeaders({'foo': 'bar'})
      .build());


socket.connect();

socket.onConnect((_) => print(" Connected to Server "));

socket.onConnectError(() => print('Connection Error: $err'));

socket.onError((err)=> print("Error"));

socket.onDisconnect((_)=> print('Disconnected from Server"));
  • onConnectError: is utilised for handling; a callback will be initiated if an error occurs during socket connection.
  • onError: This can be used to address any errors that may arise during the client-server message exchange.

=> Listening to WebSocket Events:-
We utilise the On method to listen to any incoming messages related to a certain event topic. Flutter apps can utilise On Method to listen to incoming messages, such as showing new chat messages in real time.

void listenToSocketEvent(){

socket.on('eventName' (data){
   print(' Message received: $data');
});

}

=> Sending or Emitting Events to Listeners:-

The emit method is used when we wish to broadcast an event to all listeners or send a message or data to a server. We can instantly send data or messages from client to server by using emit.

void sendData(){

  final messageData = {

   'messageId':'abcd12',
   'text':'Hello, This is First Message', 
   'sender':'userName',
   'isImportant':true,
   'timestamp':DataTime.now().toIso8601String(),
  }

}

=> Closing WebSockets:-

Never forget to disconnect the socket while not in use. This is usually possible while the application is closed.

void closeAllSocketConnection(){

   socket.disconnect();
   socket.dispose();

}

Conclusion:

In the article, I have explained the Clutter: Socket.IO WebSockets Client; you can modify this code according to your choice. This was a small introduction to the Flutter: Socket.IO WebSockets Client 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: Socket.IO WebSockets Client in your Flutter projectsWe will show you what the Introduction is. Make a demo program for working on the Socket.IO WebSockets Client using the socket_io_client package in your Flutter applications. 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.


Flutter Deep Links – A unique way!

0

We can provide our users with a customised flow thanks to deep linking. Apps can reply to URLs and direct users to particular sites or actions through deep linking. Firebase Dynamic Links was a well-known solution for this feature up to this point. Nevertheless, Firebase has decided to discontinue support for Dynamic Links, and on August 25, 2025, the service will cease operations (Reference). And now that time is running out, we must either utilise a custom/unique solution or switch to a new one.

This blog will take a different approach to examining Flutter Deep Links! Instead of integrating and experimenting with several solutions in your Flutter applications, we will look at how to develop a new one.

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



Create a website:

Every deep link has a webpage, or URL, as you might say. In our situation, all we need to do is make a basic website. If the user hasn’t installed your app, they will see this page. So that customers can download the program, you can add logic to open the appropriate shopfronts.

Imagine that you make a website at https://flutterdevs.com/. Any free hosting service, such as Firebase Hosting, Netlify, etc., can be used to host the website; a.com domain or any other type of paid domain is not necessary.

Configuration Files on your website:

We must produce two files for iOS and Android once your website is complete. You must establish a subdirectory named “.well-known” in the codebase of your website, which will house the configuration files. Don’t alter the folder’s name!

Android
Make sure to include a new file named assetlinks.json in your well-known.
The settings for your Android app will be in this file. It ought to include the following information:

[
    {
        "relation": [
            "delegate_permission/common.handle_all_urls"
        ],
        "target": {
            "namespace": "android_app",
            "package_name": "com.example.app",
            "sha256_cert_fingerprints": [
                "your sha256 key"
            ]
        }
    }
]

You must add a SHA256 key to the list and change the package_name in the aforementioned file to the package name of your application. If you want to debug your device, you may add its SHA256 key. You can also include the SHA256 key you used to sign your app when it was released. You can also locate it in the Developer Console under Setup > App Integrity > App Signing if you sign your production app through the Google Play Store.

iOS
Make a new file called apple-app-site-association within your. well-known folder. The settings for your iOS app will be in this file. It ought to include the following information:

{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appIDs": [
                    "teamID.bundleID"
                ],
                "components": [
                    {
                        "/": "*",
                        "comment": "Matches any URL path"
                    }
                ]
            }
        ]
    }
}

You must change teamID to your app’s Team ID (which you can obtain from Xcode or the Apple Developer Console) and bundleID to your app’s Bundle ID in the aforementioned file. You may either add all URLs by including * in the components or you can mention specific destinations.

After adding these files, redeploy them and make sure the modified files are visible at https://flutterdevs.com/.well-known/assetlinks.json and https://flutterdevs.com/.well-known/apple-app-site-association. Try clearing your cache or waiting a little while if you don’t see the updated material.

App Configuration:

It’s time to set up our software to manage deep links after you’ve finished configuring your website.

Android
Let’s make changes to the AndroidManifest.xml file to enable deep links on Android. To your file, add the following:

<intent-filter android:autoVerify="true">
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="android.intent.category.BROWSABLE" />

  <data android:scheme="https" />
  <data android:host="yourDomain.com" />
</intent-filter>

Remember to adjust the domain, which in our case would be flutterdevs.com. Any path on your website will open your app like the example above. You can take the following action if you want to limit the app’s opening to particular paths:

<data android:path=”/invite” />

iOS
You must launch Xcode and add your domain to Associated Domains in Signing & Capabilities in order for iOS to support deep links.

Handling Deep Links:

We must now manage the deep links in our application after finishing all the configurations. To handle the deep link quickly and simply, you can use a package like app_links. You must take the following actions to use the app_links package to handle deep links:

final appLinks = AppLinks(); // AppLinks is singleton

// Subscribe to all events (initial link and further)
final sub = appLinks.uriLinkStream.listen((uri) {
// Do something (navigation, ...)
});

That’s it! You won’t have to pay or test out numerous solution providers because it’s so simple to construct your deep-linking solution.

Conclusion:

In the article, I have explained the Flutter Deep Links – A unique way! basic structure in Flutter; you can modify this code according to your choice. This was a small introduction to the  Flutter Deep Links – A unique way!, 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 Deep Links – A unique way! In 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.


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.

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.