Skip to content

Mobile App Development Interview Questions for 3 Years Experience

40 questions with answers for candidates with 3 years of experience — 4 easy, 32 medium, 4 hard.

What interviewers expect: 3 years experience

With three years, interviewers expect strong architecture and quality ownership. Expect mobile system design for features like chat, feeds or live tracking, performance profiling questions, native module integration and CI/CD. You should compare frameworks and approaches with clear trade-offs, and give examples where you improved metrics like startup time, crash rate or app size.

This set is weighted towards Flutter State Management and Architecture (8), Mobile Backend, APIs and Firebase (8), App Store and Play Store Publishing (6), Testing, Performance and CI/CD (5).

Mobile system design Performance profiling Native integrations CI/CD and release automation
Solved at this levelStart practicing
3 QUESTIONS FREESign up to unlock the full question bank and track your progress.Unlock every question and answer, then continue practising company-wise and package-wise.
3 questions free Unlock the rest in seconds
01

What are runtime permissions and how do they differ between platforms?

Save to ▾
Show answer
Both platforms require runtime approval for sensitive features like camera, location, contacts and notifications. Android requires declarations in AndroidManifest.xml and runtime requests for dangerous permissions; iOS requires usage description strings in Info.plist, and the app crashes if a description is missing when requesting. iOS allows asking only once; later the user must change settings. Plugins like permission_handler or react-native-permissions unify the API.
02

What is the freezed package used for?

Save to ▾
Show answer
freezed generates immutable data classes with copyWith, equality, toString and union types or sealed classes, and integrates with json_serializable for fromJson and toJson. It removes boilerplate when modelling state such as loading, data and error variants. You annotate a class, run build_runner, and get generated code in a part file. With Dart 3 sealed classes and records, some teams need it less, but it is still widely used.
03

What is InheritedWidget and how does Provider build on it?

Save to ▾
Show answer
InheritedWidget lets descendants read data efficiently via context and rebuild when it changes, which is how Theme and MediaQuery work. Writing it by hand is verbose. Provider wraps InheritedWidget with a simpler API: ChangeNotifierProvider exposes a ChangeNotifier, and widgets use context.watch to rebuild or context.read to call methods without rebuilding. It is simple and suitable for small to medium apps.
04

How do you implement OTP login with a phone number?

Save to ▾
Show answer
The user enters a phone number, the backend or an auth service sends an OTP via SMS and returns a verification ID. The user enters the code, which is verified to issue session tokens. On Android, use the SMS Retriever or User Consent API to auto-read the code without SMS permissions; on iOS, set the text content type to one-time code for autofill. Rate-limit requests, expire codes quickly and protect against abuse.
05

How do you integrate a payment gateway in a mobile app safely?

Save to ▾
Show answer
Create the order on your backend with the amount, get an order ID, and open the gateway's SDK checkout in the app with that ID. After payment, the SDK returns a payment ID and signature, which the app sends to the backend to verify with the secret key before marking the order paid. Rely on server-side webhooks as the final truth. Never keep secret keys in the app or trust client-side success alone.
06

What are privacy declarations required by the app stores?

Save to ▾
Show answer
The Play Store requires a data safety form describing what data is collected, shared, encrypted and deletable, plus a privacy policy link and account deletion option for apps with accounts. The iOS App Store requires privacy nutrition labels, a privacy manifest file for the app and listed third-party SDKs describing data use and required reason APIs, and App Tracking Transparency permission before tracking users across apps.
07

After a release, crash reports show a spike only on one Android OS version. What steps do you take?

Save to ▾
Show answer
Pause the staged rollout to limit impact. Filter crash reports by OS version and device to find the top stack trace, and check behaviour changes for that version, such as permission, background or edge-to-edge rules. Reproduce on an emulator of that version, fix it, add a regression test and resume rollout with a hotfix. Add that OS version to the regular test device matrix.
08

How do you force users to update when an old version has a critical bug?

Save to ▾
Show answer
Keep a minimum supported version in remote config or an API endpoint, check it at startup and show a blocking update screen linking to the store. On Android, use the Play In-App Updates API with the immediate flow for critical updates and flexible flow for normal ones. Keep the backend compatible with older versions for a defined period, and use forced updates sparingly because they frustrate users.
09

What are isolates and when should you use them?

Save to ▾
Show answer
Isolates are Dart's units of concurrency, each with its own memory and event loop, communicating by messages. Heavy CPU work like parsing a large JSON file, image processing or encryption on the main isolate causes jank. Use Isolate.run or compute to run such work in a separate isolate and return the result. For network or file I/O, async-await is enough because that work is not CPU-bound.
10

