Screens Flutter draws itself.
Every element is a widget in one tree, so a brand interface is composed rather than negotiated with two platform toolkits
the design you signed off, rendered rather than approximated
Flutter app development · UAE
One Dart codebase for both stores is the part everyone sells. The part that matters here is direction, because a product in two scripts is where a borrowed layout gives up.
Settle the direction before the first screenWhat Flutter app development is
Flutter renders every pixel through its own engine rather than borrowing the platform’s widgets. Direction becomes something the layout is told, instead of something each platform decides for it.
Impeller draws the interface directly, so the app does not inherit two sets of platform layout quirks. The screen you approved is the screen that ships, on both stores and across a wide manufacturer tail.
Directionality sets the reading direction and EdgeInsetsDirectional takes start and end rather than left and right. An Arabic screen is the same screen, mirrored by the framework, not a second design somebody maintains.
Identity and payment still reach native code, through a channel into Swift and Kotlin. One language does not mean one runtime, and the honest version of a Flutter pitch says so before the build rather than after.
The scope
Six outputs from a Flutter engagement. Four come from the rendering model, one from the language, and one from the seam it cannot render its way past.
Every element is a widget in one tree, so a brand interface is composed rather than negotiated with two platform toolkits
the design you signed off, rendered rather than approximated
A change appears in the running app in under a second, so a screen is reviewed in the round it was drawn rather than the round after
more passes inside the same fortnight, including the Arabic one
A method channel invoking a native payment SDK on both platforms, handled in Swift and in Kotlin
one language, and a written list of what still needs two
The same widget tree drawn by the same engine, so there is no per-platform layout drift to chase and no second visual QA pass
one interface to review rather than two
Platform conventions available where a user expects them, without maintaining two design systems to get them
an app that reads as native where that matters and as yours everywhere else
The build extended to a browser only where a user genuinely arrives there, such as a partner portal nobody will install
a surface added on evidence rather than on principle
Three ways an Arabic screen gets built
Every approach produces a correct first Arabic screen. They diverge at the tenth, and again the first time somebody adds a feature.
| Translated stringsOne layout, the text swapped | A second mirrored designDrawn again, maintained separately | One directional layoutBuilt once, mirrored by the framework | |
|---|---|---|---|
| The first Arabic screen | Quick, and wrong: hardcoded left and right padding does not mirror. | A full second design pass, and it does look right. | The same screen with direction supplied, rather than a screen drawn twice. |
| The tenth | Ten screens of alignment faults nobody put in the plan. | Ten more artboards, and two files that have to stay in step. | No extra layout work at all, because the widgets already read direction. |
| A new feature | Ships in English, breaks in Arabic, and a user finds it first. | Built twice, and the Arabic one lags by a release or two. | Built once and correct in both, because there is only one layout. |
| When a designer leaves | Nothing to hand over, because nothing was ever decided. | Two design files, and only one of them was being maintained. | One file and one rule: start and end, never left and right. |
When the product genuinely ships in both scripts, which in this market is most consumer work and a good deal of the rest. Where English is the whole audience, this column is worth very little and the framework should be chosen on the integration list instead, which is the hub’s argument rather than this page’s. The type half of the same problem, an Arabic companion face that actually exists, is settled at identity.
What we find on Flutter work here
Webzenia has worked with Gulf clients since 2018. Four things about Flutter in a bilingual market, including the one a third of this market is actually searching for.
One engine draws both, so a mirrored layout is the same tree told to read the other way. A Deira family trading house on a mainland DET licence, serving an Arabic counter trade and an English corporate one, is buying that second consistency rather than the first.
Flutter mirrors a layout written with start and end. One written with left and right stays where it was put, so adding Arabic later means revisiting the padding, the alignment and the icon direction on every screen rather than editing a file of strings.
A Jumeirah beauty brand on a mainland DET licence taking instalments and a verified sign-in is reaching two native SDKs from Dart, not avoiding them. The rail list decides that scope, and it is written before the framework is defended.
That makes the real decision hire against commission, and it turns on year two rather than year one. A Dubai Internet City software firm on a free zone licence that inherited a Flutter portal from a departed contractor has already run the experiment.
What the engagement covers
The engagement in six stages. The direction is settled in the first, because every stage after it is priced by that answer.
The feature list, the device floor, and whether the product ships in one script or two. That last answer changes the design system, the review cycle and the store listing, so it is settled first rather than deferred.
One set of screens with start and end alignment rather than left and right, reviewed in both directions on the same artboards. The Arabic version is a reading of the design, not a second copy of it.
Your APIs, the payment sheet and the identity app-switch, each reached through a named channel with a native handler on both sides. Nothing is dropped to keep the Dart codebase tidy.
The build run in English and in Arabic on physical devices from both platforms, because a mirrored layout and a longer string are the two things a simulator is most confident and most wrong about.
Listing text, release notes and screenshots produced in both languages, with the Arabic screenshots taken from the mirrored build rather than the English one with translated captions bolted on.
Code, documentation and the one rule that keeps the product bilingual: directional insets, never hardcoded sides. A team that inherits the rule keeps the property; a team that inherits only the code loses it in a sprint.
Our stack
The framework, the language, the design file, the crash log and the build service. Select one to see what it does for the second script.
Flutter ships its own rendering engine, its own widget set and its own directional primitives, so reading direction is a property of the layout rather than a behaviour each platform supplies differently.
We use the directional widgets from the first screen rather than the first bug report, because the framework mirrors a layout that asked to be mirrored and leaves one that did not exactly where it was put.
How the build runs
A bilingual product does not break at launch. It breaks in the third release after it, when a feature ships in one script and waits in the other.
We settle whether the product ships in one script or two, and design against that answer rather than around it. In the same fortnight the rails are listed, because identity and payment reach native code through channels regardless of the framework and that is the part a Flutter quote most often leaves out.
The interface is built with directional insets from the first widget, so a mirrored reading needs no second layout. The channels are written with a native handler on each side, and hot reload is spent on reviewing screens in both directions while changing them is still an afternoon rather than a sprint.
Every release ships both readings or it does not ship, and crash reports are read with the active locale attached so a fault that only appears in one direction is visible rather than averaged away. A bilingual product decays quietly: the English side keeps moving, the Arabic side stops being checked, and eighteen months later there are two products with one budget.
Reported with the locale attached, so a fault in one direction is never an average.
Our commitment
A bilingual Flutter product fails in the second script, months after launch. These four are written into the scope because that is where it happens.
Arabic layout from the first screen.
Start and end rather than left and right, everywhere, from the first widget. Retrofitting direction into a laid-out interface is a second pass over every screen, and it is the single most avoidable cost on a bilingual build.
A native speaker reads the Arabic.
Before it ships, not after a customer writes in. A layout can mirror correctly and still read badly, and no amount of framework support substitutes for a person who reads the language checking the screen.
Every feature ships in both languages.
Release parity is a rule in the scope rather than an intention. The alternative is a product whose second language slowly stops matching the first, which is how a bilingual app becomes an English app with an Arabic archive.
We say when Flutter is wrong for you.
A graphics-heavy product, a platform SDK with no maintained plugin and a hard date, or a team that already writes React every day. In those cases we say so, and the honest recommendation costs us the build rather than you the year.
Common questions
Keep exploring
Native Swift, and the entity Apple publishes as seller.
Kotlin, and the five manufacturer skins this market runs.
One codebase, and the parts written per platform.
For teams that already write React and have to hold it.
A shopping app costed against the repeat order.
Two-sided products where the fleet is the harder half.
Internal apps for staff who are not at a desk.
Subscription products whose customer is a licensed company.
A component system engineering builds from, in both directions.
Next step
Send what the app has to do and which scripts it ships in. We will come back with the build shape and where the directional work sits.
Tell us what you need.