Hi everyone! today we learn about Module Testing In Flutter. Module testing is a type of software testing where individual units or components of the software are tested.
The purpose of module testing is to isolate a section of code and verify its correctness. Module testing is usually performed by the development team during the early stages of software development.
Module testing is defined as a software testing type, which checks individual subprograms, subroutines, classes, or procedures in a program. Instead of testing the whole software program at once, module testing recommends testing the smaller building blocks of the program.
Module testing is largely white-box oriented. The objective of doing Module, testing is not to demonstrate the proper functioning of the module but to demonstrate the presence of an error in the module.
Module-level testing allows to implementation of parallelism into the testing process by allowing the testing of multiple modules simultaneously.
Why does Module Testing:
Module Testing is recommended because
The probability of identifying errors or bugs in smaller chunks of the program becomes higher
Multiple modules can be tested simultaneously and hence supports parallel testing
The complexity of testing can be easily managed
How to do Module Testing?
For Module Testing, designing a Test Case is an important segment. While designing test cases for a module test, a tester has to consider two things.
Specification for the module
The module’s source code
Analyze the module’s logic by using one or more of the white box methods, and then supplement these test cases by applying black box methods to the modules specification
Once the test case is designed, the next step is to combine the module for testing. For this, the method used is either an Incremental or non-Incremental method.
Non-incremental method- all modules are tested independently. First, it combines all modules and then tests the whole program
Incremental method- each module is tested first and then gradually incremented to the tested collection. It does a step-wise retesting
In incremental Testing, there are two approaches — Top down and Bottom Up Testing
Execute the module with the selected data, requires a driver for supplying the test data, monitoring the execution, and capturing the results
Example Tips for Module Testing:
Here are a few tips to consider before performing Module Testing
Review test cases before using
Avoid confusion over the source of discrepancies
Use Automated Test tools
Examine variables that should be unchanged
To avoid self-tests swap modules
Re-use the test cases
Unit Testing vs Module Testing:
> Unit Testing:
Unit tests are a collection of tests written by a developer during the software development process
might be testing units in isolation
> Module Testing:
Module tests are a collection of tests written by a tester after some code has been written by a developer
Module testing might involve combining the unit’s test
Challenges in Module Testing:
So here we go with the top challenges in Module Testing
Non-incremental testing requires more work
Misunderstanding test doubles
Debugging test often
Need to understand the code
Conclusion:
In Software Engineering, Module testing (unit testing) is a process of testing the individual subprograms, subroutines, classes, or procedures in a program
The advantage of Module testing is that the probability of identifying errors or bugs in smaller chunks of the program becomes higher
For module testing method used is either an Incremental or non-Incremental method.
❤ ❤ Thanks for reading this article ❤❤
If I got something wrong? Let me know in the comments. I would love to improve.
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 fromFlutterDevs.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.
Wewelcome 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.
Cloud computing has become increasingly important in recent years because it allows for a wide range of tasks to be performed by programs. Web developers use various tools and languages to create impressive applications, making developer expertise essential in web and mobile app development. There are many options available in the field of cloud computing, including the ability to install and scale web and mobile apps, as well as monitor them. In recent years, there have been significant advancements in web and mobile development, and modern apps have more powerful capabilities. However, running a web or mobile app requires more than a hosting provider. Companies like Amazon and Google offer comprehensive solutions in this industry. An increasing number of developers and businesses are choosing serverless architectures, and in this article, I will compare Firebase and AWS to help your web development team determine the best option for your app.
Amazon Web Services (AWS) is a cloud computing platform that provides a wide range of services such as computing, storage, networking, database, analytics, machine learning, security, and application development. These services are designed to be highly scalable, flexible, and secure, and are delivered over the internet (the cloud) to businesses of all sizes, startups, and government agencies around the world.
AWS is a pay-as-you-go service, which means that you only pay for the services you use and there is no upfront cost or long-term commitment. You can easily scale up or down the resources you use depending on your needs, and you only pay for what you use. This makes AWS a cost-effective and flexible solution for businesses that need to access a wide range of computing resources.
Some of the popular services offered by AWS include Amazon EC2 (virtual servers in the cloud), Amazon S3 (object storage), Amazon RDS (managed relational databases), Amazon Lambda (serverless computing), and Amazon EKS (managed Kubernetes). AWS also offers a variety of tools and services for building, deploying, and managing applications, such as AWS CodePipeline, AWS CodeBuild, AWS CodeDeploy, and AWS CodeStar.
In addition to these core services, AWS also offers a range of services for networking, analytics, machine learning, security, and more. These services are designed to help businesses build, deploy, and run their applications and workloads in the cloud.
Merits of AWS:
Cost-effective: AWS offers a pay-as-you-go pricing model, which means you only pay for the services you use. This can be more cost-effective than buying and maintaining your hardware and infrastructure.
Scalability: AWS resources can be easily scaled up or down to meet changing demands, so you can quickly and easily allocate more resources as needed.
Reliability: AWS has a global infrastructure that is designed for high availability and can handle large amounts of traffic.
Security: AWS provides a wide range of security tools and features to help protect your data and applications, including encryption, identity and access management, and network security.
Flexibility: AWS offers a wide range of services and tools that can be easily integrated with your existing systems and applications.
Innovation: AWS is constantly introducing new services and features, which can help you stay up to date with the latest technologies and best practices.
Global presence: AWS has data centers located around the world, which means you can easily deploy your applications and services in multiple regions to provide low latency and high availability to your users.
Merits of AWS over Firebase:
Wide range of services: AWS offers a much wider range of services than Firebase, including computing, storage, networking, database, analytics, machine learning, security, and application development. This makes AWS a more comprehensive and flexible platform for building and deploying applications.
Customization: AWS allows you to customize and configure the resources you use, such as the operating system, network settings, and security policies. This can be useful if you have specific requirements or need to integrate with existing systems.
Integration with other AWS services: AWS integrates with a wide range of other AWS services, such as Amazon S3, Amazon RDS, and Amazon EKS, which can be useful for building more complex and scalable applications.
Greater control: With AWS, you have more control over the resources you use and how you use them. For example, you can choose which data centers to use, how to scale your resources, and how to manage access to your resources.
More mature platform: AWS has been around longer than Firebase and has a larger user base, which can make it easier to find documentation, community support, and third-party tools and services.
Demerits of AWS:
Cost: While AWS can be cost-effective compared to running your infrastructure, it can still be expensive, especially if you are using a large number of resources or if you have a lot of traffic.
Complexity: AWS has a large number of services and features, which can be overwhelming for new users. It can take time to learn how to use all of these services and to configure them to meet your needs.
Maintenance: While AWS takes care of the underlying infrastructure, you are still responsible for maintaining and managing the resources you use, such as installing patches and updates, and backing up your data.
Dependence on internet connectivity: AWS is a cloud-based platform, which means you need an internet connection to access your resources. This can be an issue if you are building applications that need to work offline or in low-connectivity environments.
Limited control: While AWS provides a lot of customization options, there are still some limits to what you can do. For example, you cannot directly control the underlying hardware or infrastructure, and you are subject to the terms of service and policies set by AWS.
Firebase:
Firebase has evolved from a Mobile-Backend-as-a-Service (MBaaS) platform into a comprehensive backend solution for mobile and web app development. Its services and tools allow you to quickly develop high-quality mobile and web apps without starting from scratch. Firebase is a collection of tools and software development kits (SDKs) that enable you to build, maintain, improve, and expand your apps across various mobile app development platforms, including web, iOS, and Android. Google Firebase also offers features such as file storage, analytics, identity authentication, real-time database, failure analytics, cloud storage, and push messaging. These services are generally hosted in the cloud. Firebase is a convenient cloud computing service that enables developers to connect their apps to APIs and backend cloud storage used by backend applications. Interestingly, Firebase was built on top of Google’s infrastructure. It provides SDKs for iOS, Android, and the web, making it particularly useful for front-end developers who want to build an app quickly without any backend expertise. You can also use a REST API to create a custom API.
Merits of Firebase:
Efficient Identity Verification and System Security : Google Firebase is a platform that offers complete protection for your systems through a range of security measures, including Google Sign-in, Chrome Password Manager, and Smart Lock. With these tools, Firebase ensures that your systems are secure and that user identities are verified and protected. Additionally, Firebase simplifies the sign-in process by providing a cross-platform identity solution that covers the entire spectrum of user authentication. Overall, Firebase is a reliable and comprehensive platform for securing and managing user identities.
Integrated Cloud Storage Solutions: Google Firebase provides a cloud storage solution that is optimized for fast and reliable uploads and downloads. It is designed to handle large volumes of user-generated content and offers easy access management options. With Firebase’s cloud storage, you can store, retrieve, and access your data quickly and efficiently, without worrying about data transfer speeds or access controls. Additionally, Firebase’s cloud storage is fully integrated with the rest of the Firebase platform, making it easy to use and manage alongside other Firebase features.
Streamlined Authentication Process: Google Firebase is a platform that allows developers to easily and quickly set up their authentication systems without the need for extensive coding. The platform provides a range of tools and resources that make it easy to implement authentication protocols and ensure the security of your application. With Firebase, you can set up your authentication system in a matter of minutes, saving you time and resources and allowing you to focus on other aspects of app development. Overall, Firebase is a powerful and efficient tool for managing and securing your authentication system.
Collaborative App Development with Firebase’s Real-Time Database: Firebase is a cloud-hosted NoSQL database that allows for the storage and synchronization of data in real time. This feature enables developers to access app data from any device and build powerful collaborative capabilities within their applications. Additionally, Firebase’s real-time database can be used to trigger the execution of backend code in response to events occurring within the database. This can be particularly useful for implementing real-time updates or automating tasks based on database activity.
Optimizing User Engagement with Firebase’s Device Tracking and BigQuery Integration Firebase is a platform that provides tools for tracking a user’s activity across multiple devices, including desktop computers, web browsers, mobile phones, and tablets. With Firebase, you can easily see how users interact with your app on different devices and make informed decisions about your app’s design and functionality. Additionally, Firebase includes features that make it easier to export data from Google Analytics to BigQuery, which can be useful for developers looking to better understand their users and engage more effectively with their audience.
Merits of Firebase over AWS:
Ease of use: Firebase offers a simple and intuitive interface that makes it easy for developers to get started quickly. It also provides a variety of ready-to-use features and integrations that can be easily added to a project.
Real-time updates: Firebase allows developers to build real-time applications that can update data in real-time across all connected clients. This can be especially useful for applications that require fast, bidirectional communication, such as chat or gaming applications.
Pricing: Firebase offers a flexible pricing model that allows developers to pay only for the resources they use. This can be more cost-effective than some of the fixed-price options offered by AWS.
Integration with Google Cloud Platform: Firebase is fully integrated with the Google Cloud Platform, which means developers can use other Google services, such as BigQuery and Cloud Functions, in conjunction with Firebase.
Demerits of Firebase:
Limited control: Firebase is a managed service, which means that developers do not have full control over the underlying infrastructure. This can make it more difficult to customize the platform to fit specific needs.
Limited scalability: Firebase is designed to be easy to use and get started with, but it may not be the most scalable option for very large applications. Developers may need to consider other options, such as AWS if they need to scale to millions of users.
Lack of support for certain workloads: Firebase is not suitable for all types of workloads. For example, it does not offer support for batch processing or high-performance computing.
Vendor lock-in: Firebase is a proprietary platform, which means that developers are locked into using Google’s services. This can make it more difficult to switch to a different platform in the future if the need arises.
Comparison between Firebase and AWS:
Services Firebase: Firebase provides several tools and services for building, scaling, and managing applications, including a real-time database, cloud storage, authentication, hosting, analytics, and push notifications. AWS: AWS offers a much wider range of services, including computing, storage, networking, database, analytics, machine learning, security, and application development.
Customization Firebase: Firebase provides some customization options, such as the ability to customize the database rules and the ability to add custom domains to your hosting site. AWS: AWS allows you to customize and configure the resources you use, such as the operating system, network settings, and security policies.
Integration Firebase: Firebase integrates with other Google services, such as AdMob and Google Ads, which can be useful for monetizing and marketing your application. AWS: AWS integrates with a wide range of other AWS services, such as Amazon S3, Amazon RDS, and Amazon EKS, which can be useful for building more complex and scalable applications.
Control Firebase: Firebase provides several tools and features to help you manage and monitor your application, but you have limited control over the underlying infrastructure. AWS: With AWS, you have more control over the resources you use and how you use them. You can choose which data centers to use, how to scale your resources, and how to manage access to your resources.
Cost Firebase: Firebase is generally less expensive than AWS, especially for small applications. However, as your usage increases, the cost can start to become comparable to AWS. AWS: AWS is a pay-as-you-go service, which means you only pay for the resources you use. This can be more cost-effective than buying and maintaining your hardware and infrastructure, but it can still be expensive, especially if you are using a large number of resources or if you have a lot of traffic.
Learning curve Firebase: Firebase has a relatively shallow learning curve, with intuitive tools and features that are easy to use and get started with. AWS: AWS has a steeper learning curve, with a large number of services and features that can be overwhelming for new users. It can take time to learn how to use all of these services and to configure them to meet your needs.
Conclusion: Firebase or AWS, what to choose?
As already said above, Firebase is a managed service that offers a simple and intuitive interface, making it easy for developers to get started quickly. It is well-suited for real-time applications that require fast, bidirectional communication, such as chat or gaming apps. Firebase also offers a flexible pricing model and is fully integrated with the Google Cloud Platform, allowing developers to use other Google services in conjunction with Firebase.
However, Firebase has some limitations to be aware of. It does not offer full control over the underlying infrastructure, so it may not be as customizable as some other platforms. It may not be the most scalable option for very large applications and does not support certain types of workloads, such as batch processing or high-performance computing. In addition, Firebase is a proprietary platform, which means that developers are locked into using Google’s services and may have difficulty switching to a different platform in the future.
On the other hand, AWS is a comprehensive cloud computing platform that offers a wide range of services and robust infrastructure. It is highly scalable and can support millions of users. AWS is also well-suited for a variety of workloads, including batch processing and high-performance computing. However, it may be more complex to set up and use than Firebase, and it may have higher upfront costs due to its fixed-price pricing model.
Ultimately, the best choice will depend on your specific needs and requirements. It is important to carefully evaluate your options and consider consulting with a cloud computing expert to help you make the right decision.
Thanks for reading this article. If I got something wrong? Let me know in the comments. I would love to improve.
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 fromFlutterDevs.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.
Wewelcome 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.
A parallax scrolling effect is attained by pushing the background image very slightly toward the opposite direction of the whole list. Let’s know more about it.
Parallax scrolling is a website technique where we make our background move at a little slower pace than the foreground we make. This is a 3D effect as the user scrolls down the site, putting in a sense of depth and forming a more mesmeric experience while browsing.
Our eyes recognize objects close to us comparatively larger than those far away from our eyes. We perceive distant objects as if they are moving very slowly. Parallax bounds the same idea as human eyes which is a so-called optical illusion.
Flutter makes it very easy to implement the parallax effect in our apps by using a few widgets, such as Stack, Positioned, etc. We’re going to use Stack and Positioned widget in the demo project below. With the help of flutter widgets here we quickly can implement parallax scrolling.
What is a Stack widget?
It is a widget in Flutter SDK which allows us to make layers of widgets by putting one over the other.
This class is significant if you want to overlap several children simply. It is like putting objects in a single bucket one after the other(First goes in, last comes out). Similarly, if we assemble the same example pattern in a flutter, we could imagine having a few texts and an image, overlaid with a gradient and an elevated button attached at the bottom.
It gets mixed very smoothly and makes the UI much more interactive than before.
We’re also using the Positioned widget in this. Positioned widget is a widget that controls where a child of a Stack widget is going to be positioned. For example :
Here Positioned widget is for setting the fixed position of the child, i.e., the ClipRRect widget. For this, we’d be using named parameters such as top, bottom, left, right, etc. In the above example, bottom: 20 and left: 20 parameters are being used which means the child widget will be positioned this much distance from the left and bottom of the stack. Then the other parameters will occupy the rest of the distance (from top and right).
In the further demo project, we’ll be dealing with ListViewwidgetas our Scrollable. ListView widget is the most commonly used ScrollView widget where its children get displayed one after another in the scroll direction.
Role of ListView in our demo:
In our project, the ListView widget that has a child of a Container widget is going to be responsible to form the background for all the further children of Stack
Here ParallaxText() is a constructor of a Custom widget made for the arrangement of texts over the screen(as they internally contain Positioned widgets). Similarly, the ParallaxImage() is a constructor of a Custom widget that will be responsible for the arrangement of Images over the screen.
ParallaxText.dart
class ParallaxText extends StatelessWidget{
const ParallaxText({
Key? key,
required this.left,
required this.top,
required this.text,
required this.colour,
}) : super(key: key);
final double left;
final double top;
final String text;
final Color colour;
@override
Widget build(BuildContext context) {
return Positioned(
left: left,
top: top,
child: Text(text, style: TextStyle(color: colour, fontWeight: FontWeight.w900, fontSize: 60.0, fontFamily:"Helvetica")
),
);
}
}
Here, the Positioned widget helps its child to get positioned over the stack according to the parameters it’s receiving.
When we run the application, we ought to get the screen’s output like the underneath screen video.
Final Output
Conclusion:
In this article, we’ve learned how to display a list of parallax scrolling images/texts. Now you can try it in your project and make it more fun to work with.
❤ ❤ Thanks for reading this article ❤❤
If I got something wrong? Let me know in the comments. I would love to improve.
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 fromFlutterDevs.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.
Wewelcome 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.
The goal of the go_router package is to simplify the use of the Router in Flutter as specified by the MaterialApp.router constructor. By default, it requires an implementation of the Router Delegate and Route Information Parser classes. These two implementations themselves imply the definition of a custom type to hold the app state that drives the creation of the Navigator. You can read an excellent blog post on these requirements on Medium. This separation of responsibilities allows the Flutter developer to implement several routing and navigation policies at the cost of complexity.
Add Dependency:
Open the terminal in your Flutter project. Then run the following command to install the go_router package in your Flutter Project.$ flutter pub add go_router
or you will add this line to your package’s pubspec. ymal file and run “flutter pub get”
dependencies: go_router: ^6.0.1
Features:
GoRouter has many features:-
> Parsing path and query parameters using a template syntax (for example, “user/:id’).
> Displaying multiple screens for a destination (sub-routes).
> Redirection support — you can re-route the user to a different URL based on application state, for example to a sign-in when the user is not authenticated.
> Backwards compatibility with Navigator API
> Support for both Material and Cupertino apps
Implementation:
Hello Everyone…!!!! Today we learn about routing in the flutter application. To integrate go_router in your app first you have to add MaterialApp.router in the place of the MaterialApp. This constructor accepts many properties like routeInformationParser, routerDelegate, etc.
After that, we create an app_route_config.dart. In this file, we pass all the routes. First, we add the default route which is the home page. In routes, we add a name, path ad pageBuilder. After that, we create a route for the profile page in which we pass the userId and userName. And we also create GoRoute for the about page and contact us page.
And also add errorPageBuilder in which we return MaterialPage and pass ErrorPage as a child. and return the router. This is how we create the routes for navigators.
We also create the route constants for GoRouters. In which we pass all the routes as a string.
At last, we create the UI of the project and in the UI part, we also learn the go_router and how to navigate the UI. In-home. dart we return the scaffold and pass the appbar in which we pass the title. Pass the Column in the body and add the buttons by which we navigate from one screen to another screen.
We can navigate in many ways like push, pushNamed in which we pass the params like userName and UserId or we can directly pass the path of the route which we already defined in the route_config.dart file. This is how we use go_router. I hope you learn many things like how to create paths or routes and how to pass params easily.
In this article, we learn how to implement go_router in Flutter Application. We learn many things like how to create the config file and how to pass params to another screen and many things.
❤ 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 Navigate With GoRouter In Flutter:
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 fromFlutterDevs.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 Facebook, GitHub, Twitter, and LinkedIn.
Wewelcome 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.
These days we see several times that as we approach getting signed-in in many applications we need to verify our phone numbers. Although, we can do so in mainly two ways, either by making a phone call or by an OTP — sent as sms to our phone numbers.
So along with that, we have also noticed, that the OTP whichcomes with the sms got filled up automatically in the OTP fields which makes UI more user-friendly. Well, how does that happen? I’m going to answer the question with the help of this article along with my demo project.
In this session, we’d be using the most commonly used package for such purposes, that is sms_autofill.
Working with this package made it comparatively easier and faster to get my expected output. We just need to follow a few steps to make it work properly throughout our project which we’ll discuss later in this article.
To get the OTP sms, I’ve used Firebase Phone Authentication. To achieve that we first need to create a Firebase project in Firebase Console. Once you have created one, make sure that you enable the Phone sign-in method in the Authentication section.
Firebase Phone Authentication:-
Here’s how we do it:-
To know more, you may go to the Apple, Android, or web options according to the project environment in which you build the project. For me it was Android.
Save it as you enable it. It will look like this
Now firstly, we need to send an OTP sms to the entered mobile number.
Here, we’ll pass the phone number (fetched by the TextEditingController) to the phone argument of this function.
We used Future<String> as the return type because we are going to return the verification ID that we get during the process of sending OTP. Further, this verification ID will be needed in the OTP screen.
This is a snippet from the OtpScreen.dart where we are using the verification ID we extracted from CommonUtils.firebasePhoneAuth() method. Along with that, we pass our smsCodereceived. It then matches OTP which was sent and the OTP which is being passed in smsCodealong with the verification ID. If they match, we successfully will be authorized to get through the other page (HomeScreen.dart).
OTP Autofill:-
Now let’s get through the steps to implement otp-auto-filling
Import the latest version of the sms_autofill package in pubspec.yaml file
dependencies: sms_autofill: ^2.2.0
Go to >android >app >build.gradle file and change minSdkVersion from 16 to 19
defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.example.otp_autofill_demo" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. minSdkVersion 19 targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName }
Add listner listenForCode() method inside initState() method to listen otp sms as soon as possible.
Use the PinFieldAutoFill() widget as our OTP field. You can apply decoration to it to make it more attracting. I’ve used BoxLooseDecoration() constructor to decorate fields.
Override dispose() method to unregister stream listener. This is a very significant step as the stream should be closed once we’re done using it. Otherwise, we could face memory leakage problem.
As we run the application, this is what we get as our final output.
Conclusion:-
In this article, we’ve learned how to autofill OTP from OTP sms. Moreover, we also got to know about Firebase Phone Authentication and implemented it in the project.
❤ ❤ Thanks for reading this article ❤❤
If I got something wrong? Let me know in the comments. I would love to improve.
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 fromFlutterDevs.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.
Wewelcome 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.
The Flame Engine aims to provide a complete set of solutions for most of the common problems that games developer might face in the flutter environment.
This article will deliver a quality introduction to the Flutter Flame game engine. You’ll learn how to build a Flutter Flame game, load sprites, and add animations. In the further project, we shall talk about animations made with Flutter Flame.
Flutter is an open-source framework created by Google where we craft various attractive applications for the Android, iOS, web, etc platforms from a single code base. Flutteruses a client-optimized language called Dart that makes faster apps on any platform. It is a much easier approach than traditional methods.
Flutter makes it easy to develop beautiful, interactive, and user-friendly interfaces(UI). Although, Flutter is a framework that is used for both frontend and backend development. But because of its adorable performance in frontend developers mostly use Flutter for Frontend development.
The Flutter team is dedicated to providing the ability to all kinds of developers to build applications in a minimal amount of time and release them effortlessly. For instance, Game developers are now capable of crafting beautiful game apps without taking care of performance issues, load times, and app sizes problems.
Flame:
It is a 2D game engine by which we develop various 2D game applications that run on top of flutter. We get so many useful & amazing features of it such as
Game loop
A component/object system(Flame Component System(FCS))
Collision detection
Images, sprites, sprite sheets, and animations.
Input/gestures handling
General utilities that make development easier.
Installation:-
Initially, you need to install Flame to implement it in your project. For that, we need to add its package with the latest version of it in pubspec.yaml file:
dependencies: flame: ^1.6.0
Code Implementation:-
To attach a Game instance in our Flutter tree, we need to give the charge to the widget called GameWidget. Or in simpler words, we will wrap our game with GameWidget at initials.
Here Game() is the game instance that GameWidget() will render over the screen. “Game” extends the FlameGameclass.
class Game extends FlameGame with HasTappables { @override Future<void>? onLoad() { super.onLoad(); }
FlameGame is a more absolute and opinionated implementation of Game. Extending it makes the developer able to add his game logic or he can keep the logic in the child Component.
FlameGame is based on the Flame Component System (also called FCS). This is the base class mostly recommended to use for most games that are made with Flame.
Component:
Everything we see on top of the screen is all components. For instance, background image, all the characters/objects on the screen, etc.
All components get inherited from the abstract class Component directly or indirectly.
Every Component has a few methods that you can implement optionally while using FlameGame the class. If you are not using FlameGame, you can implement these methods on your game loop if you need.
Few generally used components:
PositionalComponent — This class represents a positioned object over the screen, which could be a floating rectangle or a rotating sprite.
SpriteAnimationComponent — This class is used to represent sprites containing Components that run in a single cyclic animation. I’ll be using it in the further project file for the animation making.
You can download sprite sheets and make your animation UI. Few are here.
Final Output:-
When we run the application, we ought to get the screen’s output like the underneath screen video.
As we click the DialogButton component, we are changing the sprite sheet limits from 0–11(running state) to 12–18(sitting state).
Conclusion:-
In this article, we’ve learned how to work will package flameto encounter animation in our application. We commonly use this package for developing 2D games but it’s indeed a good choice for the making of animations too in our applications.
❤ ❤ Thanks for reading this article ❤❤
If I got something wrong? Let me know in the comments. I would love to improve.
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 fromFlutterDevs.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.
Wewelcome 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.
State management is one of the most important aspects of app development. In a large and complex application, keeping track of the state of different widgets and managing the flow of data can quickly become a challenging task. This is where Redux comes in.
Redux is a state management library that is widely used in React and React Native applications. It is also a popular choice for state management in Flutter, a UI toolkit for building natively compiled applications for mobile, web, and desktop.
It provides a centralized store for storing the state of an application, and it follows the unidirectional data flow pattern. In Flutter, Redux can be used to manage the state of an application, making it easier to understand, maintain, and scale.
In this blog, we’ll explore how to integrate Redux into a Flutter application and understand the key concepts of Redux.
Redux is a predictable state management library that is based on the principles of Flux architecture. It is designed to make it easy to manage the state of an application in a centralized and consistent way. The core concepts of Redux are:
State:The state of an application is the data that changes over time, such as user data, API responses, or UI state.
Actions:Actions are events that are dispatched from the view layer to modify the state of the application. Actions have a type and can also have payload data.
Reducer:The reducer is a pure function that takes the current state and an action as inputs and returns the updated state. The reducer defines how the state should be updated based on the action type.
Store:The store is the central place where the state of the application is stored. The store is created by passing the reducer function to it.
By following these core concepts, Redux makes it easy to manage the state of an application consistently and predictably.
Why use Redux in Flutter?
Flutter provides a rich set of built-in widgets and tools for building complex UIs. However, as the size and complexity of a Flutter application grow, it becomes more challenging to manage the state of the application. This is where Redux comes in. By using Redux, you can centralize the state of your application and make it easier to manage.
Some of the benefits of using Redux in Flutter are:
Predictable state management: With Redux, the state of the application is managed in a centralized and consistent way. This makes it easier to understand how the state changes over time and debug any issues that may arise.
Scalability: As the size and complexity of a Flutter application grows, Redux makes it easier to manage the state of the application. By following the core concepts of Redux, you can quickly scale the state management of your application.
Reusable code:By centralizing the state of the application, you can write reusable code that can be shared across different parts of the application.
Easy to test:Because the reducer is a pure function, it is easy to write automated tests. This makes it easier to ensure that the state of the application is being updated correctly
Integrating Redux into a Flutter application:
In Flutter, there are several packages available for implementing Redux, such as flutter_reduxand redux_thunk. To get started with Redux in Flutter, you need to install the flutter_reduxpackage and create a store for your application.
dependencies: flutter_redux: ^7.0.0
The store is created using the createStore() function, which takes the initial state of the store and a reducer as arguments. The initial state is a plain Dart object, and the reducer is a Dart function that takes the store’s current state and action and returns the next state of the store.
Define your application state and action:
class AppState {
int counter;
AppState({this.counter = 0});
}
enum Actions { incrementCounter }
final store = Store<AppState>( appReducer, initialState: AppState(), );
Once the store is created, you can use the StoreProvider widget to provide the store to the rest of the application. The StoreProvider widget takes the store and a child widget as arguments, and it makes the store available to the child widget and all its descendants.
4. Use the StoreProvider widget to provide the store to your application:
In the child widget, you can use the StoreBuilder widget to access the state of the store. The StoreBuilder widget takes a builder function as an argument, which takes the store and returns a widget. The builder function is called whenever the state of the store changes, and it returns the updated UI.
5. Use the StoreBuilder widget to access the state of the store in a widget:
This example demonstrates a basic integration of Redux in a Flutter app. The example shows how to create the store, provide it to the application, access the state of the store, and dispatch actions to update the state.
Note: This is just a basic example to get you started with Redux in Flutter. You can extend and customize it to fit your needs.
Conclusion:
Redux is a powerful state management library that can simplify the state management of a Flutter application. By using Redux, you can keep the state of your application in a single store, and you can manage the flow of data using actions and reducers. With its simple approach, Redux can help you build large and complex Flutter applications with ease.
❤ ❤ Thanks for reading this article ❤❤
If I got something wrong? Let me know in the comments. I would love to improve.
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 fromFlutterDevs.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.
Wewelcome 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.
This blog will explore the Managing State in Flutter with the State Rebuilder Library: A Comprehensive Guide.We perceive how to execute a demo program. We will learn how to implement it in your flutter applications.
State management is one of the key concepts in developing any mobile application. It involves managing the data that affects your application’s UI and the UI itself. In Flutter, there are many ways to handle state management, including using the Scoped Model, Provider, BLoC, and many more. However, there is one lesser-known state management solution in Flutter, called the “State Rebuilder.”
State Rebuilder is a state management library in Flutter that is easy to learn and use, and it provides a simple, yet efficient, way to manage your application’s state. It was created to solve some of the problems associated with traditional state management techniques, such as complexity and code duplication. The library is designed to provide a simple and efficient way to manage the state of your application, making it an excellent choice for small to medium-sized applications.
Why Use State Rebuilder:
One of the key features of State Rebuilder is that it is built on top of streams, making it possible to use the reactive programming paradigm to manage your state. This means that whenever your state changes, the UI of your application will automatically update to reflect the changes, making it easier to develop and maintain your application. In addition, State Rebuilder provides a simple and efficient way to isolate your state management logic from your UI, making it easier to test and maintain your code.
Another advantage of using State Rebuilder is that it provides an easy way to manage a global state, which is a state that affects multiple parts of your application. With State Rebuilder, you can easily manage a global state by creating a single instance of the state management object, and then using it throughout your application. This makes it easy to manage the state of your application, and it eliminates the need for complex state management code.
Integrate State Rebuilder into your Flutter application:
Let’s imagine we want to build a simple counter application in Flutter. The application has a button that increments the counter value when it’s pressed. Here’s how we can use State Rebuilder to manage the state of our counter application:
First, we need to install the states_rebuilder library by adding the following line to our pubspec. yaml file.
dependencies: states_rebuilder: ^6.2.0
Next, we need to create a new instance of the StateRebuilderobject and pass in a function that returns the initial state of our application. In this case, the initial state is simply an integer with a value of 0.
Next, we can create a simple UI that displays the counter value and a button that increments the counter value when it’s pressed. To access the state from within our UI, we use the InheritedRebuilderwidget, and pass in the StateRebuilderobject as a parameter.
Now, whenever the button is pressed, the setStatemethod is called on the StateRebuilderobject. The setStatethe method takes a function as a parameter, which takes the current state as an argument and returns the new state. In this case, we simply increment the current state by 1.
And that’s it! We now have a working counter application that uses State Rebuilder to manage its state. By using State Rebuilder, we have separated our state management logic from our UI, making it easier to test and maintain our code.
Here’s the complete code for our counter application:
With this code, we now have a simple and clean implementation of state management in Flutter using the State Rebuilder library. By using State Rebuilder, we can separate our state management logic from our UI, making it easier to test and maintain our code.
Conclusion:
In conclusion, the State Rebuilder library is a powerful tool for state management in Flutter. It provides a clean and simple approach to managing state in your Flutter applications, allowing you to separate your state management logic from your UI.
With State Rebuilder, you can easily manage complex state interactions and make use of powerful features like state observation and state management via streams. Whether you are a seasoned Flutter developer or just starting the State Rebuilder library is worth considering for your next project.
❤ ❤ Thanks for reading this article ❤❤
If I got something wrong? Let me know in the comments. I would love to improve.
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 fromFlutterDevs.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.
Wewelcome 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.
Hello Everyone!!! Today we learn about Bloc V/S Cubit In Flutter Application. In this article, we cover topics like what is bloc. , what is a cubit and what’s the difference between a bloc and a cubit?
Flutter Bloc is one of the state management in a flutter. We can use it to handle all the states that we want to perform in our Flutter applications.
Bloc is the best and simple way to do state management. We can easily add any type of change to the Flutter application. You can easily learn the concept, no matter what’s your level. You can add this dependency to your project and use it.
Bloc is a design pattern created by Google to help separate business logic from the award layer and authorize a developer to exploit code more efficiently.
A state management library called Bloc was created and maintained by Felix Angelo. It assists developers utensil the Bloc design pattern in their Flutter application. It means that a developer must recognize the state of an app at some time. There should be something on the screen for every interplay with the app to let users know what the incident is incident.
what is a Cubit?
Cubit is a minimal version or a subset of the BLoC design pattern that simplifies the way we manage the state of an application. To do so, it substitutes the use of events (used in Bloc) with functions that rebuild the UI by emitting different states on a stream.
A Cubit is similar to a Bloc but has no notion of events and relies on methods to emit new states. Every Cubit requires an initial state which will be the state of the Cubit before emit has been called. The current state of a Cubit can be accessed via the state-getter.
Bloc VS Cubit:
The only difference is in the syntax of the emitting state. Where Cubit uses emit(event) syntax, State Notifier uses state = event. Bloc on the other hand relies on events instead of functions to get feedback from UI to Cubit. The major difference between Bloc and Cubit is, “Bloc is Event-Driven and Cubit is not Event-Driven”. In Bloc, we can override “onTransition” and check how these events are coming and how these states change. In Cubit, we call functions to send these states, with the help of these functions we can track the state. We use the “onChnaged” function in Cubit.
Add Dependency:
Open the terminal in your Flutter project. Then run the following command to install the flutter_bloc package in your Flutter Project.
$ flutter pub add flutter_bloc
or you will add this line to your package’s pubspec. ymal file and run “flutter pub get”
dependencies: flutter_bloc: ^8.1.2
Import it. Now in your Dart code, you can use:
import 'package:flutter_bloc/flutter_bloc.dart';
Implementation
First, we have to adddependency in pubspec.ymal file for getting all the properties of the bloc by which we can easily use it for state management.
For this demo first, we have to create a logic folder in which we create classes for cubit_logic and bloc_logic. So starts with bloc_logic. For bloc_logic we have to create two classes for counter_bloc and counter_event.
Counter_event.dart:–
abstract class CounterEvent{}
class CounterIncrementEvent extends CounterEvent{}
In this, we create a Counter-event which is used in counter_bloc, and also define the CounterIncrementEvent.
counter_bloc.dart:-
class CounterBloc extends Bloc<CounterEvent, CounterState>{
CounterBloc() : super(CounterInitState());
Stream<CounterState> mapEventToState(CounterEvent event) async*{
switch (event.runtimeType){
case CounterIncrementEvent:
int value = state.value;
value++;
yield CounterResultState(value);
break;
default:
}
}
}
First, we extend the class with Bloc in which we pass the event and state of the bloc. And create a stream with a state in which we pass the event that we want to perform in the application. For the event, we use a switch case.
home.dart:-
In the UI part, first, we have to define counterBloc.
CounterBloc counterBloc;
and pass this counterBloc in initState(). And create a method in which we increment the number.
After that, we create a widget that is wrapped with BlocProvider and pass CounterBloc. and give counterBloc as created in BlocProvider. For that the UI we used BlocBuilder by which we can change the text of the UI. At the onPreesed of the button, we pass the method that we created for increment.
In counter_state.dart we create an abstract class with the name CounterState in which we initialize the value. And also create two more classes for InitState and ResultState.
abstract class CounterState {
late final int value;
@override
CounterState(this.value);
}
class CounterInitState extends CounterState{
CounterInitState(int value) : super(0);
}
class CounterResultState extends CounterState{
CounterResultState(int value) : super(value);
}
counter_cubit.dart:-
In counter. dart class, we create a cubit class that extends to CubitState, in this class, we define the method of incrementing the number. and emit the value of ResultState.
class CounterCubit extends Cubit<CounterState>{
CounterCubit() : super(CounterInitState(0));
void increment() async{
int value = state.value;
value++;
emit(CounterResultState(value));
}
}
home.dart:-
In the UI part, first, we have to define counterBloc.
CounterCubit counterCubit;
and pass this counterBloc in initState(). And create a method in which we increment the number.
After that, we create a widget that is wrapped with BlocProvider and pass CounterCubit. and give counterCubit as created in BlocProvider. For that the UI we used BlocBuilder by which we can change the text of the UI. At the onPreesed of the button, we pass the method which we created for increment.
In this article, we have been through What is Bloc And Cubit in Flutter along with how to implement them in a Flutter. By using we can perform many state management orations.
❤ ❤ 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 Bloc VS Cubit In Flutter Application:
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 fromFlutterDevs.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.
Wewelcome 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.
Hello programmers, If you write UI code then you should know the concepts of the Event Loop architecture of Dart. It ensures that graphics operations and events such as I/O from the disk, finger taps from the user… and so on.
In Computer Science, an Event Loop is a programming construct or design pattern that continually tests and manages events and calls the appropriate routine to handle them. For example, the main function in the program is also the event loop that typically waits for the users to trigger something.
Did You Think ..?
When a program starts executing and dispose of, There are so many events that occur at that time. Can you handle these events yourself, like in which order that events execute or happen, or can you handle all of them with a single thread in that way it never blocks..?
Basic Concept
Dart
Dart is a single-threaded programming language by design because it is a single thread so everywhere we have an Asynchronouscode. Many library functions return future objects and we can register handlers to respond to events such as mouse clicks, file I/O completions & timer expirations…. all kinds of stuff.
So quickly, we can say that Dart handles asynchronous programming by Event Loop.
Event Loop
The event loop handles the execution of multiple chunks of your program over time.
The event loop is what allows multiple operations in a non-blocking way
The multi-threaded system kernel helps handle multiple operations executing in the background
If there is a piece of code that may delay the response, we can tell the event loop to keep it aside until the response is received.
When one of these operations completes, the kernel tells the event loop so that the appropriate callback may be queued to eventually be executed
Simply, An event loop’s job is to take an item from the event queue and handle it, repeating these two steps for as long as the queue has items.
Some Key Points….
Let’s know some points before to know how the Event loop works.
Event Handling Code
Dart uses asynchronous code to handle drawing events, mouse clicks, file I/O completions, timers, and so on. This code is called the Event Handling Code.
Dart’s Event Queues
A Dart app has two queues to run the Event Loop
> Event Queue
The event queue contains all outside events: I/O, mouse events, drawing events, timers, messages between Dart isolates, and so on.
The event queue contains events both from Dart and from elsewhere in the system.
> Microtask Queue
The microtask queue is necessary because the event-handling code sometimes needs to complete a task later, before returning control to the event loop.
Is used to store some very short asynchronous internal actions. All of the actions in the Microtask Queue will be executed before the Event Queue turn
Working on Event Loop Cycle
Let’s know In which order the Event loop works step by step…
Flow Chart Diagram of Working of Event Loop
As the above flow chart shows
When we start App, 1st main() function execute
The Event loop starts its work
Event Loop has two queues: Microtask Queue and Event Queue.
First, it checks the Microtask queue and executes any microtasks, in FIFO order if any exist
Then it dequeues and switches to Event Queue to handle the first item of the event in FIFO order if any exist
Event Loop repeats the cycle: execute all microtasks and then handle the next item on the event queue in FIFO order until both queues are empty and no more events are expected
The event loop closed and App dispose
Code Implementation
Let’s write a sample code to understand the event loop in a practical way
Sample Code:-
Output:-
Did it confuse you?
Let me explain it step by step.
So let’s press the Debug button to run the main() function. The event loop initializes and executes line no. 3 & 4. The next coming event is Future so Event Loop put it somewhere later in a queue and jump to line no. 26.
Here’s something interesting. The next event is the Future.microstack(). It’s a microstack event so Event Loop assigns it to the microstack queue and jumps to the next event. Event loop executed lines no. 29 & 30. So until now, we have A & H printed on the screen.
Next Event Loop checked the microstack queue and executed microtasks in FIFO order so now we get lines no. 26 & 27 output on the screen. Event Loop dequeues the microstack queue and jumps to the event queue where it put Future() in the past.
Now Event loop repeats the same process to handle events. Start execution on line no. 5 . Print lines no. 7, 8, and 11. The next event is Future() so put it somewhere in a queue to print later. Now Event loop gets again a Future.microstack() so it assigns that to the microstack queue and jumps to the next event.
So now we also have B & F printed on the screen. Event Loop checks the microstack queue and executes microtasks in FIFO order until the microtask queue is empty. Event Loop dequeues the microstack queue then checks the Event queue and handles 1st event in the queue until a queue is empty. There are no more events expected so the app dispose
Output:-
Now you have a detailed view of the output. You can see How the Event loop handles the events and in which order it executed the event.
Test Your Understanding
Until that, you explore Event Loop, Keep in mind that
We always can’t depend on Event Loop implementation to manage and handle task orders for the event queue. The implementation might change, and Future’s then() and whenComplete() methods are better alternatives.
Schedule A Task
So when we need to manage task orders or execute some code later then we can use the following APIs provided by the dart: async library: to schedule a task.
The Future class, adds an item to the end of the event queue.
The top-level scheduleMicrotask() function, adds an item to the end of the microtask queue.
Let’s know first that the main() function executes synchronously all existing calls, start to finish
The above flowchart shows in which order the main() function calls the task to execute.
Note:- Use Future().then() or Future().whenComplete() method to the specific task order.
Let’s take another example to test your understanding.
sample code
Output
The output shows, how main() executes the task according to priority and how you schedule tasks according to your requirements.
Conclusion
In this article, we get a details overview of Event Loop, how it manages and deals with the Microtask queue and Event queue, and how to schedule tasks according to our requirements.
When we write asynchronous code, we might need these resources:
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 fromFlutterDevs.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.
Wewelcome 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.