Google search engine
Home Blog Page 230

LambdaTest In Flutter

0

Hi everyone! today we learn about Lambda Test In Flutter. LambdaTest is a cloud-based cross-browser testing tool that allows you to perform cross-browser testing for web applications across more than 2000 browsers, operating systems, and devices. You can perform both manual and automated cross-browser testing using LambdaTest.

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 To LambdaTest Cross Browser Testing Tool

Key Features of LambdaTest Cross Browser Testing Cloud

Registration — LambdaTest

Integration

Conclusion


Introduction To LambdaTest Cross Browser Testing Tool:

LambdaTest is a Cross Browser Testing Cloud, that allows developers and testers to perform Cross Browser Testing on 2000+ Real Browsers and Operating System Online in varying screen resolutions. LambdaTest allows us to test on the latest mobile and desktop browsers on the cloud.

We can ensure our website is compatible across all browsers and devices by performing Real-time cross cross-browser compatibility testing with LambdaTest. We can choose from a wide range of updated Android and iOS mobile devices from the latest to oldest versions of Chrome, Firefox, Safari, Edge, Internet Explorer, Opera, and Yandex. It also allows us to test for responsiveness and take full-paged automated screenshots. Supported devices are Windows, Android, iPhone/iPad, Mac, and Web-based.

As Software testers, we test applications on different platforms and we all know that it’s not an easy job to set up our test environment based on our requirements. While testing a website, we need to ensure that our website is up to shape. To ensure this we need to have all the devices and browsers. You need to install all the browsers by spending a lot of time, and money. Fortunately, there are some tools to overcome this cumbersome installation process and waste money unwantedly. We have many tools to do Cross Browser Testing. Today we are going to bring another new Cross Browser Testing Tool i.e., LambdaTest. LambdaTest is a CrossBrowserTesting Tool on Cloud.

Key Features of LambdaTest Cross Browser Testing Cloud:

1. Online Browser Compatibility Testing: We can perform browser compatibility testing from a vast choice of desktop and mobile browsers, browser versions, operating systems, and resolutions. We can also record or take screenshots during real-time browser compatibility testing sessions on the go.

2. Test on Latest Desktop Browsers: It has great collections of all the latest browsers (Google Chrome, Mozilla Firefox, Opera, IE, Edge, Safari, and Yandex) and operating systems.

3. Test on a Wide Variety of Mobile Devices: It supports a wide list of iPhones, and iPads on different iOs versions and Android phones like Samsung, Google, Sony, LG, One Plus, HTC, Amazon, Motorola, Xiaomi, Huawei, Gionee, Oppo, Vivo on latest Android versions and different browsers.

4. Faster Automated Screenshots / Screenshot testing: We can get full-paged screenshots within seconds by just selecting the configurations using the LambdaTest automated screenshots feature.

5. Check Responsiveness on All Screen Sizes: We can check the responsiveness of our website with just a single click across different screen sizes. We can also check the responsiveness of our locally hosted websites using LambdaTest Secure Shell Tunnel.

6. Seamless Collaboration and Testing: We can log issues instantly during test sessions. We can share the issues via email, slack or directly log it in different bug tracking tools.

7. Testing Locally Hosted Pages: We can test locally or privately hosted pages on the LambdaTest cloud platform using Lambda Tunnel even before launching on live servers.

8. Smart Visual Regression Testing: We can solve issues related to icon size, padding, color, layout, text, element’s position, etc., by performing smart visual regression testing on our layouts.

9. Resolution Display Testing: Screen resolutions ranging from 800×600 to 2560×1440 are available. We can simply change screen resolution in the mid of a session by just selecting the required resolution and our browser will be resized as per our selected resolution.

10. LambdaTest Inbuilt Issue Tracker: It comes with an inbuilt issue tracker. If you don’t use any third-party project management tool, then there is no need to buy one. You can use LambdaTest’s inbuilt issue tracker to assign, track, export to pdf, and share bugs.

11. Chrome Extension: It can be used to take full-page screenshots of web pages across different desktop and mobile browsers right from your browser with just one click. These screenshots will help in fast-tracking cross-browser compatibility testing of the web pages and websites.

12. 24*7 Support: The best part of LambdaTest is their 24×7 support from their Tech Experts. You can do so through email, live chat, and phone calls. If you don’t wish to use any of those channels, support tickets can also be filed. Just explain what the problem is and LambdaTest’s support team will do their best to resolve it for you.

Registration — LambdaTest:

Step 1: Open this link
Step 2: Click on “Free Sign Up”

Step 3: Provide the required details to Sign Up

You will be redirected to LambdaTest Dashboard.

Overview On LambdaTest Dashboard:

> Real-Time Browser Testing

Step 1: Go to “Real Time Test” from the left navigation menu.
Step 2: Enter the “URL” of the site that you want to test
Step 3: Select either “Desktop” or “Mobile device”
Step 4: Select “Browser version”, “OS”, and “Resolution”
Step 5: Click on “Start”

Click the button with the camera icon (as shown in the below image) to generate a screenshot for the visible part of the screen you are currently on inside the Virtual Machine.

Once the desired Virtual Machine is launched and operable, you can capture screenshots or record a video and report bugs in the bug tracking tool provided by LambdaTest or you can use your favorite third-party bug tracking tool.

> Screenshot Testing

Step 1: Click on the “Screenshot” menu under the “Visual UI Test” menu
Step 2: Enter the “URL” of the site that you want to test
Step 3: Select either “Desktop” or “Mobile device”
Step 4: Select “Browser version” related to the required “OS”
Step 5: Click on “Capture” and you will be taken to the result page where you can view your screenshots.

> Responsive Testing

Step 1: Click on the “Responsive” menu under the “Visual UI Test” menu
Step 2: Enter the “URL” of the site that you want to test
Step 3: Select either “Desktop” or “Mobile device”
Step 4: Select “Browser version” related to the required “OS”
Step 5: Click on “Generate”

Integration:

LambdaTest can seamlessly integrate with the following bug-tracking and communication tools:

> Bug Tracking Tools:

  • Jira
  • Slack
  • Asana
  • Trello
  • Github
  • Gitlab
  • Bitbucket
  • VSTS
  • Meet
  • Paymo
  • Teamwork
  • Hive
  • Clubhouse
  • Mantis

> Plugins & Extensions:

  • Chrome Extension
  • WordPress-Plugin

Conclusion:

If you’re looking for a fully functional and automated web-based software solution to perform live testing, then you should consider LambdaTest as a strong contender. With powerful features that allow users to test their websites and applications, the pros outweigh the cons. You can deploy projects and tasks more efficiently and easily with fewer challenges.

At the end of the day, LambdaTest only seeks to improve the way you do your work. Its features are catered to accelerate the development process and provide web developers with essential tools. Overall, testing projects and assessing software can now be done with relative ease.

❤ ❤ 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 Facebook, GitHub, Twitter, and LinkedIn.

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

Related: SMS Using Twilio In Flutter

Related: Using SharedPreferences in Flutter

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

Flutter PageView Widget

0

The PageView widget allows the user to transition between different screens in their flutter application. All you need to set it up are a PageViewController and a PageView.

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

Properties

Implementation

Conclusion

GitHub Link



Introduction:

A page view is a simple way to swipe the pages in the flutter application. It works in both horizontal and vertical ways. A PageView is a widget that generates the pages of the screen that are scrollable. The pages can be fixed or repeated pages that are built by the builder function. PageView behaves like ListView in constructing the elements.


Properties of PageView:

> allowImplicitScrolling:- This property takes in a boolean value as the object. It controls whether to allocate implicit scrolling to the widget’s page.

Implementationfinal

bool allowImplicitScrolling;

> childrenDelegate:- A delegate that provides the children for the PageView.

Implementation

final SliverChildDelegate childrenDelegate;

> clipBehavior:- The content will be clipped (or not) according to this option.

Implementation

final Clip clipBehavior;

> controller:- An object that can be used to control the position to which this page view is scrolled.

Implementation

final PageController controller;

> dragStartBehavior:- Determines the way that drags start behavior is handled.

Implementation

final DragStartBehavior dragStartBehavior;

> onPageChanged:- Called whenever the page in the center of the viewport changes.

Implementation

final ValueChanged<int>? onPageChanged;

> padEnds:- Whether to add padding to both ends of the list.

Implementation

final bool padEnds;

> physics:- How the page view should respond to user input.

Implementation

final ScrollPhysics? physics;

> restorationId:- Restoration ID to save and restore the scroll offset of the scrollable.

Implementation

final String? restorationId;

> reverse:- It defines the scrolling direction. By default, it is set to false.

Implementation

final bool reverse;

> scrollDirection:- The axis along which the page view scrolls.

Implementation

final Axis scrollDirection;

Implementation:

First, we have to create a new Flutter Project with the name pageview_flutter_demo. Then we start coding to implement the PageView in the flutter application. We use PageController inside the state of a statefulWidget and initialize it inline or in the init() method. And create an integer variable _curr and pass the initial value zero.PageController controller = PageController();
int _curr = 0;

In BuildContext(), we define Scaffold. In the appbar, we define the name and center tile.

AppBar(
centerTitle: true,
title: const Text('PageView'),
backgroundColor: Colors.lightBlueAccent,
),

After this, we pass PageView in the Scaffold body. In PageView Widget, first, we have to pass true at allowImplicitScrolling because It controls whether to allocate implicit scrolling to the widget’s page. and set the scroll direction as horizontal we can also set it as vertical. and pass the controller in the controller. After all this, we have to set the value at onPageChangeso, for page change we use setState in which we pass the _curr equals to num.

PageView(
allowImplicitScrolling: true,
children: _list,
scrollDirection: Axis.horizontal,
controller: controller,
onPageChanged: (num) {
setState(() {
_curr = num;
});
},
),

And at last, we have to pass the children, In children, we pass the _list. We already create a list.

final List<Widget> _list = <Widget>[
Center(
child: Pages(
text: "Page One",
color: Colors.teal,
)),
Center(
child: Pages(
text: "Page Two",
color: Colors.red.shade100,
)),
Center(
child: Pages(
text: "Page Three",
color: Colors.grey,
)),
Center(
child: Pages(
text: "Page Four",
color: Colors.yellow.shade100,
))
];

In this list, we use text and color so for this we create a stateless Widget with the name Pages in this we create two constructor text and color.

