
Driven, adaptable Angular Frontend developer with 7 years of experience (overall 6 Years) delivering exceptional results. A collaborative problem solver and quick learner. With a passion for continuous learning and personal growth, I have extended my expertise beyond Flutter to include proficiency in Angular and NestJS. This diversified skill set allows me to tackle a broader range of projects and contribute to various aspects of software development. During my free time, you can often find me unwinding with a cup of tea, reading something on my Kindle. I believe in the power of continuous learning and exploring new subjects to broaden my horizons as a developer.
Senior Software Developer
Faida SouqSoftware Development Engineer
MashtrixJunior Developer
Zamorin Global
MySQL

CSS3 & CSS5

Javascript

Ajax

Angular
REST API
Laravel

PostgreSQL
Jira
AWS (Amazon Web Services)

TypeScript

GraphQL
.png)
Flutter

NestJs
Node.js
.png)
Firebase

MobX
Oh, yeah. No. It started my career as a I'm not under public scrutiny. Letter, I'm a full-stack developer who basically switched to Flutter development. And, I've been a Flutter developer since last 4 or 5 years. I'll also focus on some backend development using a Node.js framework called Nest. I studied computer science and engineering in college, and after that, I moved to a small company where I started my career in Laravel and then Angular. That moved to match things as a full-stack developer for the data. Currently, I'm doing freelance work on Flutter, and some backend works using NestJS. Mostly, I work with MobX and Flutter Bloc, and I personally prefer Flutter Bloc. I started developing in Flutter apps using Flutter Bloc. But sometimes I felt that most apps don't need event-driven architecture, and Flutter Bloc has a lot of boilerplate. That's why I switched to Flutter MobX. Apart from that, I also worked with electronics. I also developed the scope application using Electron, and I have experience working with Angular and React.
It's going to be a process of integrating password service. Yeah. Password, the system app might have a state managing solution. So, I will create a constants file to avoid magic strings on the application. So, I'll disable all the endpoints as a constant API, something like the FP constant or some other file. So, I'll write the endpoints as constant strings in the application, and then I'll create a separate file for calling all these APIs. But before that, I'll choose an API library for writing the rest API. I prefer do. I'll add BO to the Pops for YAML file and do the necessary setup for the rest API. Then, I'll create a video instance, and I'll write abstract functions for all the common HTTP methods like get, post, put, patch, and all these kinds of stuff. I can use these functions later on in my code whenever I need to send a get method or something like that. So, I'll describe on my application, I'll pass to four wherever I need to call the rest API. I'll do things according to my state management. Like, if it's a block, I'll create an event for that thing, and I'll handle that event in the block file. And based on that event, I'll call that API from the block itself and update the state according to that. If the API process is pending, then I'll update the data according to that. So, show us some orders or anything like that. I'll show it on the app itself. And when the API response comes, I'll serialize the API models for the API fields on the dot model and use it to update my state management or whatever I have to use. I'll check both statuses and update the UI. I'll convert the JSON API response to dot plus, and use it for that thing. For testing, I'll use some testing library or the block itself has some testing tools for mocking API responses and things where they can mock it. So, I'll mock the API response and test using that thing. And, normally, for production applications, I'll use Flask or something like that. I'll probably define base URLs in the ENV files itself. So, before going to production, I'll update the base URL and then release it.
Now I dynamically use for debugging performance issues. I'll use the Flutter profiler that is a very good profiler in the Flutter dev tools itself. So I'll build the application using the profile mode and then check for any high memory usage or something similar on the Dart Observatory section. And I can also, if I'm testing on a virtual device, I can also use third-party apps for monitoring the CPU performance and the screen frame rate. All these kinds of things can be monitored in third-party applications. And use those things. The frame rate, you know, can also be monitored using the Dart Observatory tools. Yeah. Basically, for Flutter, you can use the Dart Observatory tools for most common scenarios. Otherwise, for extra performance, we can use some third-party libraries on the real device.
We're doing more about the documentation of interactions within a quick report for the future of conscious maintenance. Yeah. That got a pretty good documentation feature, like you have. You can describe documentation using three slashes or double slashes. So, I'll show you this is how I document. I'll if there is a function that calls my case, I'll first describe what it is and when it's called. And after that, I'll describe what its arguments are and what types they are and what the function returns. I'll document all these things using the zone documentation methods. I can use three slashes for writing documentation. Then, another thing I commonly do is that for the service calls for all the AKs. There's some module or some business logic. So, I'll describe that service class itself on the top. I'll describe what the service is and what kind of business logic we're handling. And after that, if there's a get request for fetching something, if it's an ecommerce, fetching some product listings, then that will be the product listing API. I'll describe that this API will fetch all protected products in the application, and it will return some area or things like that. Then, after that, there will be some API for storing cart on the API side. I'll describe that like this: this particular case is for the user on the server side for later use. Then, this function needs arguments like product IDs and quantities. I'll document all those things and write it on the top of the function.
We are close and sort of close. We are apps with screen sizes and limitations. Okay. Moving forward, this is pretty difficult. The thing is the challenge here is that Flutter doesn't have any, you know, native CSS-like functionality. Or, yeah. On the web, it's very easy to handle using CSS and CSS breakpoints. So, Flutter doesn't have that much flexibility for handling different UIs. So, what I do is that if there is too much change, like, for example, if it's a mobile device, we have to show a bottom bar. But if it comes to iPad level 3, then that bottom bar isn't needed. We don't need to display the bottom bar. Instead, we need to show a full menu on the right side. And then, when we expand the screen, like, when we come to laptop or focus screens, then we normally hide the menu and spread the content. And the thing is, another example is that on a mobile phone screen, we list, like, all these things downwards, but on iPad and larger screens, we need to convert this list into an integrated grid. So, these are some of the challenges I faced during the development of responsive network applications. So, what I'll do is I'll use media queries. I'll define a custom scaffold, you know, for I'll extend this scaffold with a top app bar. By analyzing the media query and the screen size and screen width, I'll conditionally show different UIs. For example, if it's a mobile screen, I'll have some definitions like if the screen size is less than 580, it'll show a bottom bar. If it's greater than 580 and some other threshold, like, 740 or something like that, then it will show the open sidebar and hide the bottom bar. All these kinds of things. So, basically, I'll manage it using media queries. The media query is accessible from different context APIs.
What was the performance like in front? For the most part, performance bottlenecks occur when you're doing huge calculations while the screen is being rendered. So, I'll use an isolate to isolate those huge calculations or something, and they'll move into the isolate. The screen will then be rendered without any issues. We can get the calculation result from the isolate.
I didn't get the question. Instead of following the call for testing a temporary that you're setting about that checkbox. I think from the debug strategy, which you suggest to ensure that the load that enables us in correct state chain. I wait. Just a moment to settle. Okay? Experts, later. Blow. K. And next in order is I'll use the breakpoints to ensure that to debug that, you know, every event is in the correct order. So I'll first add a breakpoint on this and then the next one. And I will then have control over how the events are propagated across the event emitter and its event file. Low consumer, all these things I can control with the breakpoints.
It's the best fit manager for complex things that include user interactions. If that involves local persistence, I'll use some if there's too much data, like storing some transactions or something, I'll use it. I believe you're referring to something like that. It's a symbol data, like yes, and or something like that, symbol JSON. Then I'll use side effects to block or get it just for storing things locally. Okay. Another thing is using interactions and data patching. And the thing is, it's not that complex, that all user interactions are if I'm using Flutter bloc, all user interactions are some kind of events. And the bloc emits the event whenever the user clicks a button or does something, then the bloc will emit the event, and the event will be handled inside the bloc. And based on that event, there'll be some data patching happening. So during data patching, I'll need to update the UI. The data is loading, and all these kinds of things will be handled using events or yielding state changes from the bloc itself. Like when the data is searching, I'll do some state changes, like for that particular data is loading, I'll leave that state. And the app's screen updates will show some loaders or if it's a button, then the app's screen will show a loading state. It'll change the click button, click text to loading or something like that. And the complex state can be easily managed using event-driven access on any other state manager. And on local persistence, like I said earlier, we can use a database or hydrated storage. So whenever a state changes in hydrated storage, it will automatically store on the user's device. If we're using high-level, then we can use another bloc for storing and retaining data from the driver. Then for communicating with this bloc, we can use events also.
I'll improve the launch time. Okay. I'll avoid using for improving the launch time. I will avoid using large kinds of large calculations or something like that on Gmail.transactfile. If there is something like that, I'll move those kinds of things into isolates so there won't be any issues, calculations happening when the app starts for the first time. And I'll also add a netting flash screen for the flash application. So the flash screen display is not a responsibility of so you can use the net, iOS or Android's native capabilities for showing the splash feed, and we can remove the responsibility from different locations. Another thing is to minimize the app size. So you can reshape the bundle, reshape the Android bundle, and iOS app site iOS IPSIs. And the thing is, I'll check if there are any assets that can be loaded from the server. I'll do that or reduce the asset size to a minimum. Okay? If there are huge assets, I'll lazy load them after the app is started, or on Android, you can easily load assets from the Play Store itself during the initial upload. Another approach to minimizing app sizes. Of course, I'll be building an app bundle on Android. The thing about that bundle is that Google Play will split the bundle to suitable APKs for each device. So some devices will get a smaller APK, and other devices will need a huge screen size as they will get a huge APK. The app size, or epic size, or update size is managed by Google Play. Then, like, removing unwanted codes or removing unwanted packages is a normal, regular task. Plus, there are cases where some packages are huge, so I'll try to avoid those kinds of packages or implement the best practices for reducing the bundle size.
How would you utilize additional statements like provider or looks at full openness? Yeah. The thing about Ratabox is it's a modified version of provider or revoke port. The provider transfers all this data using the context, for the wrap context. So how do you utilize the addition statement in solutions like provider or portal? So, provider can use some common things like passing data down. For example, the theme context is a data example for how provider works along with all other state management solutions. The team contact is default with default on flat. The team contacts are contacts which are available in all the files and configuration of the regular team of the app itself. And all the paid contact users are provided to move the data across the registry.
Why at least I regularly review the community by answering some questions on Stack Overflow, specifically the Flutter workflow. I also look for answers on better forums like Flutter GitHub issues. And I have some Discord channels and local community Flutter groups. I also joined some local community groups. We have a very active Flutter Kerala group in Telegram. So I sometimes answer questions and some of my questions were previously answered by other community members, including. Other than that, I sometimes contribute. I'll modify some packages. I've run some open-source contributions for modifying some minor changes and improving the dark theme. Or there are some breaking changes if I saw some breaking changes in the application, which is not compatible with the data's frustration, I'll implement those things. Like, I've already made small changes in those packages. Those PRs are already merged with the package owners. We create a PR with the package in the master branch and all these are already merged.