Cupertino widgets are Flutter widgets that mimic the native iOS design system. They follow Apple's Human Interface Guidelines and visually resemble UIKit components used in iOS apps.
Examples include:
CupertinoButtonCupertinoSwitchCupertinoNavigationBarCupertinoTabScaffoldCupertinoDatePickerThey are part of the Flutter SDK and live in the cupertino library.
They matter when you care about platform authenticity. iOS users expect different visuals and interactions than Android users, especially for navigation bars, switches, and dialogs.
Using Cupertino widgets helps Flutter apps feel less "cross-platform" and more native on iOS.
Cupertino widgets are not native iOS views. They are rendered by Flutter itself (Skia), just like Material widgets. This means:
Animations, paddings, and scroll physics are tuned to feel "iOS-native".
Cupertino widgets should be used when a Flutter app needs to strictly follow iOS design principles.
They are particularly useful if the application is iOS-only or when replacing an existing native iOS app and aiming to preserve a familiar look and feel. Cupertino widgets provide native-like controls and navigation patterns, such as:
These elements help ensure consistency with the Apple Human Interface Guidelines (HIG).
Cupertino widgets are also appropriate when targeting users who expect a highly iOS-native experience, for example in:
In these domains, users are often sensitive to platform-specific UI patterns.
It is also possible to mix Cupertino widgets inside a MaterialApp. Wrapping the entire app in CupertinoApp is not required. For example, developers can use:
CupertinoButtonCupertinoSwitchon selected screens while continuing to use Material components elsewhere.
Cupertino widgets are not ideal when an app is cross-platform and aims to maintain a consistent visual language across iOS and Android.
Using Cupertino widgets across multiple screens in such cases can lead to:
They should also be avoided when platform-specific design is not required or when strictly following Apple Human Interface Guidelines is not a priority. In these situations, using Material or custom widgets helps:
Overusing Cupertino widgets can also complicate:
This is because the application must handle subtle differences in rendering and interaction patterns between Cupertino and Material widgets.
Common issues when using Cupertino widgets usually come from misunderstandings about how they interact with the Flutter ecosystem.
CupertinoApp is required to use Cupertino widgets.CupertinoPageScaffold and expecting Material features like FAB.Text without a Material ancestor (Solution: wrap content in Material or provide DefaultTextStyle).Using Cupertino widgets effectively requires selective and intentional usage:
MaterialApp when needed.CupertinoPageScaffold only if you fully commit to iOS structure.Depending on the use case, other approaches may be more appropriate than relying solely on Cupertino widgets:
Switch.adaptive, CircularProgressIndicator.adaptive)Cupertino widgets are best used selectively, not as a blanket replacement for Material.
15 min • Jan 7, 2025
Flutter is loved by many for its simple and fast development of high-quality cross-platform apps. Let’s take a closer look if Flutter is a suitable solution in every case, i.e., when developing mobile, web, and desktop applications.
15 min. • Jun 6, 2023
Flutter is known for its seamless UI/UX features and robust design elements. It allowed us to deliver a unique customer experience in the “CA24 Mobile” banking app. This article shares some of the learnings and pain points behind implementing it in this large project.
14 min • Sep 10, 2024
For a business looking to build a mobile app, the choice between native and cross-platform development directly impacts the entire product development process. This article is packed with insights that will help you make an informed choice between these two approaches, aligning your technical needs with your business objectives.