class Pages extends StatelessWidget {
final text;
final color;
Pages({this.text, this.color});
@override
Widget build(BuildContext context) {
return Container(
color: color,
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
text,
textAlign: TextAlign.center,
style: const TextStyle(
fontSize: 30,
fontWeight: FontWeight.w400),
),
]),
),
);
}
}

If the properties are:

scrollDirection: Axis.vertical,
reverse: true,
controller: controller,

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

And If the properties are:

scrollDirection: Axis.horizontal,
controller: controller,

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


Conclusion:

In this article, we learn how to implement PageView Widget in Flutter Application. In this, we learn many things like the axis of scroll direction, reverse, physics, etc.

❤ 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.


GitHub Link:

Find the source code of the PageView Widget In the Flutter Application :

GitHub – flutter-devs/pageView_flutter-
A new Flutter project. This project is a starting point for a Flutter application. A few resources to get you started…github.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 on an hourly or full-time basis as per your requirement! You can connect with us on Facebook, GitHub, Twitter, and LinkedIn for any flutter-related queries.

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

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


APPIUM For Android & iOS Mobile Apps Testing In Flutter

0

Hi everyone! today we learn about Appium for Android & iOS Mobile Apps Testing In Flutter. Appium is an open-source test automation tool used for testing mobile applications. It allows users to test various types of mobile applications (such as Native, Hybrid, and Mobile Web) using the standard WebDriver library.

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 Appium?

How APPIUM Works?

Prerequisite To Use APPIUM

Install Appium Desktop

APPIUM Inspector

Attach Android Emulator to Appium

APPIUM Test Case for Native Android App(Calculator)

Limitations Using APPIUM

Common Encountered Errors and Troubleshooting Steps in Appium

Conclusion


What is Appium?:

APPIUM is a freely distributed open-source mobile application UI Testing framework. Appium allows native, hybrid, and web application testing and supports automation tests on physical devices as well as an emulator or simulator both. It offers cross-platform application testing, i.e. single API works for both Android and iOS platform test scripts.

It has NO dependency on Mobile device OS. Because APPIUM has a framework or wrapper that translates Selenium Webdriver commands into UIAutomation (iOS) or UIAutomator (Android) commands depending on the device type, not any OS type.

Appium supports all languages that have Selenium client libraries like- Java, Objective-C, JavaScript with node.js, PHP, Ruby, Python, C#, etc.

How APPIUM Works?:

  • Appium is an ‘HTTP Server’ written using a Node.js platform and drives iOS and an Android sessions using Webdriver JSON wire protocol. Hence, before initializing the Appium Server, Node.js must be pre-installed on the system.
  • When Appium is downloaded and installed, then a server is set up on our machine that exposes a REST API.
  • It receives connection and command requests from the client and executes that command on mobile devices (Android / iOS).
  • It responds with HTTP responses. Again, to execute this request, it uses the mobile test automation frameworks to drive the user interface of the apps. A framework like:-
  • Apple Instruments for iOS (Instruments are available only in Xcode 3.0 or later with OS X v10.5 and later)
  • Google UIAutomator for Android API level 16 or higher
  • Selendroid for Android API level 15 or less

Prerequisite To Use APPIUM:

  1. Install ANDROID SDK (Studio)
  2. Install JDK (Java Development Kit)
  3. Install Eclipse
  4. Install TestNG for Eclipse
  5. Install Selenium Server JAR
  6. Appium Client Library
  7. APK App Info on Google Play
  8. js (Not Required — Whenever the Appium server is installed, it by default comes with “Node.exe” & NPM. It’s included in the Current version of Appium.)
  9. Install Appium Desktop

Install Appium Desktop:

Appium Studio is an Open source GUI app to install Appium Server. It comes bundled with all the prerequisites to install and use Appium Server. It also has an Inspector to get basic information on your Apps. It comes with a Recorder to create boilerplate code to automate your mobile apps.

Step 1) Go to http://appium.io/ and click on Download Appium.

Step 2) For Windows, select the exe file and download. The file is around 162MB and will take time to download based on your internet speed.

Step 3) Click on the downloaded exe.

Step 4) On a Windows machine, there is no need to install Appium. It runs directly from the exe. Once you click the exe you will see the following image for a few minutes.

For Mac, you need to install the dmg

Step 5) Next you will see the Server Start Window. It populates the default host and port option which you can change. It also mentions the version of Appium being used.

Step 6) On clicking the Start Server Button, a new server is launched on the specified host and port. Server log output is shown.

Step 7) Click New Session Window.

Step 8) You can enter the Desired Capabilities and start a session.

APPIUM Inspector:

Similar to the Selenium IDE record and playback tool, Appium has an ‘Inspector’ to record and Playback. It records and plays native application behavior by inspecting DOM and generates the test scripts in any desired language. However, currently, there is no support for Appium Inspector for Microsoft Windows. In Windows, it launches the Appium Server but fails to inspect elements. However, the UI Automator viewer can be used as an option for Inspecting elements.

Steps to start with Appium Inspector on a Mac machine:-

Step 1) Download and start your Appium server with the default IP Address 0.0.0.0 and port 4725.

  1. Select the source file or .app files from local to test.
  2. Check the ‘App Path’ Checkbox to enable the ‘Choose’ button.

Step 2)Now, clicking on the ‘Choose’ button will give the option to browse and select the test file from the local drive.

Step 3) Start Simulator on a Mac machine.

Step 4) Click the ‘Launch’ button from the top right corner, which enables a blue color icon. Again, click on this blue color icon, it will open the Appium inspector and Simulator with a pre-selected application.

Step 5)– Launching your Appium Inspector will show the element hierarchy in a column-wise structure. Also, a user can apply actions using buttons like Tap, Swipe, etc.

Step 6) Click on the ‘Stop’ button to stop recording.

Attach Android Emulator to Appium:

Step 1) Install Android SDK in your system.

Go to Control panel >> System and Security >> System and from the left panel click on ‘Advanced System Settings. From the ‘System Properties’ pop-up, click on the ‘Advanced’ tab and then click on the “Environment Variables” button.

Step 2) Now, from the ‘Environment variables’ pop-up, ‘double-click on ‘Path’ and set the ANDROID_HOME variable that points to your SDK directory. In the path append the whole SDK folder path.

e.g. –C:\User\ABC\Desktop\adt-bundled-windows-x86_64-20140321\sdk

Step 3) Start your Android emulator or attach any Android device to your system (Make sure you have the Android Debugging option enabled in your Android device. To check Debugging Option. Go to Device Settings >> Developer Options >> Check “Debugging Option”).

Step 4) Open Command Prompt and navigate to your Android SDK’s \platform-tools\ directory (E.g. D:\adt-bundle-windows-x86_64–20130514\sdk\platform-tools).

Step 5)– Run the ADB devices’ command. You can see your connected device listed in Command Prompt window. (In CMD write ‘>adb devices’- This command will list the connected emulator instances. E.g.: ADB –s emulator-5554 install <Location of .apk file>)

Step 6)– Run the ADB start-server command. It will start the ADB server that will be used by Appium to send commands to your Android device.

Step 7) Now, navigate to the Appium directory in your system and start Appium by clicking an Appium.exe file.

Step 8) Do not alter the IP address or port number and click the ‘Launch’ button. Your Appium console starts at 127.0.0.1:4723 as shown below.

Step 9) Click on the ‘Start’ button, Appium server started running on your system.

APPIUM Test Case for Native Android App(Calculator):

Step 1) Download the ADT eclipse plugin or download ADT bundled separately here

Step 2) Open Eclipse and Create a new Project >> Package >> Class

Step 3) Import the Selenium library and Test-inside that new project.

Step 4) Now Create a small test Program for ‘Calculator. app’ to sum two numbers.

package src_Appium;
import java.net.MalformedURLException;
import java.net.URL;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
//import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.annotations.*;

public class Calculator {
WebDriver driver;@BeforeClass
public void setUp() throws MalformedURLException{
//Set up desired capabilities and pass the Android app-activity and app-package to Appium
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("BROWSER_NAME", "Android");
capabilities.setCapability("VERSION", "4.4.2");
capabilities.setCapability("deviceName","Emulator");
capabilities.setCapability("platformName","Android");


capabilities.setCapability("appPackage", "com.android.calculator2");
// This package name of your app (you can get it from apk info app)
capabilities.setCapability("appActivity","com.android.calculator2.Calculator"); // This is Launcher activity of your app (you can get it from apk info app)
//Create RemoteWebDriver instance and connect to the Appium server
//It will launch the Calculator App in Android Device using the configurations specified in Desired Capabilities
driver = new RemoteWebDriver(new URL("https://127.0.0.1:4723/wd/hub"), capabilities);
}@Test
public void testCal() throws Exception {
//locate the Text on the calculator by using By.name()
WebElement two=driver.findElement(By.name("2"));
two.click();
WebElement plus=driver.findElement(By.name("+"));
plus.click();
WebElement four=driver.findElement(By.name("4"));
four.click();
WebElement equalTo=driver.findElement(By.name("="));
equalTo.click();
//locate the edit box of the calculator by using By.tagName()
WebElement results=driver.findElement(By.tagName("EditText"));
//Check the calculated value on the edit box
assert results.getText().equals("6"):"Actual value is : "+results.getText()+" did not match with expected value: 6";}@AfterClass
public void teardown(){
//close the app
driver.quit();
}
}

Appium Server and Android Emulator from ‘AVD Manager’ and Click Run >> TestNG. The above program will run the ‘Calculator. app’ on the selected emulator and the Result is displayed under the Eclipse console using a TestNG framework.

Limitations Using APPIUM:

  1. Appium does not support testing of Android Version lower than 4.2
  2. Limited support for hybrid app testing. e.g.: not possible to test the switching action of the application from the web app to native and vice-versa.
  3. No support for running Appium Inspector on Microsoft Windows.

Common Encountered Errors and Troubleshooting Steps in Appium:

Conclusion:

With emerging trends and more demand for Mobile Apps, all major companies are migrating to get their business on mobile apps. Thus to release quality mobile apps, automation testing of mobile apps is the latest trend in the industry.

Appium, because of its simplicity and ease of use, is one of the leaders and most widely used tools all over the globe for the automation testing of mobile apps for iOS or Android.

❤ ❤ 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 Facebook, GitHub, Twitter, and LinkedIn.

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

Related: Developing Web Apps Using Flutter

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

What is TestNG In Flutter

0

Hi everyone! today we learn about What is TestNG In Flutter. TestNG is a testing framework for the java programming language created by Cédric Beust and inspired by JUnit and NUnit.

