Skip to content

Mobile App Development Interview Questions in Ahmedabad

36 practice questions with answers for Mobile App Development interviews in Ahmedabad.

Mobile App Development jobs in Ahmedabad

Ahmedabad and GIFT City have a growing market for IT services, fintech and product start-ups. Companies here value hands-on skills and the ability to work across tools, especially in smaller teams.

Below are 36 questions that match the mix of service, product and domain employers hiring junior mobile app developers in Ahmedabad.

Solved for AhmedabadStart 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 useMemo, useCallback and React.memo used for?

Save to ▾
Show answer
React.memo skips re-rendering a component when its props are shallowly equal. useCallback keeps the same function reference between renders, and useMemo caches a computed value, both only changing when dependencies change. They help when passing callbacks to memoised list items or computing expensive values. Overusing them adds complexity with little gain; the React Compiler can now apply such memoisation automatically in supported projects.
02

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

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

How do you measure performance in a Flutter app?

Save to ▾
Show answer
Run the app in profile mode on a real device, not debug or emulator. Use Flutter DevTools: the performance view shows frame build and raster times, the CPU profiler finds expensive functions, and the memory view tracks allocations and leaks. Target under about 16 milliseconds per frame for 60 fps. The performance overlay shows UI and raster thread graphs, and rebuild tracking highlights widgets rebuilding too often.
05

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

How does Flutter's layout rule of constraints go down, sizes go up work?

Save to ▾
Show answer
A parent passes constraints, minimum and maximum width and height, to each child. The child chooses its size within those constraints and reports it up, then the parent positions the child. A widget cannot choose a size outside its constraints, which explains why a Container with width 100 may still fill the screen if forced by tight constraints. Understanding this rule solves most overflow and unbounded constraint errors.
07

Write a custom hook that fetches data with loading and error states.

Save to ▾
Show answer
function useFetch(url) { const [state, setState] = useState({ data: null, loading: true, error: null }); useEffect(() => { const controller = new AbortController(); fetch(url, { signal: controller.signal }) .then((r) => { if (!r.ok) throw new Error('HTTP ' + r.status); return r.json(); }) .then((data) => setState({ data, loading: false, error: null })) .catch((e) => { if (e.name !== 'AbortError') setState({ data: null, loading: false, error: e.message }); }); return () => controller.abort(); }, [url]); return state; }
08

Integration tests pass locally but fail randomly in CI. How do you make them reliable?

Save to ▾
Show answer
Flaky tests usually come from timing assumptions, shared state, network dependence or slow emulators. Replace fixed delays with waiting for specific conditions, mock or stub network calls with predictable responses, reset app data between tests, and use stable selectors like keys or test IDs instead of text that changes. Give CI emulators enough resources, retry only as a temporary measure, and track flaky tests separately to fix them.
09

How do you build a release version of a Flutter app for both stores?

Save to ▾
Show answer
flutter build appbundle --release --obfuscate --split-debug-info=build/symbols # Output: build/app/outputs/bundle/release/app-release.aab flutter build ipa --release --obfuscate --split-debug-info=build/symbols # Output: build/ios/ipa/*.ipa, upload with Transporter or xcrun altool # Version comes from pubspec.yaml, for example: # version: 2.3.1+45 (name 2.3.1, build number 45)
10

A React Native list of 2000 items scrolls slowly and shows blank areas. How do you fix it?

Save to ▾
Show answer
Use FlatList or FlashList rather than ScrollView with map. Provide a stable keyExtractor, memoise row components with React.memo, avoid inline functions and heavy computation in renderItem, and use getItemLayout or fixed item sizes where possible. Tune windowSize and maxToRenderPerBatch, compress and cache images with a library like expo-image, and test a release build, since dev mode is much slower.
11

What is hot reload and how is it different from hot restart?

Save to ▾
Show answer
Hot reload injects changed code into the running app and rebuilds the UI while keeping the current state, so you see changes in about a second. Hot restart reloads the whole app code and resets state, needed when changing initialisation logic, global variables or app startup. React Native offers Fast Refresh, similar to hot reload. Native code changes, such as new plugins or platform files, require a full rebuild.
12

Write a Dart sealed class for API results and handle it with an exhaustive switch.

Save to ▾
Show answer
sealed class Result<T> {} class Success<T> extends Result<T> { Success(this.data); final T data; } class Failure<T> extends Result<T> { Failure(this.message); final String message; } Widget view(Result<List<String>> r) => switch (r) { Success(:final data) => ListView(children: [for (final s in data) Text(s)]), Failure(:final message) => Center(child: Text(message)), };
13

How do you set up CI/CD for a cross-platform mobile app?

Save to ▾
Show answer
On every pull request, run lint, formatting checks, unit and widget or component tests. On merge, build signed Android and iOS release artifacts using CI services such as GitHub Actions, Codemagic, Bitrise or EAS Build, with signing keys stored as secrets. Use fastlane or EAS Submit to upload to internal testing tracks and TestFlight. Automate version numbers, generate release notes and run smoke tests with Maestro.
14