Describe a time you had to deliver a feature with incomplete requirements.

Save to ▾
Show answer
Situation: product asked for a referral feature with only a one-line description. Task: deliver in a sprint. Action: I listed open questions, met the product manager for 20 minutes to agree on core rules, built the agreed version with configurable reward values from the backend, and documented assumptions in the ticket. Result: we shipped on time, and later changes needed only config updates instead of a new release.
11

How do you manage form state and validation across multiple steps in a Flutter onboarding flow?

Save to ▾
Show answer
Keep the onboarding data in one state object owned by a notifier or cubit scoped to the flow, with each step updating its part. Validate per step before moving forward and again on final submit. Save progress locally so users can resume if they leave. Keep validation rules in pure functions that are unit tested. Dispose the state when the flow completes so data does not leak into later sessions.
12

After an API call finishes, the app throws an error about using BuildContext across async gaps or setState after dispose. How do you fix it?

Save to ▾
Show answer
The user left the screen before the Future completed, so the widget was unmounted. Before using context or calling setState after await, check if (!context.mounted) return; or if (!mounted) return; in State. Better still, move async logic out of widgets into a state management layer that the UI listens to, and cancel subscriptions or timers in dispose so no callbacks run on a dead widget.
13

Push notifications arrive on Android but not on iOS. How do you debug it?

Save to ▾
Show answer
Check that the push notifications capability and background modes are enabled in Xcode, that an APNs authentication key is uploaded to the push provider, and that notification permission was granted. Verify the app gets an APNs token and the provider token, and that the right environment, development or production, is used. Test on a real device, since simulators have limited push support, and check payload format.
14

How do you secure Cloud Firestore data accessed directly from a mobile app?

Save to ▾
Show answer
Because the app talks to the database directly, security rules are the backend. Write rules that check request.auth for authentication and that users can read or write only their own documents, for example allow read, write: if request.auth.uid == userId. Validate fields and types in rules, never leave test mode rules open, and move sensitive operations like payments or role changes to Cloud Functions. Test rules with the emulator suite.
15
Save to ▾
Show answer
Expo Router is a file-based router built on React Navigation. Files in the app directory become routes, so app/product/[id].tsx maps to /product/42. Layout files define stacks and tabs, and every screen is deep-linkable automatically on mobile and web. It supports typed routes, protected routes for auth, and API routes. It reduces navigation boilerplate and makes URL-based linking consistent across platforms.
16

How do you reduce app size for Flutter and React Native apps?

Save to ▾
Show answer
Publish Android App Bundles so users download only their architecture and density resources. In Flutter, use --split-debug-info and --obfuscate, remove unused packages and fonts, compress images and use tree-shaken icons. In React Native, enable Hermes, R8 minification and resource shrinking, and remove heavy libraries. For both, analyse size with tools like flutter build --analyze-size or APK Analyzer and lazy-load large assets.
17

A payment shows success in the app but the order is not created on the server. How would you fix the flow?

Save to ▾
Show answer
The app is probably treating the SDK's success callback as final and the verification call failed or was never sent, for example when the app was killed. Make the backend the source of truth: verify payments with the gateway's signature on the server and use webhooks to update orders even if the app never reports back. The app should poll order status after payment and show a pending state until confirmed.
18

Write a Cubit that loads products and emits loading, success and error states.

Save to ▾
Show answer
sealed class ProductState {} class ProductLoading extends ProductState {} class ProductLoaded extends ProductState { ProductLoaded(this.items); final List<Product> items; } class ProductError extends ProductState { ProductError(this.message); final String message; } class ProductCubit extends Cubit<ProductState> { ProductCubit(this._repo) : super(ProductLoading()); final ProductRepository _repo; Future<void> load() async { emit(ProductLoading()); try { emit(ProductLoaded(await _repo.fetchProducts())); } catch (_) { emit(ProductError('Could not load products')); } } }
19

The client wants the app to look exactly like iOS on iPhones and like Material on Android. How do you approach this in a cross-platform app?

Save to ▾
Show answer
Identify which elements truly need platform-specific behaviour: navigation transitions, back gestures, date pickers, switches and dialogs. In Flutter, use adaptive constructors like Switch.adaptive or Cupertino widgets based on Theme.of(context).platform. In React Native, many components are native already, and Platform.select handles differences. Keep shared business logic and most layout common, and limit platform branches to a component library so they stay manageable.
20

What is dependency injection in Flutter and how is it done?