The design goal of TestNG is to cover a wider range of test categories: unit, functional, end-to-end, integration, etc., with more powerful and easy-to-use functionalities.

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 TestNG?

Why Use TestNG with Selenium?

Advantages of TestNG over JUnit

What is Annotation in TestNG?

How to Write Test Cases in TestNG?

Create Test Case Using TestNG Annotations

Setting up a new TestNG Project

How to Create a New TestNG Test File

Coding of our First TestNG Test Case Example

Running the Test

Checking reports created by TestNG

Generating HTML Reports

Annotations used in TestNG

Multiple Test Cases

Parameters

Multiple Parameters

Summary of TestNG Annotations

Conclusion


What is TestNG?

TestNG is an automation testing framework in which NG stands for “Next Generation”. TestNG is inspired by JUnit which uses the annotations (@). TestNG overcomes the disadvantages of JUnit and is designed to make end-to-end testing easy.

Using TestNG, you can generate a proper report, and you can easily come to know how many test cases are passed, failed, and skipped. You can execute the failed test cases separately.

For example:

  • Suppose, you have five test cases, and one method is written for each test case (Assume that the program is written using the main method without using TestNG). When you run this program first, three methods are executed successfully, and the fourth method is failed. Then correct the errors present in the fourth method, now you want to run only the fourth method because the first three methods are anyway executed successfully. This is not possible without using TestNG.
  • The TestNG in Selenium provides an option, i.e., the TestNG-failed.xml file in the test-output folder. If you want to run only failed test cases means you run this XML file. It will execute only failed test cases.

Besides the above concept, you will learn more about TestNG, like what are the Advantages of TestNG, how to create test methods using @test annotations, and how to convert these classes into testing suite files and execute them through the eclipse as well as from the command line.

Why Use TestNG with Selenium?

Default Selenium tests do not generate a proper format for the test results. Using TestNG in Selenium, we can generate test results.

Most Selenium users use this more than JUnit because of its advantages. There are so many features of TestNG, but we will only focus on the most important ones that we can use in Selenium. The following are the key features of Selenium TestNG:

  • Generate the report in a proper format including the number of test case runs, the number of test cases passed, the number of test cases failed, and the number of test cases skipped.
  • Multiple test cases can be grouped more easily by converting them into testng.xml files. In which you can make priorities on which test case should be executed first.
  • The same test case can be executed multiple times without loops just by using a keyword called ‘invocation count.’
  • Using TestNG, you can execute multiple test cases on multiple browsers, i.e., cross-browser testing.
  • The TestNG framework can be easily integrated with tools like TestNG Maven, Jenkins, etc.
  • Annotations used in the testing are very easy to understand ex: @BeforeMethod, @AfterMethod, @BeforeTest, @AfterTest
  • WebDriver has no native mechanism for generating reports. TestNG can generate the report in a readable format like the one shown below.
  • TestNG simplifies the way the tests are coded. There is no more need for a static main method in our tests. The sequence of actions is regulated by easy-to-understand annotations that do not require methods to be static.
  • Uncaught exceptions are automatically handled by TestNG without terminating the test prematurely. These exceptions are reported as failed steps in the report.

Advantages of TestNG over JUnit:

There are three major advantages of TestNG over JUnit:

  • Annotations are easier to understand
  • Test cases can be grouped more easily
  • Parallel testing is possible

What is Annotation in TestNG?

Annotations in TestNG are lines of code that can control how the method below them will be executed. They are always preceded by the @ symbol. A very early and quick TestNG Example is the one shown below.

Annotations will be discussed later in the section named “Annotations used in TestNG,” so it is perfectly ok if you do not understand the above TestNG Example just yet. It is just important to note for now that annotations in TestNG are easier to code and understand than in JUnit.

The ability to run tests in parallel is available in TestNG but not in JUnit, so the TestNG framework is preferred for testers using Selenium Grid.

How to Write Test Cases in TestNG?

Step 1) Write your business logic and insert the TestNG annotations in your code.
Step 2) Add more information like class name, groups name, package name, etc
Step 3) Run the TestNG.

Create Test Case Using TestNG Annotations:

Now, we will learn how to create our first test case using TestNG Annotations in Selenium:

Before we create a test case, we should first set up a new TestNG Project in Eclipse and name it “FirstTestNGProject”.

Setting up a new TestNG Project:

Step 1: Click File > New > Java Project

Step 2: Type “FirstTestNGProject” as the Project Name then click Next.

Step 3: We will now start to import the TestNG Libraries onto our project. Click on the “Libraries” tab, and then “Add Library…”

Step 4: On the Add Library dialog, choose “TestNG” and click Next.

Step 5: Click Finish.

You should notice that TestNG is included on the Libraries list.

Step 6: We will now add the JAR files that contain the Selenium API. These files are found in the Java client driver that we downloaded from https://www.selenium.dev/downloads/ when we were installing Selenium and Eclipse in the previous chapters.

Then, navigate to where you have placed the Selenium JAR files.

After adding the external JARs, your screen should look like this.

Step 7: Click Finish and verify that our FirstTestNGProject is visible on Eclipse’s Package Explorer window.

How to Create a New TestNG Test File:

Now that we are done setting up our project in this TestNG tutorial, let us create a new TestNG file.

Step 1: Click on ‘src’ and Choose other.
Right-click on the “src” package folder then choose New > Other…

Step 2: Select the TestNG class.
Click on the TestNG folder and select the “TestNG class” option. Click Next.

Step 3: Type the values.
Type the values indicated below on the appropriate input boxes and click Finish. Notice that we have named our Java file “FirstTestNGFile”.

Step 4: Template Created.
Eclipse should automatically create the template for our TestNG file shown below.

Coding of our First TestNG Test Case Example:

Let us now create our first Test Case that will check if Mercury Tours’ homepage is correct. Type your code as shown in the below TestNG Example:

package firsttestngpackage;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.*;public class firsttestngfile {
public String baseUrl = "http://demo.guru99.com/test/newtours/";
String driverPath = "C:\\geckodriver.exe";
public WebDriver driver ;

@Test
public void verifyHomepageTitle() {

System.out.println("launching firefox browser");
System.setProperty("webdriver.gecko.driver", driverPath);
driver = new FirefoxDriver();
driver.get(baseUrl);
String expectedTitle = "Welcome: Mercury Tours";
String actualTitle = driver.getTitle();
Assert.assertEquals(actualTitle, expectedTitle);
driver.close();
}
}

Notice the following.

  • TestNG does not require you to have a main() method.
  • Methods need not be static.
  • We used the @Test annotation. @Test is used to tell that the method under it is a test case. In this case, we have set the verifyHomepageTitle() method to be our test case, so we placed an ‘@Test’ annotation above it.
  • Since we use annotations in TestNG, we needed to import the package org.testng.annotations.*.
  • We used the Assert class. The Assert class is used to conduct verification operations in TestNG. To use it, we need to import the org. testng.Assert package.

You may have multiple test cases (therefore, multiple @Test annotations) in a single TestNG file. This will be tackled in more detail later in the section “Annotations used in TestNG.”

Running the Test:

To run the test, simply run the file in Eclipse as you normally do. The eclipse will provide two outputs — one in the Console window and the other in the TestNG Results window.

Checking reports created by TestNG:

The Console window in Eclipse gives a text-based report of our test case results while the TestNG Results window gives us a graphical one.

Generating HTML Reports:

TestNG can generate reports in HTML format.

Step 1: After running our FirstTestNGFile that we created in the previous section, right-click the project name (FirstTestNGProject) in the Project Explorer window then click on the “Refresh” option.

Step 2: Notice that a “test-output” folder was created. Expand it and look for an index.html file. This HTML file is a report of the results of the most recent test run.

Step 3: Double-click on that index.html file to open it within Eclipse’s built-in web browser. You can refresh this page any time after you rerun your test by simply pressing F5 just like in ordinary web browsers.

Annotations used in TestNG:

In the previous section, you have been introduced to the @Test annotation. Now, we shall be studying more advanced annotations and their usage.

Multiple Test Cases:

We can use multiple @Test annotations in a single TestNG file. By default, methods annotated by @Test are executed alphabetically. See the code below. Though the methods c_test, a_test, and b_test are not arranged alphabetically in the code, they will be executed as such.

Run this code and on the generated index.html page, click “Chronological view.”

Parameters:

If you want the methods to be executed in a different order, use the parameter “priority”. Parameters are keywords that modify the annotation’s function.

  • Parameters require you to assign a value to them. You do. this by placing a “=” next to them, and then followed by the value.
  • Parameters are enclosed in a pair of parentheses which are placed right after the annotation like the code snippet shown below.

TestNG will execute the @Test annotation with the lowest priority value up to the largest. There is no need for your priority values to be consecutive.

The TestNG HTML report will confirm that the methods were executed based on the ascending value of priority.

Multiple Parameters:

Aside from “priority,” @Test has another parameter called “alwaysRun” which can only be set to either “true” or “false.” To use two or more parameters in a single annotation, separate them with a comma such as the one shown below.@Test(priority = 0, alwaysRun = true)

@BeforeTest and @AfterTest:

@BeforeTestmethods under this annotation will be executed before the first test case in the TestNG file.@AfterTestmethods under this annotation will be executed after all test cases in the TestNG file are executed.

Consider the code below.

package firsttestngpackage;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.*;
public class firsttestngfile {
public String baseUrl = "http://demo.guru99.com/test/newtours/";
String driverPath = "C:\\geckodriver.exe";
public WebDriver driver ;

@BeforeTest
public void launchBrowser() {
System.out.println("launching firefox browser");
System.setProperty("webdriver.gecko.driver", driverPath);
driver = new FirefoxDriver();
driver.get(baseUrl);
}
@Test
public void verifyHomepageTitle() {
String expectedTitle = "Welcome: Mercury Tours";
String actualTitle = driver.getTitle();
Assert.assertEquals(actualTitle, expectedTitle);
}
@AfterTest
public void terminateBrowser(){
driver.close();
}
}

Applying the logic presented by the table and the code above, we can predict that the sequence by which methods will be executed is:

  • 1st — launchBrowser()
  • 2nd — verifyHomepageTitle()
  • 3rd — terminateBrowser()

The placement of the annotation blocks can be interchanged without affecting the chronological order by which they will be executed. Let’s understand with a TestNG Example and try to rearrange the annotation blocks such that your code would look similar to the one below.

