Does Flutter automatically display Cupertino UI in iOS and Material in Android with a single codebase?

Flutter

Flutter Problem Overview


I need to know whether Flutter will render the iOS Cupertino style on iOS and Material on Android with a single codebase. I want to know this before starting to develop my app with Flutter.

If it's not, how would I manage the two different UI in a single code? I can't possibly use if/else everywhere over the code.

Flutter Solutions


Solution 1 - Flutter

You should try the gallery app: https://play.google.com/store/apps/details?id=io.flutter.demo.gallery&hl=en In there, when you press the menu button you can set platform mechanics to be Mountain View (Android) or Cupertino (iOS). That way you can see how it's going to look in either platform.

Here is an example of selecting Cupertino or Material with code depending on the platform: https://medium.com/flutter-io/do-flutter-apps-dream-of-platform-aware-widgets-7d7ed7b4624d As far as I know you have to choose the widgets like this.

Solution 2 - Flutter

These capabilities are under development. I suggest to look into this library: https://pub.dartlang.org/packages/flutter_platform_widgets

Other than that, there is a lot you can do already, even without this library. Everything depends on your resources, requirements and complexity of your project.

For example, if you are working alone or in a small team, your project's complexity is probably not overwhelming, and your entire application will consist only of a couple of dozens of Widget derived classes at max. In this case, maybe you can deliberately program the platform-adaptive behavior in your custom Widget classes, so that you'll be happy working with them long-term.

This workflow is not always applicable, and may seem complicated at the beginning, but it will become more natural later.

Solution 3 - Flutter

As of recently, Flutter has added adaptive constructors for Switch, SwitchListTile, and CircularProgressIndicator which will help further progress platform-aware widgets within a single codebase. While these are the only three as of now, expect more in the future!

Solution 4 - Flutter

Below simple implementation:

class AdaptiveSwitch extends StatelessWidget {
  const AdaptiveSwitch({Key key,
      @required this.value,
      @required this.onChanged,
      this.activeColor,
      this.dragStartBehavior = DragStartBehavior.start})
      : assert(dragStartBehavior != null),
        super(key: key);

  final bool value;

  final ValueChanged<bool> onChanged;

  final Color activeColor;

  final DragStartBehavior dragStartBehavior;

  @override
  Widget build(BuildContext context) {
    return Theme.of(context).targetPlatform = TargetPlatform.iOS
        ? CupertinoSwitch(
            value: value,
            activeColor: activeColor,
            onChanged: onChanged,
            dragStartBehavior: dragStartBehavior,
          )
        : Switch(
            value: value,
            activeColor: activeColor,
            onChanged: onChanged,
            dragStartBehavior: dragStartBehavior,
          );
  }
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSuuSoJeatView Question on Stackoverflow
Solution 1 - FlutterGazihan AlankusView Answer on Stackoverflow
Solution 2 - Flutterbradib0yView Answer on Stackoverflow
Solution 3 - FlutterJoshView Answer on Stackoverflow
Solution 4 - FlutterBambinoUAView Answer on Stackoverflow