A collection of widgets that adapt to match the preferred style of the current platform


Flutter is a great development platform, but often different platforms require different UI components to match the style the user is most familiar with (i.e. Material on Android and Cupertino on iOS). This platform aims to make detecting and switching between those platforms as simple as throwing it in another widget that does all the work.

Getting Started

The simplest use case is just the AdaptableWidget:

Widget build() {
  return AdaptableWidget(
    android: AndroidWidget(...),
    ios: CupertinoWidget(...),
    fuschia: FuschiaWidget(...),
    windows: WindowsWidget(...), //Currently not supported
    macos: MacOSWidget(...), //Currently not supported
    web: WebWidget(...), //Support coming soon

Other Widgets

These other widgets wrap the AdaptableWidget to provide common-use-case adaptations with less boilerplate.


This is an easy way to switch between MaterialApp and CupertinoApp so that the material and cupertino widgets have the proper ancestors.


Widget build() {
  return AdaptableApp(
    title: "My App",
    materialTheme: ThemeData(...),
    cupertinoTheme: CupertinoThemeData(...),
    home: MyHomePage(...),


The aim of AdaptableScaffold is to switch between Scaffold or CupertinoScaffoldPage without having to write the child UI code twice.


Widget build() {
  return AdaptableScaffold(
    child: MyHomePage(), //Required
    appBar: AppBar(...),
    cupertinoNavigationBar: cupertinoNavigationBar(...),
    backgroundColor: Colors.white,
    resizeToAvoidBottomInset: true,


Buttons are one Widget that often have a certain look and feel on different platforms. This AdaptableButton class provides simply a child and an onPressed callback.


Widget build() {
  return AdaptableButton(
    child: Text("Tap Me!"),
    onPressed: doSomething,


Switches between TextField and CupertinoTextField based on the platform.

Helper Functions


This function returns a TextStyle or based on the Platform.