package firsttestngpackage;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.*;
public class firsttestngfile {
public String baseUrl = "http://demo.guru99.com/test/newtours/";
String driverPath = "C:\\geckodriver.exe";
public WebDriver driver ;
@AfterTest //Jumbled
public void terminateBrowser(){
driver.close();
}
@BeforeTest //Jumbled
public void launchBrowser() {
System.out.println("launching firefox browser");
System.setProperty("webdriver.gecko.driver", driverPath);
driver = new FirefoxDriver();
driver.get(baseUrl);
}
@Test //Jumbled
public void verifyHomepageTitle() {
String expectedTitle = "Welcome: Mercury Tours";
String actualTitle = driver.getTitle();
Assert.assertEquals(actualTitle, expectedTitle);
}

}

Run the code above and notice that

@BeforeMethod and @AfterMethod:

@BeforeMethodmethods under this annotation will be executed before each method in each test case.@AfterMethodmethods under this annotation will be executed after each method in each test case.

In Mercury Tours, suppose we like to verify the titles of the target pages of the two links below.

The flow of our test would be:

  • Go to the homepage and verify its title.
  • Click REGISTER and verify the title of its target page.
  • Go back to the homepage and verify if it still has the correct title.
  • Click SUPPORT and verify the title of its target page.
  • Go back to the homepage and verify if it still has the correct title.

The code below illustrates how @BeforeMethod and @AfterMethod are used to efficiently execute the scenario mentioned above.

package firsttestngpackage;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.*;
@Test
public class firsttestngfile {
public String baseUrl = "http://demo.guru99.com/test/newtours/";
String driverPath = "C:\\geckodriver.exe";
public WebDriver driver;
public String expected = null;
public String actual = null;
@BeforeTest
public void launchBrowser() {
System.out.println("launching firefox browser");
System.setProperty("webdriver.gecko.driver", driverPath);
driver= new FirefoxDriver();
driver.get(baseUrl);
}

@BeforeMethod
public void verifyHomepageTitle() {
String expectedTitle = "Welcome: Mercury Tours";
String actualTitle = driver.getTitle();
Assert.assertEquals(actualTitle, expectedTitle);
}
@Test(priority = 0)
public void register(){
driver.findElement(By.linkText("REGISTER")).click() ;
expected = "Register: Mercury Tours";
actual = driver.getTitle();
Assert.assertEquals(actual, expected);
}
@Test(priority = 1)
public void support() {
driver.findElement(By.linkText("SUPPORT")).click() ;
expected = "Under Construction: Mercury Tours";
actual = driver.getTitle();
Assert.assertEquals(actual, expected);
}
@AfterMethod
public void goBackToHomepage ( ) {
driver.findElement(By.linkText("Home")).click() ;
}

@AfterTest
public void terminateBrowser(){
driver.close();
}
}

After executing this test, your TestNG should report the following sequence.

Simply put, @BeforeMethod should contain methods that you need to run before each test case while @AfterMethod should contain methods that you need to run after each test case.

Summary of TestNG Annotations:

@BeforeSuite: The annotated method will be run before all tests in this suite have run.

@AfterSuite: The annotated method will be run after all tests in this suite have run.

@BeforeTest: The annotated method will be run before any test method belonging to the classes inside the tag is run.

@AfterTest: The annotated method will be run after all the test methods belonging to the classes inside the tag have run.

@BeforeGroups: The list of groups that this configuration method will run before. This method is guaranteed to run shortly before the first test method that belongs to any of these groups is invoked.

@AfterGroups: The list of groups that this configuration method will run after. This method is guaranteed to run shortly after the last test method that belongs to any of these groups is invoked.

@BeforeClass: The annotated method will be run before the first test method in the current class is invoked.

@AfterClass: The annotated method will be run after all the test methods in the current class have been run.

@BeforeMethod: The annotated method will be run before each test method.

@AfterMethod: The annotated method will be run after each test method.

@Test: The annotated method is a part of a test case

Conclusion:

  • TestNG is a testing framework that is capable of making Selenium tests easier to understand and of generating reports that are easy to understand.
  • The main advantages of TestNG over JUnit are the following.
  • Annotations are easier to use and understand.
  • Test cases can be grouped more easily.
  • TestNG allows us to create parallel tests.
  • The Console window in Eclipse generates a text-based result while the TestNG window is more useful because it gives us a graphical output of the test result plus other meaningful details such as:
  • Runtimes of each method.
  • The chronological order by which methods were executed
  • TestNG is capable of generating HTML-based reports.
  • Annotations can use parameters just like the usual Java TestNG methods.
  • TestNG Data provider is a way to pass parameters into the test function which passes different values in test cases in a single execution.

❤ ❤ 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 Facebook, GitHub, Twitter, and LinkedIn.

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

Related: SMS Using Twilio In Flutter

Related: Using SharedPreferences in Flutter

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

Email Verification with Flutter Firebase

0

Hello!! Flutter Devs, In this article we will learn how to verify a user’s email address using an email verification link with the help of firebase authentication.

If you have used firebase authentication, you must have noticed that you can Sign in with any anonymous email address that is not yours. So you must be finding a way to verify that email address for the authenticity of that user’s email address.

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.



Firebase Project Setup:

First, we will set up our Project with Firebase, skip this part if you have already done this.

Open the Firebase console and click the “Add project” option.

Enter your project name here!

Now by clicking continue you will be redirected to the next steps, where you can enable Google Analytics for your Firebase project.

Android Setup:

Click on Android Icon on the dashboard of the firebase project console.

Now Register your android app by filling in the required details.

Now Download the google-services.json file from here and put it in your android/app folder.

IOS Configuration:

Register the IOS app to Firebase, and the iOS bundle Id must be the same in the Xcode project and on the firebase console.

Download configuration files for your app and adds them to your project folder.

Implementation:

Enable Email/Password authentication on the firebase console

Add dependencies to pubspec — yaml file.

dependencies:firebase_core: ^2.1.1
firebase_auth: ^4.1.0

We will now initialize Firebase in our project

Let’s create a new file called firebase_constants.dart, where we are going to make a global auth instance for our app and initialize that in main. dart file.

firebase_constants.dart

import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
final Future<FirebaseApp> firebaseInitialization = Firebase.initializeApp();
FirebaseAuth auth = FirebaseAuth.instance;

main.dart

void main()async {
WidgetsFlutterBinding.ensureInitialized();
await firebaseInitialization;
runApp(const MyApp());
}

Let’s create a function for the Sign-Up button to handle email authentication. This function will register a user in firebase.

static Future<User?> signUp(
{required String userEmail,
required String password,
required BuildContext context}) async {
try {
UserCredential userCredential = await FirebaseAuth.instance
.createUserWithEmailAndPassword(email: userEmail, password: password);
return userCredential.user;
} on FirebaseAuthException catch (e) {
if (e.code == 'weak-password') {
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text('The password provided is too weak.')));
} else if (e.code == 'email-already-in-use') {
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text('The account already exists for that email.')));
}
return null;
} catch (e) {
debugPrint(e.toString());
return null;
}
}

auth_page.dart

import 'package:email_auth/utils/constants/firebase_constants.dart';
import 'package:email_auth/views/auth/email_verification_page.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';

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

@override
State<AuthPage> createState() => _AuthPageState();
}

class _AuthPageState extends State<AuthPage> {

final TextEditingController _emailController = TextEditingController();
final TextEditingController _passwordController = TextEditingController();
bool _isLoading = false;

static Future<User?> signUp(
{required String userEmail,
required String password,
required BuildContext context}) async {
try {
UserCredential userCredential = await FirebaseAuth.instance
.createUserWithEmailAndPassword(email: userEmail, password: password);
return userCredential.user;
} on FirebaseAuthException catch (e) {
if (e.code == 'weak-password') {
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text('The password provided is too weak.')));
} else if (e.code == 'email-already-in-use') {
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text('The account already exists for that email.')));
}
return null;
} catch (e) {
debugPrint(e.toString());
return null;
}
}

@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 18),
child: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextFormField(
controller: _emailController,
// validator: (val) => widget.onValidate(val),
decoration: InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide:
const BorderSide(color: Colors.grey, width: 1),
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide:
const BorderSide(color: Colors.grey, width: 1),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide:
const BorderSide(color: Colors.grey, width: 1),
),
filled: true,
fillColor: Colors.white,
hintText: 'Enter Email',
// hintStyle: AppTextStyle.lightGreyText,
isDense: true,
contentPadding:
const EdgeInsets.symmetric(horizontal: 12, vertical: 15),
),
),
const SizedBox(height: 20,),
TextFormField(
controller: _passwordController,
decoration: InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide:
const BorderSide(color: Colors.grey, width: 1),
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide:
const BorderSide(color: Colors.grey, width: 1),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide:
const BorderSide(color: Colors.grey, width: 1),
),
filled: true,
fillColor: Colors.white,
hintText: 'Enter Password',
// hintStyle: AppTextStyle.lightGreyText,
isDense: true,
contentPadding:
const EdgeInsets.symmetric(horizontal: 12, vertical: 15),
),
obscureText: true,
),
const SizedBox(height: 20,),
_isLoading ? const CircularProgressIndicator() : ElevatedButton(onPressed: ()async{
setState(() {
_isLoading = true;
});
await signUp(userEmail: _emailController.text, password: _passwordController.text, context: context);
if(auth.currentUser != null){
Navigator.push(context, MaterialPageRoute(builder: (ctx)=>const EmailVerificationScreen()));
}
setState(() {
_isLoading = false;
});
}, child: const Text('Sign Up'))
],
),
),
),
);
}
}

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

Output

Also, let’s create a page where we will check the status of email verification.

Here we will set a periodic timer in the initState() state that will check the status of the email if it is verified or not.

email_verification_page.dart

import 'dart:async';
import 'package:email_auth/utils/constants/firebase_constants.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
class EmailVerificationScreen extends StatefulWidget {
const EmailVerificationScreen({Key? key}) : super(key: key);

@override
State<EmailVerificationScreen> createState() =>
_EmailVerificationScreenState();
}

