Flutter
294 bites tagged Flutter — interview questions with model answers, and 60-second explainers.
Auth-protected routes via GoRouter redirect
A top-level redirect reads auth state, sends unauthenticated users to login, sends logged-in users away from login, and uses refreshListenable to re-evaluate on auth change. guarding routes with redirect.
Isolating and reducing excessive widget rebuilds
Push state down, use const subtrees, rebuild only listeners with ValueListenableBuilder, isolate repaints with RepaintBoundary. narrowing rebuild scope.
iOS code signing for a TestFlight release
A signing certificate proves who built the app; a provisioning profile ties cert, app ID and devices together; configure in Xcode, archive and upload. understanding Apple's signing model.
Testing a tap that triggers a SnackBar
PumpWidget the app, find the button, tester.tap it, call pump or pumpAndSettle to advance frames, then expect a SnackBar finder. widget-test interaction flow. forgetting to pump after the tap so the SnackBar never appears.
MethodChannel data flow and type marshalling
Dart invokeMethod sends a StandardMessageCodec-serialized payload to native, which returns a primitive or map; complex objects must be reduced to supported types. how platform channels marshal data.
Building a custom implicitly animated widget
Extend ImplicitlyAnimatedWidget, use AnimatedWidgetBaseState, define tweens in forEachTween, read values in build. understanding the implicit animation machinery.
Diagnosing and fixing CustomPainter jank
Avoid work in paint, gate repaints with shouldRepaint, isolate with RepaintBoundary, cache static layers. optimizing custom canvas rendering. blaming the device or repainting everything every frame.
Immutable bloc state versus mutable ChangeNotifier
Immutable gives predictable diffs, easy debugging and replayability at the cost of boilerplate; mutable is terse but error-prone. reasoning about state mutability trade-offs. declaring one universally superior with no nuance.
Provider package versus raw InheritedWidget
It removes boilerplate, adds lifecycle disposal and scoped reads, and exposes select for granular rebuilds. why Provider wraps InheritedWidget. thinking Provider is unrelated to InheritedWidget or is its own state engine.
Per-tab navigation stacks with StatefulShellRoute
StatefulShellRoute keeps a separate Navigator and preserved state per branch, with a shared shell scaffold. building independent per-tab stacks. rebuilding tab contents or losing scroll and stack on tab switch.
LayoutBuilder versus MediaQuery for responsive widgets
MediaQuery reports the whole window; LayoutBuilder gives the parent's actual constraints. knowing layout constraints versus screen metrics. claiming they are interchangeable for sizing nested components.
Classic BLoC with Streams and Sinks
Classic BLoC separates UI from business logic by exposing inputs as Sinks and outputs as Streams. The widget pushes events into sinks, the BLoC processes them, and emits new state on streams that the UI rebuilds from, keeping logic testable and…
How would you optimize Flutter CI build times beyond caching?
Tests platform build pipeline knowledge and CI design. Answers hit Gradle parallelism and R8 config for Android, Xcode derived data, target thinning on iOS, plus Dart AOT flags and sharding.
Securely inject secrets for build flavors in CI/CD
Contrast CI environment variable injection with runtime secrets-manager fetches via CLI, comparing rotation overhead and blast radius. Secret management and threat modeling for CI/CD build flavors.
Propose a Dart FFI approach to share camera frames and its risks
Tests zero-copy frame sharing via Dart FFI plus ownership and thread hazards. Propose native allocation, pass pointer to Dart as external TypedData, use ring buffer, then free; cite use-after-free and races.
Structure a POST request to send a Dart object as JSON
Set Content-Type application/json, serialize to Map via toJson, encode with dart:convert jsonEncode, and pass the string as body. Your grasp of HTTP semantics and Dart serialization.
Design a BLoC solution for an API call that updates multiple UIs
Decoupled BLoC orchestration for multi-surface updates. Use a coordinator stream so each BLoC subscribes independently while keeping loading and error states local per widget. Directly nesting one BLoC inside another or using global variables for shared state.
Riverpod providers are objects, not widgets. What are the practical advantages?
Tests architectural decoupling of state and UI in Flutter. Strong answers hit compile-time safety, unit testing without widget trees, and logic that survives outside BuildContext. Red flag: praising syntax sugar without explaining the coupling problem.
Design an immutable UserSettings class with copyWith for Flutter state
Tests immutability as Flutter's state foundation. A great answer shows final fields, a const constructor, copyWith with nullable named params and null-aware fallback, and explains how immutability prevents accidental shared mutations during rebuilds.
Explain map() vs where() on a List and chain them
This tests Dart Iterable laziness and correct chaining. A strong answer states where filters and map transforms, both return Iterables, then chains where before map and converts with toList. A red flag is claiming the original list mutates or omitting toList.
Explain the difference between tester.pump and tester.pumpAndSettle
This tests your grasp of Flutter frame scheduling. pump draws one frame; pumpAndSettle loops until idle, failing on infinite animations. A red flag is treating pumpAndSettle as universally safe or missing why a loading spinner causes timeouts.
Persist a custom Dart object using shared_preferences
Tests JSON serialization bridging custom objects to primitive-only key-value storage. Strong answer: add toJson/fromJson on User, jsonEncode into SharedPreferences as String, jsonDecode on read. Red flag: proposing direct storage or toString hacks.
How do you synchronize app state with GoRouter navigation?
Read auth state in top-level redirect; rebuild GoRouter via refreshListenable on changes; handle deep links in page builders. declarative routing and state-driven redirects.
How do you handle CPU-bound tasks without freezing the Flutter UI?
Tests whether you know async/await yields for I/O but cannot parallelize CPU work. A strong answer defines Isolates as isolated heaps with message-passing, contrasts them with threads, and shows how compute() wraps Isolate.spawn.
Get Flutter bites daily.
Five a day, five minutes, offline. With quizzes so it sticks.
Open testing — you’ll join as an early tester.