Save to ▾
Show answer
Dependency injection supplies objects like API clients and repositories from outside instead of creating them inside widgets or blocs. In Flutter it is commonly done with Riverpod providers, Provider or RepositoryProvider in Bloc, or a service locator like get_it, sometimes with injectable for code generation. It makes code testable because tests can override dependencies with fakes, and it centralises object lifetimes.
21

Users lose their place in a long Flutter form when they get a phone call and the app is killed in background. How do you fix it?

Save to ▾
Show answer
The operating system may kill the app process in background, and in-memory state is lost. Save draft form data to local storage, such as shared_preferences, Hive or a SQLite table, as the user types with a short debounce, and restore it when the screen opens. Flutter's RestorationMixin and restorationScopeId can restore simple UI state like scroll position and text fields. Clear the draft after successful submission.
22

What are the steps to publish an iOS app on the App Store?

Save to ▾
Show answer
Enrol in the developer program, create an App ID and the app record in App Store Connect, and set up signing with certificates and provisioning profiles, often managed automatically by Xcode or EAS. Archive the release build with an incremented build number, upload it, and test through TestFlight. Complete metadata, screenshots, privacy nutrition labels and age rating, then submit for review. After approval, release manually, automatically or in phased release.
23

How do you handle feedback that your code is not good enough?

Save to ▾
Show answer
I treat it as information, not a personal attack. I ask for specific examples and what better looks like, fix the issues, and look for patterns so I do not repeat them. Early in my career, a reviewer pointed out that my components were too large; I learned to split them and write small hooks, and my review comments dropped steadily after that. I also thank reviewers for their time.
24

A security audit finds that the app stores the access token in plain shared preferences. How do you fix it?

Save to ▾
Show answer
Move tokens to secure storage backed by Keychain on iOS and Keystore on Android, such as flutter_secure_storage or expo-secure-store. Migrate existing users by reading the old value once, writing it securely and deleting the plain copy. Shorten access token lifetime, use refresh tokens, exclude sensitive files from backups, and clear tokens on logout. Retest with the audit team to confirm the issue is closed.
25

How does navigation work in React Native with React Navigation?

Save to ▾
Show answer
React Navigation provides navigators: native stack for push and pop screens using platform transitions, bottom tabs, drawer and material top tabs. You nest navigators, for example tabs inside a root stack with modal screens. Screens receive navigation and route props or use hooks like useNavigation and useRoute. Version 7 adds a static configuration API for better TypeScript inference and automatic deep link setup.
26

What is clean architecture in a Flutter app?

Save to ▾
Show answer
Clean architecture separates code into presentation (widgets and state notifiers or blocs), domain (entities, use cases and repository interfaces) and data (repository implementations, API clients, local storage and DTOs). Dependencies point inward, so the domain knows nothing about Flutter or HTTP. It improves testability and lets you swap data sources. For small apps it may be heavy, so many teams keep presentation and data layers and add domain only when logic grows.
27

How do you handle pressure when a production issue affects many users?

Save to ▾
Show answer
I stay calm and focus on reducing impact first: confirm the issue, communicate status to the team, and look for the fastest safe mitigation such as a remote config switch, server-side fix or pausing a rollout. Then I find the root cause, ship a proper fix and write a short postmortem. Clear, regular updates to stakeholders reduce panic and let others plan around the issue.
28

How do you decide which devices to test on for an Indian user base?

Save to ▾
Show answer
Use analytics from the existing app or market data to identify the most common manufacturers, OS versions, screen sizes and RAM levels among your users. Cover a budget device with 3 to 4 GB RAM, a mid-range phone, a recent flagship, an older OS version you still support, and at least one iPhone and tablet. Use cloud device farms for wider coverage and add devices that generate many crashes.
29

What are optimistic updates and how do you implement them?

Save to ▾
Show answer
An optimistic update changes the UI immediately as if the server request succeeded, such as liking a post, then rolls back if the request fails. It makes apps feel fast on slow networks. With TanStack Query, use onMutate to update the cache and save the previous value, onError to restore it, and onSettled to refetch. Use it for low-risk actions, not payments.
30

What is Impeller in Flutter?

Save to ▾
Show answer
Impeller is Flutter's rendering engine that replaced Skia as the default on iOS and on modern Android devices. It precompiles a smaller set of shaders at build time instead of compiling them at runtime, which removes the shader compilation jank that first-time animations used to cause. It provides more predictable frame times. Developers rarely interact with it directly, but they should test on real devices when upgrading Flutter.
31

What is app signing and why must you protect the keys?