class _EmailVerificationScreenState extends State<EmailVerificationScreen> {
bool isEmailVerified = false;
Timer? timer;
@override
void initState() {
// TODO: implement initState
super.initState();
FirebaseAuth.instance.currentUser?.sendEmailVerification();
timer =
Timer.periodic(const Duration(seconds: 3), (_) => checkEmailVerified());
}

checkEmailVerified() async {
await FirebaseAuth.instance.currentUser?.reload();

setState(() {
isEmailVerified = FirebaseAuth.instance.currentUser!.emailVerified;
});

if (isEmailVerified) {
// TODO: implement your code after email verification
ScaffoldMessenger.of(context)
.showSnackBar(SnackBar(content: Text("Email Successfully Verified")));

timer?.cancel();
}
}

@override
void dispose() {
// TODO: implement dispose
timer?.cancel();
super.dispose();
}

@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
body: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const SizedBox(height: 35),
const SizedBox(height: 30),
const Center(
child: Text(
'Check your \n Email',
textAlign: TextAlign.center,
),
),
const SizedBox(height: 8),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 32.0),
child: Center(
child: Text(
'We have sent you a Email on ${auth.currentUser?.email}',
textAlign: TextAlign.center,
),
),
),
const SizedBox(height: 16),
const Center(child: CircularProgressIndicator()),
const SizedBox(height: 8),
const Padding(
padding: EdgeInsets
.symmetric(horizontal: 32.0),
child: Center(
child: Text(
'Verifying email....',
textAlign: TextAlign.center,
),
),
),
const SizedBox(height: 57),
Padding(
padding: const EdgeInsets
.symmetric(horizontal: 32.0),
child: ElevatedButton(
child: const Text('Resend'),
onPressed: () {
try {
FirebaseAuth.instance.currentUser
?.sendEmailVerification();
} catch (e) {
debugPrint('$e');
}
},
),
),
],
),
),
),
);
}
}

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

Output

Now if your email address is correct then you are going to receive an email from your firebase project and now by clicking on the link you can verify your email address.

Yay!! Your email is now verified successfully.

Email Verified Screen

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

Final Output Video

Conclusion:

In this article, we learned how easily we can do email verification with the help of Firebase.

❤ ❤ 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.


GitHub Link:

find the source code of the Email Verification using Firebase:

GitHub – flutter-devs/email_verification_using_firebase
A new Flutter project. This project is a starting point for a Flutter application. A few resources to get you started…github.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.

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 Facebook, GitHub, Twitter, and LinkedIn.

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.

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


Complete Guide: Firebase Email Auth in Flutter 2026

0

Firebase is one of the recommended Back-End for Flutter applications since it gives many accessible functionalities and extraordinary integration with Flutter. One of the highlights offered by Firebase is Authentication. This way we can integrate Email, Phone, Google, Apple, and a lot more authentications in our applications!

In this article, we will use the firebase_auth package for Firebase Authentication.

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


Table Of Contents::

Introduction

Implementation

Code Implement

Conclusion

GitHub Link


Introduction:

The demo video below shows how to implement Email Authentication using Firebase in Flutter, and also how we can sign-up or login using email, we have made a demo app similar to the famous social media app Instagram, this provides users the option to both sign-up and log-in using email and password, and this can be achieved all because of Firebase.

The user can also interact with the posts on the home page but more on that later, let’s start with the integration of Email Authentication using Firebase.

Demo Modules::

Sign Up Method
Log In Method

Implementation:

Step 1: Enabling Email/Password Authentication from Firebase Console

Once you have added your project and app to Firebase Console, the first step is to enable Authentication and enable Email/Password from it.

When you click on Authentication, you will get a welcome screen from where you can click on Get Started.

When you click on the button, you will be redirected to the Sign In Method list. From there you can enable Email/Password.

Now that the first step is done, let’s dive deep into the coding part.

Step 2: Adding the dependencies

Add dependencies to pubspec — yaml file.

dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.0
firebase_core: ^1.Conclusion:0.0
cloud_firestore: ^1.0.0
firebase_auth: ^1.0.0
firebase_storage: ^8.0.0
provider: ^5.0.0

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

How to implement code in dart file :

We will create sign-up and log-in screens, You need to implement them in your code respectively:

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

We will create a sign-up form page which will be a stateful widget, which will be responsible for signing up users.

import 'package:flutter/material.dart';
import '../services/auth_methods.dart';
import '../utils/utils.dart';

class SignupScreen extends StatefulWidget {
static final String id = 'signup_screen';

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

class _SignupScreenState extends State<SignupScreen> {
final _formKey = GlobalKey<FormState>();
String? _name;
String? _email;
String? _password;
String? _userName;
bool _isLoading = false;

@override
Widget build(BuildContext context) {
return Scaffold(
body: SingleChildScrollView(
child: Container(
height: MediaQuery.of(context).size.height,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Text(
'Instagram',
style: TextStyle(
fontFamily: 'Billabong',
fontSize: 50.0,
),
),
Form(
key: _formKey,
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Padding(
padding: EdgeInsets.symmetric(
horizontal: 30.0,
vertical: 10.0,
),
child: TextFormField(
decoration: InputDecoration(labelText: 'Name'),
validator: (input) => input!.trim().isEmpty
? 'Please enter a valid name'
: null,
onSaved: (input) => _name = input!,
),
),Padding(
padding: EdgeInsets.symmetric(
horizontal: 30.0,
vertical: 10.0,
),
child: TextFormField(
decoration: InputDecoration(labelText: 'Username'),
validator: (input) => input!.trim().isEmpty
? 'Please enter a valid username'
: null,
onSaved: (input) => _userName = input!,
),
),
Padding(
padding: EdgeInsets.symmetric(
horizontal: 30.0,
vertical: 10.0,
),
child: TextFormField(
decoration: InputDecoration(labelText: 'Email'),
validator: (input) => !input!.contains('@')
? 'Please enter a valid email'
: null,
onSaved: (input) => _email = input!,
),
),
Padding(
padding: EdgeInsets.symmetric(
horizontal: 30.0,
vertical: 10.0,
),
child: TextFormField(
decoration: InputDecoration(labelText: 'Password'),
validator: (input) => input!.length < 6
? 'Must be at least 6 characters'
: null,
onSaved: (input) => _password = input!,
obscureText: true,
),
),
SizedBox(height: 20.0),
Padding(
padding: EdgeInsets.only(
left: 40,
right: 40,
),
child: Container(
width: double.infinity,
color: Colors.blue,
child: _isLoading
? Center(
child: CircularProgressIndicator(
color: Colors.white,
),
)
: TextButton(
onPressed: () => _signUp(),
child: Text(
'Sign Up',
style: TextStyle(
color: Colors.white,
fontSize: 18.0,
),
),
),
),
),
SizedBox(height: 20.0),
Container(
color: Colors.blue,
padding: EdgeInsets.symmetric(horizontal: 50),
child: TextButton(
onPressed: () => Navigator.pop(context),
child: Text(
'Back to Login',
style: TextStyle(
color: Colors.white,
fontSize: 18.0,
),
),
),
),
],
),
),
],
),
),
),
);
}
}

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

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

We will create a login page where users that signed up using email and password can directly log in.

import 'package:demo_email_authentication/screens/signup_screen.dart';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'dart:io';

import '../services/auth_methods.dart';
import '../utils/utils.dart';

class LoginScreen extends StatefulWidget {
static final String id = 'login_screen';

@override
_LoginScreenState createState() => new _LoginScreenState();
}

class _LoginScreenState extends State<LoginScreen> {
final TextEditingController _emailIdController = new TextEditingController();
final TextEditingController _passwordController = new TextEditingController();
bool _isLoading = false;

var _textStyleBlack = new TextStyle(fontSize: 12.0, color: Colors.black);
var _textStyleGrey = new TextStyle(fontSize: 12.0, color: Colors.grey);
var _textStyleBlueGrey =
new TextStyle(fontSize: 12.0, color: Colors.blueGrey);

@override
void dispose() {
super.dispose();
_emailIdController.dispose();
_passwordController.dispose();
}

@override
Widget build(BuildContext context) {
return new Scaffold(
bottomNavigationBar: _bottomBar(),
body: _body(),
);
}

Widget _userIDEditContainer() {
return new Container(
child: new TextField(
controller: _emailIdController,
decoration: new InputDecoration(
hintText: 'Phone number, email or username',
border: new OutlineInputBorder(
borderSide: new BorderSide(color: Colors.black),
),
isDense: true),
style: _textStyleBlack,
),
);
}

Widget _passwordEditContainer() {
return Container(
padding: EdgeInsets.only(top: 5.0),
child: TextField(
controller: _passwordController,
obscureText: true,
decoration: InputDecoration(
hintText: 'Password',
border: OutlineInputBorder(
borderSide: BorderSide(color: Colors.black),
),
isDense: true),
style: _textStyleBlack,
),
);
}

Widget _loginContainer() {
return GestureDetector(
onTap: _logInUser,
child: Container(
alignment: Alignment.center,
margin: EdgeInsets.only(top: 10.0),
width: 500.0,
height: 40.0,
child: _isLoading
? Center(
child: CircularProgressIndicator(
color: Colors.white,
),
)
: Text(
"Log In",
style: TextStyle(color: Colors.white),
),
color: Colors.blue,
),
);
}

Widget _facebookContainer() {
return Container(
alignment: Alignment.center,
margin: EdgeInsets.only(top: 10.0),
width: 500.0,
height: 40.0,
color: Colors.blue,
child: GestureDetector(
onTap: null,
child: Text(
"Log in with facebook",
style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
),
),
);
}

Widget _bottomBar() {
return Container(
alignment: Alignment.center,
height: 49.5,
child: Column(
children: <Widget>[
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Container(
height: 1.0,
color: Colors.grey.withOpacity(0.7),
),
Padding(
padding: EdgeInsets.only(bottom: 0.5),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Don\'t have an account?', style: _textStyleGrey),
Container(
child: TextButton(
onPressed: () =>
Navigator.pushNamed(context, SignupScreen.id),
child: Text('Sign Up.', style: _textStyleGrey),
),
),
],
)),
],
),
],
),
);
}

Widget _body() {
return Container(
alignment: Alignment.center,
padding: EdgeInsets.all(25.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Padding(
padding: EdgeInsets.only(top: 25.0, bottom: 15.0),
child: Text(
'Instagram',
style: TextStyle(fontFamily: 'Billabong', fontSize: 50.0),
),
),
_userIDEditContainer(),
_passwordEditContainer(),
_loginContainer(),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Forgot your login details?',
style: _textStyleGrey,
),
TextButton(
onPressed: () {},
child: Text(
'Get help logging in.',
style: _textStyleBlueGrey,
),
)
],
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Container(
height: 1.0,
width: MediaQuery.of(context).size.width / 2.7,
color: Colors.grey,
child: ListTile(),
),
Text(
' OR ',
style: TextStyle(color: Colors.blueGrey),
),
Container(
height: 1.0,
width: MediaQuery.of(context).size.width / 2.7,
color: Colors.grey,
),
],
),
_facebookContainer()
],
),
);
}

