profile-pic
Vetted Talent

Hardik Viradiya

Vetted Talent

As a skilled Flutter and native Android developer, I bring three years of immersive experience in Flutter development coupled with 6 years in native Android expertise. My foundation encompasses an adept understanding of Google services, REST APIs, cloud databases like Firebase, and seamless integration with various payment gateways. Embracing Clean architecture and Bloc design patterns is ingrained in my approach to crafting robust applications.

My track record speaks for itself, marked by a series of high-quality, responsive apps from conceptualization to a triumphant release on both the Play Store and App Store. I am dedicated to delivering excellence, driven by an innate enthusiasm for transforming concepts into tangible realities.

While I'm continuously honing my craft as a top Flutter developer, my standout attribute lies in communication. I prioritize clarity, always seeking the right questions before initiating work and presenting optimal solutions. My commitment to transparency ensures an open dialogue throughout our collaboration.

Seeking opportunities for long-term partnerships, I offer:

Professional Design Expertise Leveraging Flutter

Swift and Responsive Communication

Ongoing Support for Flutter App Development

Comprehensive Flutter App Source Code

Unlimited Revisions Until Absolute Satisfaction

I am committed to elevating your project with reliability, enthusiasm, and unwavering honesty. Let's embark on this journey together and bring your aspirations to fruition!

Open to engaging in full-time, part-time, or long-term commitments.

Warm regards,

  • Role

    Tech Lead Mobile

  • Years of Experience

    12.3 years

Skillsets

  • Blockchain
  • State management
  • real-time features
  • Performance Optimization
  • payment systems
  • API Integrations
  • Coroutines - 3.0 Years
  • Codemagic
  • Provider
  • Riverpod
  • BLoC
  • Fastlane
  • Java
  • Retrofit
  • Coroutines
  • web3
  • Jetpack Compose - 1.0 Years
  • Firebase - 6 Years
  • CI/CD
  • Dart - 5 Years
  • Flutter - 5 Years
  • Kotlin - 4.0 Years
  • Java - 3 Years
  • Kotlin

Vetted For

13Skills
  • Roles & Skills
  • Results
  • Details
  • icon-skill_image
    Android Developer (Remote)AI Screening
  • 70%
    icon-arrow-down
  • Skills assessed :Strong Communication, asynchronous operations, Kotlin, MVVM, Restful APIs, Retrofit, Android, Firebase, Git, Java, Proactive, Problem Solving Attitude, XML
  • Score: 63/90

Professional Summary

12.3Years
  • Feb, 2024 - Sep, 20251 yr 7 months

    Tech Lead Mobile

    Yooli Health Solutions
  • Sep, 2021 - Jan, 20242 yr 4 months

    Tech Lead/Mobile Developer

    LeewayHertz IN
  • Jan, 2017 - Sep, 20214 yr 8 months

    Senior Mobile Developer

    Ncrypted Technologies
  • Jan, 2014 - Feb, 20151 yr 1 month

    Android Developer

    iGreenTech Services
  • Mar, 2015 - Jan, 20171 yr 10 months

    Android Developer

    Keshav Infotech

Applications & Tools Known

  • icon-tool

    Java

  • icon-tool

    Kotlin

  • icon-tool

    Flutter

  • icon-tool

    Dart

  • icon-tool

    Android Debug Bridge

  • icon-tool

    Android

  • icon-tool

    Android SDK

  • icon-tool

    Android Studio

  • icon-tool

    Visual Studio Code

  • icon-tool

    Google Ads

  • icon-tool

    Google Chrome

  • icon-tool

    Google Play Console

  • icon-tool

    Firebase

  • icon-tool

    Firebase Realtime Database

  • icon-tool

    GitHub

  • icon-tool

    GitLab

  • icon-tool

    Bitbucket

  • icon-tool

    Zoho

  • icon-tool

    Jira

  • icon-tool

    Slack

  • icon-tool

    Microsoft Teams

  • icon-tool

    Zoom

  • icon-tool

    Eclipse

  • icon-tool

    VSCode

  • icon-tool

    Flutter SDK

  • icon-tool

    Github

  • icon-tool

    Bitbucket

  • icon-tool

    Xcode

Work History

12.3Years

Tech Lead Mobile

Yooli Health Solutions
Feb, 2024 - Sep, 20251 yr 7 months
    Architected scalable Flutter applications with optimized performance, reducing load time by 30%. Managed CI/CD pipelines, cutting the release cycle from weekly to daily. Led a mobile team of 5, improving delivery efficiency by 25% through mentorship and streamlined workflows.