Save to ▾
Show answer
Signing proves the app comes from you and that updates are from the same developer. On Android, you sign uploads with an upload key and Play App Signing re-signs with the app signing key held by the store; a lost upload key can be reset, but losing a self-managed app key meant you could never update the app. On iOS, signing uses certificates and provisioning profiles. Store keys in a secure vault and CI secrets, never in the repository.
32

The API responses are slow on mobile networks. What can the mobile team ask the backend team to change?

Save to ▾
Show answer
Ask for pagination with sensible page sizes, gzip or brotli compression, removing unused fields or providing screen-specific endpoints, and aggregated endpoints to avoid multiple sequential calls. Request proper cache headers and ETags so the client can reuse responses. Ask for resized images through a CDN and HTTP/2 or HTTP/3 support. Share measured timings from real devices to justify the requests.
33

What is Metro?

Save to ▾
Show answer
Metro is the JavaScript bundler for React Native. It resolves modules, transforms code with Babel, and serves the bundle to the app during development with Fast Refresh. For release builds, it produces a minified bundle that is compiled to Hermes bytecode. It supports platform-specific extensions, asset handling and configuration in metro.config.js for things like SVG transformers or monorepo setups with watch folders.
34

Store review is delaying your launch date. How do you plan releases to avoid this?

Save to ▾
Show answer
Submit builds early, a few days before the planned date, and use manual release so you can publish the approved build at launch time. Ship the code behind a remote feature flag so the feature can be enabled on launch day without a new review. Keep a pre-approved build ready, follow store guidelines closely and include clear review notes and demo login details for reviewers.
35

How would you test a Bloc or Riverpod notifier?

Save to ▾
Show answer
Test business logic without widgets. For Bloc, the bloc_test package's blocTest builds the bloc with a fake repository, acts by adding events, and expects a list of emitted states. For Riverpod, create a ProviderContainer with overrides for repository providers, read the notifier, call methods and assert the state. Use mocktail for mocks and keep tests fast, deterministic and independent of the network.
36

What is BuildContext?

Save to ▾
Show answer
BuildContext is a handle to a widget's location in the element tree. It is used to look up inherited data like Theme.of(context), MediaQuery and Navigator, and providers. Each widget's build method gets its own context. Common mistakes are using a context from above a widget that provides data, or using a context after an async gap when the widget may be unmounted; check context.mounted before using it after await.
37

Tell me about a time you had to learn a new framework under a deadline.

Save to ▾
Show answer
Situation: my team decided to build a client app in Flutter, and I had only React Native experience. Task: deliver the login and dashboard screens in three weeks. Action: I completed the official codelabs in the first week, mapped concepts I knew like components and hooks to widgets and state, and asked for early code reviews. Result: the screens shipped on time, and I later wrote a short guide for other React Native developers moving to Flutter.
38

What local storage options exist for Flutter and React Native apps?

Save to ▾
Show answer
For simple key-value settings, Flutter uses shared_preferences and React Native uses AsyncStorage or MMKV. For sensitive data, flutter_secure_storage or expo-secure-store use Keychain and Keystore. For structured data and queries, use SQLite via sqflite or drift in Flutter and expo-sqlite or WatermelonDB in React Native. Object stores like Isar, Hive or Realm also exist, but check maintenance status before choosing.
39

How do deep links and universal links work?

Save to ▾
Show answer
Deep links open a specific screen in your app from a URL. Custom schemes like myapp://order/42 work but are not verified. Verified HTTPS links are App Links on Android, using assetlinks.json, and Universal Links on iOS, using an apple-app-site-association file on your domain. When verified, the link opens your app directly instead of the browser. The routing library, like go_router or React Navigation linking, maps URLs to screens.
40

Write an EAS configuration for development, preview and production builds.

Save to ▾
Show answer
{ "cli": { "version": ">= 12.0.0" }, "build": { "development": { "developmentClient": true, "distribution": "internal" }, "preview": { "distribution": "internal", "channel": "preview" }, "production": { "autoIncrement": true, "channel": "production" } }, "submit": { "production": {} } }

Frequently asked questions

What is asked in Mobile App Development interviews for 3 years of experience?

With three years, interviewers expect strong architecture and quality ownership. Expect mobile system design for features like chat, feeds or live tracking, performance profiling questions, native module integration and CI/CD. You should compare frameworks and approaches with clear trade-offs, and give examples where you improved metrics like startup time, crash rate or app size.

How many questions should I practise before a Mobile App Development interview?

Work through all 40 questions here, then the company-wise sets for the employers you are targeting. Quality matters more than count: be able to explain why each answer is right.

Which topics matter most for 3 years of experience?

Focus first on Mobile system design, Performance profiling, Native integrations, CI/CD and release automation.