_showEmptyDialog(String title) {
if (Platform.isAndroid) {
showDialog(
context: context,
barrierDismissible: false,
builder: (BuildContext context) => AlertDialog(
content: Text("$title can't be empty"),
actions: <Widget>[
TextButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text("OK"))
],
),
);
} else if (Platform.isIOS) {
showDialog(
context: context,
barrierDismissible: false,
builder: (BuildContext context) => CupertinoAlertDialog(
content: Text("$title can't be empty"),
actions: <Widget>[
TextButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text("OK"))
],
),
);
}
}
}

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

Now let’s initialize firebase in our app, inmain.dartinside thelibfolder.

void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}

The WidgetsFlutterBinding.ensureInitialized(); ensures that the UI is not rendered until our initialization is not done.

Next, we will create a new dart file calledauth_methods.dart

This will contain the two most required functions for email authentication using firebase, i.e. sign-up and log-in.

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';

import '../models/user_model.dart';

class AuthMethods {
final FirebaseAuth _auth = FirebaseAuth.instance;
final FirebaseFirestore _firestore = FirebaseFirestore.instance;

Future<String> signUpUser({
required String? name,
required String? email,
required String? password,
required String? username,
}) async {
String result = 'Some error occurred';
try {
if (email!.isNotEmpty || name!.isNotEmpty || password!.isNotEmpty) {
UserCredential user = await _auth.createUserWithEmailAndPassword(
email: email, password: password!);
print(user.user!.uid);

UserModel userModel = UserModel(
email: email,
name: name!,
uid: user.user!.uid,
username: username!,
followers: [],
following: [],
);

await _firestore.collection('users').doc(user.user!.uid).set(
userModel.toJson(),
);
result = 'success';
}
} catch (err) {
result = err.toString();
}
return result;
}

Future<String> logInUser({
required String email,
required String password,
}) async {
String result = 'Some error occurred';
try {
if (email.isNotEmpty || password.isNotEmpty) {
await _auth.signInWithEmailAndPassword(
email: email, password: password);
result = 'success';
}
} catch (err) {
result = err.toString();
}
return result;
}
}

Along these lines, as we are involving Firebase for Authentication, we have pre-constructed methods for log-in and sign-up. For sign-up, we can implement createUserWithEmailAndPassword which takes 2 parameters i.e. email and password, and some parameters like name and email for our app. Likewise, we can utilize signInWithEmailAndPassword which similarly takes 2 parameters i.e. email and password. Here, we made two user-defined methods to deal with our Firebase calls. These methods accept email and password as parameters and pass them to the Firebase functions.

Here, if you notice, we are using UserModel. We have just created a simple model class that looks like this:

import 'package:cloud_firestore/cloud_firestore.dart';

class UserModel{
final String email;
final String name;
final String uid;
final String username;
final List followers;
final List following;

UserModel(
{required this.email,
required this.name,
required this.username,
required this.uid,
required this.followers,
required this.following});

Map<String, dynamic> toJson() => {
"email": email,
"uid": uid,
"name": name,
"username": username,
"followers": followers,
"following": following,
};

static UserModel? fromSnap (DocumentSnapshot snap) {
var snapshot = snap.data() as Map<String, dynamic>;
return UserModel(
username: snapshot['username'],
uid: snapshot['uid'],
name: snapshot['name'],
following: snapshot['following'],
followers: snapshot['followers'],
email: snapshot['email'],
);
}
}

Finally we create a new dart file called home_screen.dart inside the lib folder.

This screen will reflect if the user successfully signs up or logs in using Email Authentication. When we run the application, we ought to get the screen’s output like the underneath screen capture.

Now that all the methods are ready in our auth_methods.dart file,

Let’s implement these methods in our UI,

void _signUp() async {
if (_formKey.currentState!.validate()) {
_formKey.currentState!.save();
setState(() {
_isLoading = true;
});
// Logging in the user w/ Firebase
String result = await AuthMethods()
.signUpUser(name: _name, email: _email, password: _password, username: _userName);
if (result != 'success') {
showSnackBar(result, context);
} else {
Navigator.pop(context);
}
setState(() {
_isLoading = false;
});
}
}

We can call the above function in the onPressed method of the sign-up button.

You can check out the sign-up method demo in the demo modules above.

Let’s do the same for the log-in button,

void _logInUser() async {
if (_emailIdController.text.isEmpty) {
_showEmptyDialog("Type something");
} else if (_passwordController.text.isEmpty) {
_showEmptyDialog("Type something");
}
setState(() {
_isLoading = true;
});
String result = await AuthMethods().logInUser(
email: _emailIdController.text,
password: _passwordController.text,
);
if (result == 'successs') {

} else {
showSnackBar(result, context);
}
setState(() {
_isLoading = false;
});
}

You can check out the log-in method demo in the demo modules above.

Conclusion:

In the article, I have shed some light on the fundamental construction of Email Authentication using Firebase in a flutter program, you can modify this code as per your need. This was a little prologue to Email Authentication using Firebase from my side, and its functioning using Flutter.

I trust this blog will give you adequate data on trying up Email Authentication using Firebase in your flutter projects. We showed you what Email Authentication using Firebase is. its implementations, and how to utilize Email Authentication using Firebase. Made a demo app to work in your flutter applications. So if it’s not too much trouble, 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.


GitHub Link:

find the source code of the Flutter Email Authentication using Firebase Demo:

GitHub – flutter-devs/email_authentication_using_firebase
A new Flutter project. This project is a starting point for a Flutter application. A few resources to get you started…github.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 on an hourly or full-time basis as per your requirement! You can connect with us on Facebook, GitHub, Twitter, and LinkedIn for any flutter-related queries.

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

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

Explore Custom Fade-In Slide In Flutter

0

This article will be Explore Custom Fade-In Slide In Flutter. We see how to execute a demo program. We will tell you the best way how to create custom fade-in slide animation to bring dynamic interactive effects to your UI 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

Code Implement

Code File

Conclusion



Introduction

The below demo video shows how to create a custom fade-in slide in Flutter and how a custom fade-in slide will work in your Flutter applications. We will create a custom fade-in slide widget to bring dynamic interactive effects to our UI. It will be shown on your device.

Demo Module::



Code Implement:

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

First, we will define an animation direction
enum FadeDirection { ttb, btt, ltr, rtl }

Now, we will create a CustomFadeInSlide() StatefulWidget on the same main .dart file. This represents the combined fade and slide animation. It takes parameters such as child, duration, fadeOffset, curve, and direction.

class CustomFadeInSlide extends StatefulWidget {
const CustomFadeInSlide({
super.key,
required this.child,
required this.duration,
this.curve = Curves.bounceOut,
this.fadeOffset = 40,
this.direction = FadeDirection.ttb,
});

final Widget child;
final double duration;
final double fadeOffset;
final Curve curve;
final FadeDirection direction;
@override
State<CustomFadeInSlide> createState() => _CustomFadeInSlideState();
}

class _CustomFadeInSlideState extends State<CustomFadeInSlide>
with TickerProviderStateMixin {
late AnimationController controller;
late Animation<double> opacityAnimation;
late Animation<double> inAnimation;

@override
void initState() {
super.initState();

controller = AnimationController(
duration: Duration(milliseconds: (1000 * widget.duration).toInt()),
vsync: this);

inAnimation = Tween<double>(begin: -widget.fadeOffset, end: 0).animate(
CurvedAnimation(
parent: controller,
curve: widget.curve,
),
)..addListener(() {
setState(() {});
});

opacityAnimation = Tween<double>(begin: 0, end: 1).animate(controller)
..addListener(() {
setState(() {});
});
}

@override
Widget build(BuildContext context) {
final size = MediaQuery.sizeOf(context);
controller.forward();
return Transform.translate(
offset: switch (widget.direction) {
FadeDirection.ltr => Offset(inAnimation.value, 0),
FadeDirection.rtl => Offset(size.width - inAnimation.value, 0),
FadeDirection.ttb => Offset(0, inAnimation.value),
FadeDirection.btt => Offset(0, 0 - inAnimation.value),
},
child: Opacity(
opacity: opacityAnimation.value,
child: widget.child,
),
);
}

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

CustomFadeInSlideState manages the AnimationController, opacityAnimation, and inAnimation.

Now, we will create an initState() method. In this method, we will add a controller that is equal to the AnimationController(), inAnimation is equal to the Tween<double>,addListener, and opacityAnimation. Then, we will create a dispose() method. In this method, we will add a controller. dispose().

In the build part, we will return a Transform. translate() method. In this method, we will calculate the offset based on the specified direction and its child we will add Opacity widgets are used to apply fade and slide animations.

We will create a MyHomePage() class on the same dart file.

In the body part, we will add a Column widget. In this widget, we will add the three items. We will add two images and text that will wrap into CustomFadeInSlide with different directions and different durations.

Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
CustomFadeInSlide(
duration: 2,
direction: FadeDirection.ttb,
child: Image.asset(
"assets/logo.png",
height: 150,
),
),
const SizedBox(
height: 40,
),
const CustomFadeInSlide(
duration: 4,
direction: FadeDirection.ltr,
child: Padding(
padding: EdgeInsets.all(12.0),
child: Text(
'FlutterDevs specializes in creating cost-effective and efficient '
'applications with our perfectly crafted, creative and leading-edge '
'flutter app development solutions for customers all around the globe.',
textAlign: TextAlign.center,
style: TextStyle(fontSize: 16,fontWeight: FontWeight.w500),
),
)),
const SizedBox(
height: 30,
),
CustomFadeInSlide(
duration: 6,
direction: FadeDirection.btt,
child: Image.asset(
"assets/powered_by.png",
height: 150,
),
),
],
)

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

Code File:

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

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

class MyApp extends StatelessWidget {
const MyApp({super.key});

// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return const MaterialApp(
title: 'Flutter Demo',
debugShowCheckedModeBanner: false,
home: Splash(),
);
}
}

class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});

final String title;