Tech Lead/Mobile Developer

LeewayHertz IN
Sep, 2021 - Jan, 20242 yr 4 months
    Delivered multiple production-grade mobile apps used by millions of users globally. Optimized app performance and security compliance, reducing crash rate by 40%. Directed cross-functional teams, improving project delivery timelines by 20%.

Senior Mobile Developer

Ncrypted Technologies
Jan, 2017 - Sep, 20214 yr 8 months
    Built scalable Android & Flutter apps, contributing to 15+ client launches. Reduced app startup time by 25% through architectural improvements. Mentored 3 junior developers, improving code quality and team productivity.

Android Developer

Keshav Infotech
Mar, 2015 - Jan, 20171 yr 10 months
    Developed and launched multiple Android apps with 100K+ downloads. Improved API integration performance, reducing response latency by 20%.

Android Developer

iGreenTech Services
Jan, 2014 - Feb, 20151 yr 1 month
    Delivered reliable Android apps with clean, maintainable code. Improved bug resolution speed by 30% through better QA collaboration.

Achievements

  • Beginner in flutter development
  • Computer Hardware & Networking
  • Attend seminars by GDG
  • Attend a seminar on Ethical Hacking organized by Nirma University, Ahmedabad
  • Computer Hardware & Networking.
  • Attend seminars by GDG.
  • Attend a seminar on Ethical Hacking organized by Nirma University, Ahmedabad.

Major Projects

5Projects

CERA

    Critical Event Management app for handling emergencies and incidents. Developed with Flutter, integrated Mapbox for real-time mapping and live event data. Enhanced response efficiency by implementing live tracking, alerts, and reporting features.

GETTR

    Social media platform supporting millions of active users. Implemented crypto wallet integration for tipping, supporting posters, and referral-based earnings. Improved scalability and app performance, reducing crash rate and enhancing user retention.

Deliveroo

    Food delivery platform with real-time order tracking and driver tools. Integrated maps, live tracking, and background services to improve delivery efficiency and accuracy.

Yatri Sathi

    Ride-hailing and delivery solution with secure payments and real-time tracking. Boosted driver reliability and user trust through enhanced navigation and data handling.

Moovl

    Smart carpooling app for affordable and eco-friendly ride-sharing. Built real-time ride-matching features, increasing match success rate and reducing wait times.

Education

  • MCA Master of Computer Applications

    Gujarat Technological University (2014)