What are the main differences between Android and iOS that a cross-platform developer must know?

Save to ▾
Show answer
Navigation patterns differ: Android has a system back gesture while iOS relies on swipe-back and navigation bars. Permissions, notification setup, background execution limits, file systems and store review rules differ. iOS builds require a Mac and Xcode, with signing through certificates and provisioning profiles. Design guidelines differ between Material Design and Human Interface Guidelines, so good cross-platform apps adapt some UI per platform.
15

Tell me about a technical decision you made that you later regretted, and what you learned.

Save to ▾
Show answer
Situation: on an earlier project I chose a lesser-known state management package because it looked simpler. Task: support the app as it grew. Action: when the package stopped being maintained, I led a migration to Riverpod feature by feature with tests. Result: the migration took three sprints. I learned to evaluate packages by maintenance activity, community size and testing support, not just initial simplicity, and to document decisions.
16

Write a Riverpod provider that fetches data asynchronously and display it in a widget.

Save to ▾
Show answer
final productsProvider = FutureProvider.autoDispose<List<Product>>((ref) { final repo = ref.watch(productRepositoryProvider); return repo.fetchProducts(); }); class ProductsView extends ConsumerWidget { const ProductsView({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final products = ref.watch(productsProvider); return products.when( loading: () => const Center(child: CircularProgressIndicator()), error: (e, _) => const Center(child: Text('Failed to load')), data: (items) => ListView(children: [for (final p in items) ListTile(title: Text(p.name))]), ); } }
17

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

How do you persist state in React Native between app launches?

Save to ▾
Show answer
For small key-value data use AsyncStorage or MMKV, which is much faster and synchronous. Persist Redux with redux-persist or Zustand with its persist middleware, choosing only the slices that need it. Store tokens in secure storage like expo-secure-store or Keychain and Keystore wrappers, never in plain storage. For larger structured data use SQLite through expo-sqlite or an ORM like WatermelonDB.
19

Tell me about a time you improved app performance in a cross-platform app.

Save to ▾
Show answer
Situation: our React Native order history screen took three seconds to render and scrolled poorly. Task: make it smooth. Action: I profiled with React Native DevTools, replaced ScrollView with FlashList, memoised rows, moved date formatting into the API layer and switched images to a caching library. Result: render time dropped below 600 milliseconds, and frame drops nearly disappeared on budget phones.
20

Explain the core React Native components.

Save to ▾
Show answer
View is the basic container, like a div, supporting flexbox layout and styles. Text displays text, and all strings must be inside Text. Image shows images from network or local sources. TextInput handles keyboard input. Pressable handles touches with press states. ScrollView scrolls a small amount of content, while FlatList and SectionList render long lists virtually. SafeAreaView or the safe area context library keeps content away from notches.
21

Compare Redux Toolkit, Zustand and React Context for state in React Native.

Save to ▾
Show answer
Context is built in and fine for rarely changing values like theme or auth, but every consumer re-renders on change. Redux Toolkit gives a predictable global store with slices, middleware and excellent DevTools, suited to large teams, and RTK Query handles API caching. Zustand is small and simple, with selector-based subscriptions that limit re-renders. Server data is often better handled by TanStack Query than by any global store.
22

Write a Redux Toolkit slice for a cart.

Save to ▾
Show answer
const cartSlice = createSlice({ name: 'cart', initialState: { items: [] }, reducers: { addItem(state, action) { const existing = state.items.find((i) => i.id === action.payload.id); if (existing) existing.qty += 1; else state.items.push({ ...action.payload, qty: 1 }); }, removeItem(state, action) { state.items = state.items.filter((i) => i.id !== action.payload); }, }, }); export const { addItem, removeItem } = cartSlice.actions; export const selectTotal = (s) => s.cart.items.reduce((t, i) => t + i.price * i.qty, 0);
23

An animation stutters whenever the screen fetches data. How do you fix it?

Save to ▾
Show answer
The animation likely runs on the JS thread, and data parsing or re-renders block it. Move the animation to the UI thread with Reanimated or Animated with useNativeDriver, reduce the work done when data arrives by memoising components and normalising state updates, and delay heavy processing with InteractionManager or requestIdleCallback-style scheduling until the animation finishes. Profile with React Native DevTools to confirm.
24

How do you design a mobile app for users on low-end devices and poor networks?

Save to ▾
Show answer
Keep the app size small, avoid heavy animations on low-end phones, and load images at the right resolution with caching. Use pagination and compressed API responses, cache data locally so screens open offline, and show skeleton loaders and clear retry options. Defer non-critical SDK initialisation to speed up startup. Test on budget devices with 2 or 3 GB RAM and throttled networks, since many users in India use them.
25

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')); } } }
26

A startup asks you to choose between Flutter, React Native and native for their new delivery app. How do you decide?

Save to ▾
Show answer
I would ask about team skills, timeline, budget, required features and long-term plans. If the team knows JavaScript and has a web app, React Native allows code and skill sharing. If they want a consistent custom UI and fast development from scratch, Flutter is strong. Heavy background location and maps work well in both with plugins, but if the app depends deeply on platform features, native may be safer. I would prototype one key screen first.
27

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

Write a React Native component that requests location permission and shows the coordinates using Expo.

Save to ▾
Show answer
import * as Location from 'expo-location'; export function MyLocation() { const [coords, setCoords] = useState(null); const [error, setError] = useState(null); useEffect(() => { (async () => { const { status } = await Location.requestForegroundPermissionsAsync(); if (status !== 'granted') { setError('Location permission denied'); return; } const pos = await Location.getCurrentPositionAsync({}); setCoords(pos.coords); })(); }, []); if (error) return <Text>{error}</Text>; if (!coords) return <ActivityIndicator />; return <Text>{coords.latitude}, {coords.longitude}</Text>; }
29

Write a Dart HTTP client using dio with an interceptor that adds an auth token.

Save to ▾
Show answer
final dio = Dio(BaseOptions( baseUrl: 'https://api.example.com', connectTimeout: const Duration(seconds: 10), receiveTimeout: const Duration(seconds: 15), )); dio.interceptors.add(InterceptorsWrapper( onRequest: (options, handler) async { final token = await secureStorage.read(key: 'access_token'); if (token != null) options.headers['Authorization'] = 'Bearer $token'; handler.next(options); }, onError: (e, handler) { if (e.response?.statusCode == 401) authNotifier.logout(); handler.next(e); }, ));
30

A Flutter animation is smooth on a flagship phone but janky on a budget phone. How do you fix it?

Save to ▾
Show answer
Profile on the budget device in profile mode. Common fixes: wrap frequently repainting areas in RepaintBoundary, avoid expensive effects like Opacity on large subtrees, clipping and shadows in scrolling lists, use AnimatedBuilder with child so static parts do not rebuild, precache images and decode them at display size, and move heavy computation to isolates. Reduce animation complexity on low-end devices if needed.
31

How do you stay productive when working with both Android and iOS platforms?

Save to ▾
Show answer
I test every feature on one Android device and one iPhone or simulator before raising a pull request, keep a checklist of common platform differences like permissions, keyboard and safe areas, and use CI builds for both platforms on each merge. I learn basic Kotlin and Swift so I can read native errors and logs. This avoids late surprises when QA tests the second platform.
32

What is the difference between a debug and release build in mobile apps?

Save to ▾
Show answer
Debug builds include debugging tools, hot reload, assertions and unoptimised code, so they are slower and larger. Release builds are compiled ahead of time, minified, optimised and signed with a release key. In Flutter, debug uses JIT while profile and release use AOT compilation; in React Native, release bundles minified JavaScript precompiled to Hermes bytecode. Always measure performance and test critical flows on release or profile builds.
33

What is the React Native New Architecture?

Save to ▾
Show answer
The New Architecture, enabled by default since React Native 0.76, replaces the old asynchronous bridge. JSI lets JavaScript hold references to C++ objects and call native methods synchronously. Fabric is the new renderer supporting concurrent React features and synchronous layout. TurboModules load native modules lazily with typed interfaces generated by Codegen. Bridgeless mode removes the bridge entirely. Together they improve startup, responsiveness and type safety.
34

How do you handle account deletion requirements in mobile apps?

Save to ▾
Show answer
Both major stores require apps that let users create accounts to also let them delete their account from within the app, and the Play Store also requires a web link for deletion requests. Implement a clear settings option, confirm the action, call a backend endpoint that deletes or anonymises user data according to retention rules, revoke tokens, clear local data and sign the user out. Document what is retained for legal reasons.
35

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

Write a go_router configuration with an auth redirect.

Save to ▾
Show answer
final router = GoRouter( initialLocation: '/', refreshListenable: authNotifier, redirect: (context, state) { final loggedIn = authNotifier.isLoggedIn; final goingToLogin = state.matchedLocation == '/login'; if (!loggedIn && !goingToLogin) return '/login'; if (loggedIn && goingToLogin) return '/'; return null; }, routes: [ GoRoute(path: '/', builder: (_, __) => const HomePage()), GoRoute(path: '/login', builder: (_, __) => const LoginPage()), GoRoute( path: '/product/:id', builder: (_, state) => ProductPage(id: state.pathParameters['id']!), ), ], );

Frequently asked questions

Which companies hire Mobile App Development professionals in Ahmedabad?

Companies with large offices in Ahmedabad include many IT services and product firms. Use their company pages below to practise employer-specific sets.

Are Mobile App Development interviews in Ahmedabad different from other cities?

The questions depend more on the company than the city. Ahmedabad's mix of employers decides the style: Companies here value hands-on skills and the ability to work across tools, especially in smaller teams

How do I find Mobile App Development jobs in Ahmedabad?

Shortlist companies with Ahmedabad offices, keep your CV focused on Mobile App Development projects, apply on company career pages and job portals with the Ahmedabad filter, and practise the questions on this page before each interview.