@override
State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
automaticallyImplyLeading: false,
backgroundColor: Colors.cyanAccent,
title: Text(widget.title),
centerTitle: true,
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
CustomFadeInSlide(
duration: 2,
direction: FadeDirection.ttb,
child: Image.asset(
"assets/logo.png",
height: 150,
),
),
const SizedBox(
height: 40,
),
const CustomFadeInSlide(
duration: 4,
direction: FadeDirection.ltr,
child: Padding(
padding: EdgeInsets.all(12.0),
child: Text(
'FlutterDevs specializes in creating cost-effective and efficient '
'applications with our perfectly crafted, creative and leading-edge '
'flutter app development solutions for customers all around the globe.',
textAlign: TextAlign.center,
style: TextStyle(fontSize: 16,fontWeight: FontWeight.w500),
),
)),
const SizedBox(
height: 30,
),
CustomFadeInSlide(
duration: 6,
direction: FadeDirection.btt,
child: Image.asset(
"assets/powered_by.png",
height: 150,
),
),
],
),
),
);
}
}

enum FadeDirection { ttb, btt, ltr, rtl }

class CustomFadeInSlide extends StatefulWidget {
const CustomFadeInSlide({
super.key,
required this.child,
required this.duration,
this.curve = Curves.bounceOut,
this.fadeOffset = 40,
this.direction = FadeDirection.ttb,
});

final Widget child;
final double duration;
final double fadeOffset;
final Curve curve;
final FadeDirection direction;

@override
State<CustomFadeInSlide> createState() => _CustomFadeInSlideState();
}

class _CustomFadeInSlideState extends State<CustomFadeInSlide>
with TickerProviderStateMixin {
late AnimationController controller;
late Animation<double> opacityAnimation;
late Animation<double> inAnimation;

@override
void initState() {
super.initState();

controller = AnimationController(
duration: Duration(milliseconds: (1000 * widget.duration).toInt()),
vsync: this);

inAnimation = Tween<double>(begin: -widget.fadeOffset, end: 0).animate(
CurvedAnimation(
parent: controller,
curve: widget.curve,
),
)..addListener(() {
setState(() {});
});

opacityAnimation = Tween<double>(begin: 0, end: 1).animate(controller)
..addListener(() {
setState(() {});
});
}

@override
Widget build(BuildContext context) {
final size = MediaQuery.sizeOf(context);
controller.forward();
return Transform.translate(
offset: switch (widget.direction) {
FadeDirection.ltr => Offset(inAnimation.value, 0),
FadeDirection.rtl => Offset(size.width - inAnimation.value, 0),
FadeDirection.ttb => Offset(0, inAnimation.value),
FadeDirection.btt => Offset(0, 0 - inAnimation.value),
},
child: Opacity(
opacity: opacityAnimation.value,
child: widget.child,
),
);
}

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

Conclusion:

In the article, I have explained the Custom Fade-In Slide In Flutter; you can modify this code according to your choice. This was a small introduction to the Custom Fade-In Slide 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 Custom Fade-In Slide in your Flutter projects. We will show you what the Introduction is. Make a demo program for working on the Custom Fade-In Slide 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 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 Facebook, GitHub, Twitter, and LinkedIn.

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

Related: Explore Exception Handling In Flutter

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


What Is Test Documentation In Flutter

0

Hi everyone! today we learn about What Is Test Documentation In Flutter. Testing documentation involves the documentation of artifacts that should be developed before or during the testing of Software. Documentation for software testing helps in estimating the testing effort required, test coverage, requirement tracking/tracing, etc. For more please go through the below content.

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 Test Documentation?

Why Test Formality?

Examples of Test Documentation

Best practice to Achieve Test Documentation

Advantages of Test Documentation

Disadvantages of Test Documentation

Summary

Conclusion


What is Test Documentation?

Test documentation is documentation of artifacts created before or during the testing of software. It helps the testing team estimate the testing effort needed, test coverage, resource tracking, execution progress, etc.

It is a complete suite of documents that allows you to describe and document test planning, test design, test execution, and test results that are drawn from the testing activity.

Why Test Formality?

For a newbie, it’s easy to assume that Testing is executing the various section of code on an ad-hoc basis and verifying the results. But in the real world, Testing is a very formal activity and is documented in detail. Test Documentation makes planning, review, and execution of testing easy as well as verifiable.

The degree of test formality depends on

  • The type of application under test
  • Standards followed by your organization
  • The maturity of the development process.

Testing activities generally consume 30% to 50% of software development project effort. Documentations help to identify Test process improvements that can be applied to future projects.

Examples of Test Documentation:

Here, are important Types of Test Documentation:

  • > Test policy:- It is a high-level document that describes principles, methods, and all the important testing goals of the organization.
  • > Test strategy:- A high-level document that identifies the Test Levels (types) to be executed for the project.
  • > Test plan:- A test plan is a complete planning document that contains the scope, approach, resources, schedule, etc. of testing activities.
  • > Requirements Traceability Matrix:- This is a document that connects the requirements to the test cases.
  • > Test Scenario:- Test scenario is an item or event of a software system that could be verified by one or more Test cases.
  • > Test case:- It is a group of input values, execution preconditions, expected execution postconditions, and results. It is developed for a Test Scenario.
  • > Test Data:- Test Data is data that exists before a test is executed. It is used to execute the test case.
  • > Defect Report:- Defect report is a documented report of any flaw in a Software System that fails to perform its expected function.
  • > Test summary report:- Test summary report is a high-level document that summarizes testing activities conducted as well as the test result.

Best practice to Achieve Test Documentation:

  • QA team needs to be involved in the initial phase of the project so that Test Documentation is created in parallel
  • Don’t just create and leave the document, but update it whenever required
  • Use version control to manage and track your documents
  • Try to document what is needed for you to understand your work and what you will need to produce to your stakeholders
  • You should use a standard template for documentation like an excel sheet or doc file
  • Store all your project-related documents at a single location. It should be accessible to every team member for reference as well as to update when needed
  • Not providing enough detail is also a common mistake while creating a test document

Advantages of Test Documentation:

  • The main reason behind creating test documentation is to either reduce or remove any uncertainties about the testing activities. Helps you to remove ambiguity which often arises when it comes to the allocation of tasks
  • Documentation not only offers a systematic approach to software testing, but it also acts as training material for freshers in the software testing process
  • It is also a good marketing & sales strategy to showcase Test Documentation to exhibit a mature testing process
  • Test documentation helps you to offer a quality product to the client within specific time limits
  • In Software Engineering, Test Documentation also helps to configure or set up the program through the configuration document and operator manuals
  • Test documentation helps you to improve transparency with the client

Disadvantages of Test Documentation:

  • The cost of the documentation may surpass its value as it is very time-consuming
  • Many times, it is written by people who can’t write well or who don’t know the material
  • Keeping track of changes requested by the client and updating corresponding documents is tiring.
  • Poor documentation directly reflects the quality of the product as a misunderstanding between the client and the organization can occur

Summary:

  • Test documentation is documentation of artifacts created before or during the testing of software.
  • The degree of test formality depends on 1) the type of application under test 2) the standards followed by your organization 3) the maturity of the development process.
  • Important types of Test Documents are Test policy, Test strategy, Test plan, Test case, etc.
  • QA team needs to be involved in the initial phase of the project so that Test Documentation is created in parallel
  • The main reason behind creating test documentation is to either reduce or remove any uncertainties about the testing activities.
  • The cost of the documentation may surpass its value as it is very time-consuming

Conclusion :

Testing without documentation makes it difficult to see the complete picture of the project. Unless you have clear objectives, a step-by-step plan to achieve them, and all the important conditions specified in a document, an outcome remains blurry.

Software testing documentation is usually essential during the project development/testing process. So, wherever feasible, keep everything documented. Do not rely completely on verbal communication. Always err on the side of caution.

❤ ❤ 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 Facebook, GitHub, Twitter, and LinkedIn.

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

Related: SMS Using Twilio In Flutter

Related: Using SharedPreferences in Flutter

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

What Is Test Environment for Software Testing In Flutter

0

Hi everyone! today we learn about What Is Test Environment for Software Testing In Flutter. A Test environment is where the testing teams analyze the quality of the application/program. This also allows computer programmers to identify and fix any bugs that may impact the smooth functioning of the application or impair user experience. Let’s learn in more detail.

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


Table Of Contents::

What is a Test Environment?

Key areas to set up in Test Environment

Process of Software Test environment setup

Test Environment Management

Test Environment Checklist

Challenges in setting up Test Environment Management

Best practices for setting up a Test Environment Management

What is Test Bed in Software Testing?

Summary

Conclusion


What is a Test Environment?

A testing environment is a setup of software and hardware for the testing teams to execute test cases. In other words, it supports test execution with hardware, software and network configured.

The testbed or test environment is configured as per the need of the Application Under Test. On a few occasions, the test bed could be the combination of the test environment and the test data it operates.

Setting up the right test environment ensures software testing success. Any flaws in this process may lead to extra costs and time for the client.

Key areas to set up in Test Environment:

For the test environment, a key area to set up includes

  • System and applications
  • Test data
  • Database server
  • Front-end running environment
  • Client operating system
  • Browser
  • Hardware includes Server Operating system
  • Network
  • Documentation required like reference documents/configuration guides/installation guides/ user manuals

Process of Software Test environment setup:

Tests are limited to what can be tested and what not should be tested.

The following people are involved in the test environment setup

  • System Admins,
  • Developers
  • Testers
  • Sometimes users or techies with an affinity for testing.

The test environment requires setting up of various number of distinct areas like,

  • > Setup of Test Server:

Every test may not be executed on a local machine. It may need to establish a test server, which can support applications.

For example, Fedora is set up for PHP, Java-based applications with or without mail servers, crone setup, Java-based applications, etc.

  • > Network:

Network set up as per the test requirement. It includes,

  • Internet setup
  • LAN WIFI setup
  • Private network setup

It ensures that the congestion that occurs during testing doesn’t affect other members. (Developers, designers, content writers, etc.)

  • > Test PC setup:

For web testing, you may need to set up different browsers for different testers. For desktop applications, you need various types of OS for different testers’ PCs.

For example, windows phone app testing may require

  • Visual Studio installation
  • Windows phone emulator
  • Alternatively, assign a windows phone to the tester.
  • > Bug Reporting:

Bug reporting tools should be provided to testers.

  • > Creating Test Data for the Test Environment:

Many companies use a separate test environment to test the software product. The common approach used is to copy production data to test. This helps the tester, to detect the same issues as a live production server, without corrupting the production data.