Interests

  • Watching Movies
  • AI-interview Questions & Answers

    So hi. Hi there. My name is, and I have a total of 11 years of experience in mobile application development. I've started by completing my MCA, a master of computer application, in 2014. And since January 2014, I've been working as a junior developer. I've worked with 4 different companies, and I've worked on various projects, including social media applications, financial applications like Wallet, and cryptocurrency-related projects. I've also worked on dating applications, and I've mostly worked with Android. I will mostly work with all kinds of tooling. I work with social media applications, financial applications, and dating applications. I've worked with, like, mostly all domains. That is about me. Since my last company, I was working as an entry-level developer, but they wanted to move to React Native with their reps. They had only a few reps, 4 reps for a product-based company, and they wanted to increase reactivity. That's why I'm looking for a change. That's all about me. I'm married, and I have a 2-year-old daughter.

    In this scenario, would using your Intel service be more beneficial than reducing yourself? Yeah. So, let's say there is a scenario where the task we are going to be executed in the service, which is related to the Excel or any particular thing, which is executed based on any user action or any particular Excel, which is provided by either the app or the system. So in that case, the intent service will be a great fit. Like, let's say for example, we wanted to execute something when there is a very low battery level, or we wanted to execute something when the user has provided a specific input or the user has clicked on any button or the user has set the time of that particular task. So in that case, the intent service will be a very great fit, I think. Yeah.

    Can you go out the state security store? The sensitivity of the user is entered key store system. Yes. So, basically, the entered key store system is a way to store sensitive data, like, let's say, ID passwords and things like that. So, if we want to store our edge-sensitive data in a key store, we have to call the key store classes and use those classes to store and retrieve the data. So, let's say if we want to store the data securely, the key store itself stores the data securely. So, there's no need to add an extra security layer for normal applications because the key store is a secure way to store the data. But if we want to make it more secure for some applications or use cases, we can encrypt the data. For example, when I'm storing the password to the key store system, I'm not storing it as a plain password. Instead, I'll first encrypt it using a key or an algorithm, like SHA-256. And, whenever I'll retrieve the data from the Android key store, I'll decrypt it and use it. In this case, we also have to store the security keys, like the public and private keys, to both encrypt and decrypt data. We have to store those keys in the key store system. We can also store the public key on a server or somewhere, like on a cloud, and use that to integrate the data. So, that's how we can store data securely on the Android key store system.

    Yeah. So, let's say there is a list of images which we want to show on a single screen. In that case, I would firstly use a RecyclerView. And, yes, RecyclerView helps introduce lazy loading, using which the list we are showing will be very responsive. And, yes, it will be fast. And, too many of the images, I would use a library like Picasso or Glide, using which we can manage the bitmap or images very easily, without any memory leak issues. And, we can also create our own, like, let's say, our own solution, similar to Picasso or Glide. But, I would suggest, like, to use the Picasso Glide. So in that case, we don't have to worry much about it because it's a well-trained or vastly used platform. And, using it, there will be very less issues, instead of what we are developing. Like, if we let's say, if we create a custom solution so that it cannot be error-prone. Like, there may be a few errors, but, the Picasso and Glide are very used. Like, it's working with images since the last few years, so they might be very upgraded. So there will be less chance to any error or memory issues. So, yes, I would use a Picasso or Glide or any image loading library. And in that case, I'll use a RecyclerView to solve the list. Yeah. And, if we are using a list view, let's say, we have specifically to list view. So in that case, I'll make a few changes in the adapter. And, that way, the adapter will make some changes and list two adapters so that way we can populate the data easily.

    Yeah. So, in input, like, state management is a very crucial part, and I would suggest I'll use live data and view manager and those kinds of classes. Let's say the application is very large and there are multiple components, 80. So I would use a statement as well, and I'll like there will be a particular state assigned to a particular screen. Based on the changes on the state variable, they will update the JPEG compose view. So I would say the basic strategy would be making this a different screen for different states for different UI. And yeah, it is all we will be needing. Like yeah. That would be a best strategy, I think, because every screen has a space state management class. So in that case, what we'll be able to achieve is, like, let's say there are 5 screens, which is currently active one upon another. Like, full screen is in one state and one screen is in a few states. So in that case, like, if there is a change and then all the 5 screens. Let's say there is a variable which affects all the 5 screens. So let's say there is a change in that variable, so we'll be able to execute those changes in a different way because the state of the classes are different, and we can execute those on a different way. So whenever the user goes to a different screen, the changes are executed there, and like the variable is already changed. So whenever the user calls the resume method, at that time the change will happen. So I think that will be the best strategy.

    Yeah, so basically, a repository layer is a layer where we get the data. The other layers do not concern how we get the data or from where we get the data. So, the repository layer is basically our layer where we get data. If we discuss how you would use a repository data and flag data to be able to pull the data layer, yeah. So, the date repository module is itself a module which decouples the data layer from the view model. Let's say, for example, we are using a network data and a local storage. So we are using both. For the first time, we have updated the data from the network, and we have stored it on the local database. And then, from the second time onwards, until there is a change in the data on the cloud, we will use data stored in the local database. So, the repository layer manages the phasing of the data, like if there is any change. And, based on the change, if we want to fetch the data from the network, the repository layer will indicate that. And, using live data, we will update the live data at the time of change. So, in that case, the view model will not be attached to the repository layer or the data fetching or data gating layer. Every time, if there is a change on the data at the repository layer, either fetch it from the network or fetch it from the database and pass those data to the live data object. And so that way, it will be managed, and the view model will only know how to refresh those data or update those data. Yeah. So that way, we can achieve that.

    In Kotlin, that's what would be the outcome if a 'c user function' is called with an uninitialized user data object. An uninitialized user data object explains the potential issue and how it could resolve them. Yeah. So, in that case, if the same user is called with an uninitialized user data. Let's say the user object is not initialized or the user class is not initialized. In that case, I think they'll give an error to initialize the data first on the user if the user is a nullable variable from where the same user is called. In that case, it will allow to call the function. But here, it will check if the user is null or not. In that case, if the user is null, it will print a null pointer exception, and otherwise, it will store in the database itself. And yeah. So now, if the user data is not initialized, in that case, the save user function call itself will give an error because Kotlin monitors the variables whenever there is a null or non-null object. Let's say we have a user late initialization for the user data, and let's say we are not initializing that in everywhere, and it will give an error to initialize it first. So, whenever we will call the user consent, it will give an error at the time of compilation itself, or it will also give an error at runtime. So it will give an error that the data we are using, the user data, is not initialized anywhere. So, yeah, in that case, we can create a nullable instance of the user data instead of deleting it. So, in that case, our function will handle if the user data is null if it is not. So, yeah, we can create an enabled object of the user data instead of updating it object, and that way, we can resolve this.

    No, object to it, we have to suggest a way to convey to move itself up to view within different parts of yes. So too, like, to use this function, this launch activity function using a different lab part of the activity. In that case, we what we have to do is, put the context as an argument. So every time, like, we will get 2 arguments, one will be context of the classes from where we are using this launch activity function, and the other one will be the activity we want to redirect to. And there'll be like, there are many things we can add here. Like, we can also add arguments or a bundle. So which using which, we can pass the data from this activity to another activity. But, basically, the bundle variable will be an optional thing because we will not be having we will not be passing the data every time. So it will be a 1 or 2 time thing or it will be not a regular thing. So we can make it optional, and we can use the context as a request parameter. So there will be 2 parameters, context and activity, and then the 3rd parameter bundle will be optional. And using which, we can use this functional as it is. But instead of this, we have to use the context or object. And before starting the activity, we have to put a condition. If the bundle is not null, we have to add intent dot output extra and then bundle. And so that way, we can use this function from anywhere. Like, let's say, we have 6 or 7 screens in our application, and we want to use the same function to redirect from one screen to another. So, for every place, I think we can

    Yeah. So, in that case, I'm creating an application, and it is expected to get a high number of users or high network requests. So the volume will be very large. So in that case, what I will do is I will first create, like, I'll choose an efficient server, which is very good with a high request. Let's say there are 50 requests in a second or 80 requests in a second. So I would choose the base server or a base to begin for the API calls based on and response. And from my end, from the front end, like, let's say, I'll use proper API calls. Like, let's say, I'll add validation on every API call. Like, let's say, user token or I'll use authentication on every API call. So in that case, we will neglect the API calls which are coming from non-users or which are not related to known users. So we can neglect those calls first. Secondly, I'll cancel every request that the user is no longer required. Like, let's say, user comes to a page where API calls have been made. Yeah. Like, let's say, there are two API calls on that page. So whenever the user comes to the page, the two API calls are made, and the user instantly goes back without getting the result or before getting the results. So in that case, what I'll do is I'll cancel those requests. Cancel those two requests so there will be a very few request calls. And, thirdly, what I would do is, if there is any static thing or static data or there is any data which updates rarely. Like, let's say, there is some data in our app, which rarely updates in a month or in two months. So I'll switch those data in our local database, and I'll fetch the data from there. And I'll definitely put a token or a way so that I can identify the data on the server has updated. So I have to call those data again and update those data in my local database. So, yeah, using these techniques, I can achieve a reliable system under heavy network traffic.

    Yeah, so my strategy would be, like, let's say there'll be three branches. First, there's a main branch or a parent. Let's say the main branch is a main branch. There's a staging branch, and there's a development branch. And so in that case, we'll first develop and push to the development branch. We'll create a different branch for different functionality or different issues. And let's say if I'm working on a functionality. So once I'll finish the functionality and test it on my own, I'll push it to the development branch where someone will review the code of the branch and then merge it. And after that, there will be a testing. There's a proper testing and using which we can identify issues and resolve them on our own. So after that, we will move to the next branch, which is the production branch. We'll move to that production branch and there also, we'll take the details, test thoroughly for any issues or anything. And if that's working fine, then we will move to the main branch. And whenever there's a push in the main branch, if we say it as CD, like, let's say code magic or something. So using the code magic, we will set up the function that if we're getting any push in the main branch, so in that case, we will update the AirPods player. We'll set up the code magic or similar for the main branch. And whenever there's a push, the code magic will execute the code on the main branch and create a new release and push it to the Play Store and send it to review. So in that case, we don't have to do anything. But we have to make sure that there will be no unauthorized push on the main branch. And so using that way, we can achieve a great strategy for CAC.

    So, data is basically a dependency injection thing. Whenever we use a single class for a variety of places in our mobile app, let's say we are storing the data in the local database, and we are accessing that local database manager or local database helper class in many activities. We are fetching the data from one activity, from another activity, and pushing the data to the third activity. So we are using that same class on all three activities. Using data or Hilt, we can create a singleton class for that particular helper class, the database helper class, and using which, we can create a single object and use that on all three activities. So we don't have to create an object every time on every activity. Let's say there are three activities and to access the data database related thing, I have to create the object of that database helper class. And after that, I'll be able to use that class and use the methods like getting the data or fetching the data or pushing the data. Instead of using data or Hilt, we can create a singleton object and singleton class, its object, and we can use that particular object in all three activities. So that helps to manage the multiple object concept, and it will create a single object. In that case, it will be memory efficient, I would say.