The approach for copying production data to test data includes,

  • Set up production jobs to copy the data to a common test environment
  • All PII (Personally Identifiable Information) is modified along with other sensitive data. The PII is replaced with logically correct, but non-personal data.
  • Remove data that is irrelevant to your test.

Testers or developers can copy this to their test environments. They can modify it as per their requirement.

Privacy is the main issue in copy production data. To overcome privacy issues you should look into obfuscated and anonymized test data.

For the Anonymization of data two approaches can be used,

  • BlackList: In this approach, all the data fields are left unchanged. Except those fields specified by the users.
  • WhiteList: By default, this approach, anonymizes all data fields. Except for a list of fields that are allowed to be copied. A whitelisted field implies that it is okay to copy the data as it is and anonymization is not required.

Also, if you are using production data, you need to be smart about how to source data. Querying the database using SQL script is an effective approach.

Test Environment Management:

Test Environment Management deals with the maintenance and upkeep of the test bed.

A list of activities by the Test environment management function includes,

  1. Maintenance of a central repository with all the updated versions of test environments.
  2. Test environment management as per the test team’s demands.
  3. As per the new requirements creating new environments
  4. Monitoring of the environments
  5. Updating/deleting outdated test-environments
  6. Investigation of issues in the environment
  7. Coordination till an issue resolution.

Test Environment Checklist:

Besides these, there are a few more questions to answer before setting up the test environment.

  • Whether to develop an internal Test Environment or to outsource?
  • Whether to follow an internal company standard or follow any External (IEE, ISO, etc.)?
  • How long the test environment is required?
  • Differences between the test and production systems and their impact on test validity must be determined.
  • Can you re-use an existing setup for other projects in the company?

Challenges in setting up Test Environment Management:

  1. Proper planning on resource usage Ineffective planning for resource usage can affect the actual output. Also, it may lead to conflict between teams.
  2. Remote environment It is possible that a Test environment is located geographically apart. In such a case, the testing team has to rely on the support team for various test assets. (Software, hardware, and other issues).
  3. Elaborate setup time Sometimes test setup gets too elaborated in cases of Integration Testing.
  4. Shared usage by teams If the testing environment is used by development & testing teams simultaneously, test results will be corrupted.
  5. Complex test configuration Certain test requires complex test environment configuration. It may pose a challenge to the test team.

Best practices for setting up a Test Environment Management:

  1. Understand the test requirements thoroughly and educate the test team members.
  2. Connectivity should be checked before the initiation of the testing
  3. Check for the required hardware and software, licenses
  4. Browsers and versions
  5. Planning out the Scheduled use of the test environment.
  6. Automation tools and their configurations.

What is Test Bed in Software Testing?

A Test Bed in Software Testing is a software development environment. It allows developers to test their modules without affecting the live production servers. The testbed is not only confined to developers but is also used by testers. It is referred to as a test environment for rigorous and transparent testing of new technologies.

Summary:

  • A testing environment is a setup of software and hardware on which the test team will conduct the testing
  • For the test environment, a key area to set up includes
  • System and applications
  • Test data
  • Database server
  • Front-end running environment, etc.
  • Few challenges while setting up a test environment include,
  • Remote environment
  • Combined usage between teams
  • Elaborate setup time
  • Ineffective planning for resource usage for integration
  • Complex test configuration

Conclusion:

If you are into the test environment, hoping that this article helped you in the field of the test environment. The most important usage of the test environment is it enables testers to modify data without affecting any real-time information.

❤ ❤ 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 Facebook, GitHub, Twitter, and LinkedIn.

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

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

Test Plan Template: Sample Document with Web Application In Flutter

0

Hi everyone! today we learn about the What Is Test Plan Template. Test Plan Template is a detailed document that describes the test strategy, objectives, schedule, estimation and deliverables, and resources required for testing. A test Plan helps us determine the effort needed to validate the quality of the application under test. Let’s start in a detailed way.

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


Table Of Contents::

What is a test plan template?

Sample Test Plan Document Banking Web Application Example

Process of Software Test environment setup

Conclusion


What is a test plan template?

Test Plan Template is a detailed document that describes the test strategy, objectives, schedule, estimation and deliverables, and resources required for testing. A test Plan helps us determine the effort needed to validate the quality of the application under test. The test plan serves as a blueprint to conduct software testing activities as a defined process that is minutely monitored and controlled by the test manager.

Creating a Test Plan is mandatory to ensure the success of your Software testing project. If you are new to Test Planning refer to this tutorial on How to Create a Test Plan.

1) Introduction:

Brief introduction of the test strategies, process, workflow, and methodologies used for the project.

1.1) Scope

1.1.1) In Scope

Scope defines the features and functional or non-functional requirements of the software that will be tested.

1.1.2) Out of Scope

Out Of Scope defines the features and functional or non-functional requirements of the software that will NOT be tested.

1.2) Quality Objective

Here make a mention of the overall objective that you plan to achieve with your manual testing and automation testing.

Some objectives of your testing project could be

  • Ensure the Application Under Test conforms to functional and non-functional requirements
  • Ensure the AUT meets the quality specifications defined by the client
  • Bugs/issues are identified and fixed before going live

1.3) Roles and Responsibilities

A detailed description of the Roles and responsibilities of different team members like

  • QA Analyst
  • Test Manager
  • Configuration Manager
  • Developers
  • Installation Team

Amongst others

2) Test Methodology:

2.1) Overview

Mention the reason for adopting a particular test methodology for the project. The test methodology selected for the project could be

  • Waterfall
  • Iterative
  • Agile
  • Extreme Programming

The methodology selected depends on multiple factors.

2.2) Test Levels

Test Levels define the Types of Testing to be executed on the Application Under Test (AUT). The Testing Levels primarily depend on the scope of the project, and time and budget constraints.

2.3) Bug Triage

The goal of the triage is to

  • To define the type of resolution for each bug
  • To prioritize bugs and determine a schedule for all “To Be Fixed Bugs’.

2.4) Suspension Criteria and Resumption Requirements

Suspension criteria define the criteria to be used to suspend all or part of the testing procedure while Resumption criteria determine when testing can resume after it has been suspended

2.5) Test Completeness

Here you define the criteria that will deem your testing complete.

For instance, a few criteria to check Test Completeness would be

  • 100% test coverage
  • All Manual & Automated Test cases executed
  • All open bugs are fixed or will be fixed in the next release

3) Test Deliverables:

Here mention all the Test Artifacts that will be delivered during different phases of the testing lifecycle.

Here are the simple deliverables

  • Test Plan
  • Test Cases
  • Requirement Traceability Matrix
  • Bug Reports
  • Test Strategy
  • Test Metrics
  • Customer Sign Off

4) Resource & Environment Needs:

4.1) Testing Tools

Make a list of Tools like

  • Requirements Tracking Tool
  • Bug Tracking Tool
  • Automation Tools

Required to test the project

4.2) Test Environment

It mentions the minimum hardware requirements that will be used to test the Application.

The following software’s are required in addition to client-specific software.

  • Windows 8 and above
  • Office 2013 and above
  • MS Exchange, etc.

5) Terms/Acronyms:

Make a mention of any terms used in the project.

API: Application Program Interface

AUT: Application Under Test

Sample Test Plan Document Banking Web Application Example:

1) Introduction:

The Test Plan is designed to prescribe the scope, approach, resources, and schedule of all testing activities of the project Guru99 Bank.

The plan identified the items to be tested, the features to be tested, the types of testing to be performed, the personnel responsible for testing, the resources and schedule required to complete testing, and the risks associated with the plan.

1.1 Scope

1.1.1 In Scope

All the features of websiteGuru99 Bank which were defined in software requirement specs need to be tested

1.1.2 Out of Scope

These features are not tested because they are not included in the software requirement specs

  • User Interfaces
  • Hardware Interfaces
  • Software Interfaces
  • Database logical
  • Communications Interfaces
  • Website Security and Performance

1.2 Quality Objective:

The test objectives are to verify the functionality of the website Guru99 Bank, the project should focus on testing banking operations such as Account Management, Withdrawal, Balance…etc. to guarantee all these operations can work normally in the real business environment.

1.3 Roles and Responsibilities:

The project should use outsourced members as the tester to save the project cost.

2) Test Methodology:

2.1 Overview

2.2 Test Levels

In the project Guru99 Bank, 3 types of testing should be conducted.

  • Integration Testing (Individual software modules are combined and tested as a group)
  • System Testing: Conducted on a complete, integrated system to evaluate the system’s compliance with its specified requirements
  • API testing: Test all the APIs create for the software under tested

2.3 Bug Triage

2.4 Suspension Criteria and Resumption Requirements

If the team members report that there are 40% of test cases failed, suspend testing until the development team fixes all the failed cases.

2.5 Test Completeness

  • Specifies the criteria that denote successful completion of a test phase
  • The run rate is mandatory to be 100% unless a clear reason is given.
  • The pass rate is 80%, achieving the pass rate is mandatory

2.6 Project task and estimation and schedule

Schedule to complete these tasks

3 )Test Deliverables:

Test deliverables are provided as below

Before testing phase

  • Test plans document.
  • Test cases documents
  • Test Design specifications.

During the testing

– Test Tool Simulators.

– Test Data

– Test Traceability Matrix — Error logs and execution logs.

After the testing cycle is over

  • Test Results/reports
  • Defect Report
  • Installation/ Test procedures guidelines
  • Release notes

4 Resource & Environment Needs:

4.1 Testing Tools

4.2 Test Environment

Test Environment to be set up as per figure below:

What Is Test Environment for Software Testing In Flutter
A Test environment is where the testing teams analyze the quality of the application/program. This also allows computer…medium.flutterdevs.com

Conclusion:

Test plan document as a project plan for your testing process. This means that the test plan conveys how testing will be performed at a particular level (such as system testing or user acceptance testing), or for a particular type of testing (such as performance testing or security testing).

This includes the purpose of the Test Plan i.e. scope, approach, resources, and schedule of the testing activities. To identify the items being tested features to be tested, testing tasks to be performed, personnel responsible for each task, the risks associated with this plan, etc.

❤ ❤ 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 Facebook, GitHub, Twitter, and LinkedIn.

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

Related: Developing Web Apps Using Flutter

Related: Flutter App for Desktop

Related: Cupertino (iOS-style) ActionSheet in Flutter | Know Your Widgets

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