446

For UI that should differ slightly on iOS and Android, i.e. on different platforms, there must be a way to detect which one the app is running on, but I couldn't find it in the docs. What is it?

Gavin
  • 6,495
  • 3
  • 21
  • 22

20 Answers20

884
import 'dart:io' show Platform;

if (Platform.isAndroid) {
  // Android-specific code
} else if (Platform.isIOS) {
  // iOS-specific code
}

All options include:

Platform.isAndroid
Platform.isFuchsia
Platform.isIOS
Platform.isLinux
Platform.isMacOS
Platform.isWindows

You can also detect if you are running on the web using kIsWeb, a global constant indicating if the application was compiled to run on the web:

import 'package:flutter/foundation.dart' show kIsWeb;

if (kIsWeb) {
  // running on the web!
} else {
  // NOT running on the web! You can check for additional platforms here.
}
Md. Yeasin Sheikh
  • 54,221
  • 7
  • 29
  • 56
Westy92
  • 19,087
  • 4
  • 72
  • 54
126

Thanks to Collin, the final answer is:

bool isIOS = Theme.of(context).platform == TargetPlatform.iOS;
CopsOnRoad
  • 237,138
  • 77
  • 654
  • 440
Gavin
  • 6,495
  • 3
  • 21
  • 22
  • 3
    Only this answer is up-to-date with the latest Flutter framework. The rest answers are not wrong but defaultTargetPlatform seems to be no longer part of the framework – Stoycho Andreev Dec 10 '17 at 14:31
  • 1
    This solution allow you to change the platform during tests, something that I couldn't with `Platform.isIOS` – César N. Feb 03 '21 at 06:24
  • 4
    Watch out on this solution. If it's called in ```initstate()``` it will throw an exception as ```Theme.of()``` is a inherited widgets and will listen to changes. Which cannot be done in ```initstate()``` so it throws exception – Panagiss Jun 13 '22 at 20:51
46

Although defaultTargetPlatform will work, I would suggest using Theme.of(context).targetPlatform. This enables testing of iOS behavior (because defaultTargetPlatform is always TargetPlatform.android in tests). It also allows ancestors of your widget to override its target platform by wrapping it in a Theme widget.

Md. Yeasin Sheikh
  • 54,221
  • 7
  • 29
  • 56
Collin Jackson
  • 110,240
  • 31
  • 221
  • 152
  • 1
    May I ask what is the difference between what is proposed and this `if (Platform.isIOS) {//my iOS widgets}` – Shady Aziza Aug 28 '17 at 21:31
  • 4
    `Platform.isIOS` has the same problems as `defaultTargetPlatform`. It doesn't work in tests and can't be overwritten by the `Theme` widget. – Collin Jackson Aug 28 '17 at 21:33
  • 2
    Now you can override defaultTargetPlatform in unittest with debugDefaultTargetPlatformOverride https://api.flutter.dev/flutter/foundation/debugDefaultTargetPlatformOverride.html – Yuwen Yan Nov 20 '19 at 08:32
  • Yuwen Yan is wrong, per debugDefaultTargetPlatform doc Setting debugDefaultTargetPlatformOverride (as opposed to, say, ThemeData.platform) will cause unexpected and undesirable effects. For example, setting this to TargetPlatform.iOS when the application is running on Android will cause the TalkBack accessibility tool on Android to be confused because it would be receiving data intended for iOS VoiceOver. Similarly, setting it to TargetPlatform.android while on iOS will cause certainly widgets to work assuming the presence of a system-wide back button, which – Fred Grott Nov 29 '22 at 14:55
42
import 'dart:io' show Platform;  //at the top

String os = Platform.operatingSystem; //in your code
print(os);
Phani Rithvij
  • 4,030
  • 3
  • 25
  • 60
C-Spydo
  • 789
  • 8
  • 8
26

It is simple just import the io library

import'dart:io' show Platform;
void main(){
if(Platform.isIOS){
  return someThing();
}else if(Platform.isAndroid){
  return otherThing();
}else if(Platform.isMacOS){
  return anotherThing();
}

or in very simple way

Platform.isIOS ? someThing() : anOther(),
Osama Buzdar
  • 1,115
  • 10
  • 20
  • 2
    This is the correct answer. You simply need to remove any dart:HTML import from your code as it will cause an error. – tyler powell Jul 29 '20 at 15:24
22
if (Platform.isAndroid) {
  // Android-specific code/UI Component
} else if (Platform.isIOS) {
  // iOS-specific code/UI Component
}

Don't forget to import IO Library.

import 'dart:io';

If you are using import 'dart:html'; too in same file then you have to specify Platform definition as both libraries has definition of "Platform"

in that case use Platform Specific Code like Below:

import 'dart:io' as IO;
import 'dart:html';

if (IO.Platform.isAndroid) {
  // Android-specific code/UI Component
} else if (IO.Platform.isIOS) {
  // iOS-specific code/UI Component
}

If you are looking into Platform Integration properly I would Suggest Use Complete Example on Flutter site: https://flutter.dev/docs/development/platform-integration/platform-channels

Skandar Munir
  • 409
  • 5
  • 12
21

for more simple way for web and app both.try this

import 'dart:io' show Platform;
import 'package:flutter/foundation.dart' show kIsWeb;


var platformName = '';
if (kIsWeb) {
  platformName = "Web";
} else {
  if (Platform.isAndroid) {
    platformName = "Android";
  } else if (Platform.isIOS) {
    platformName = "IOS";
  } else if (Platform.isFuchsia) {
    platformName = "Fuchsia";
  } else if (Platform.isLinux) {
    platformName = "Linux";
  } else if (Platform.isMacOS) {
    platformName = "MacOS";
  } else if (Platform.isWindows) {
    platformName = "Windows";
  }
}
print("platformName :- "+platformName.toString());
Shirsh Shukla
  • 5,491
  • 3
  • 31
  • 44
17

You can do

defaultTargetPlatform == TargetPlatform.iOS
          ? kIOSTheme
          : kDefaultTheme,

from import 'package:flutter/foundation.dart';

Rémi Rousselet
  • 256,336
  • 79
  • 519
  • 432
15

Most "Flutter" answer is as follows:

import 'package:flutter/foundation.dart' show TargetPlatform;

//...

if(Theme.of(context).platform == TargetPlatform.android)
    //do sth for Android
else if(Theme.of(context).platform == TargetPlatform.iOS)
    //do sth else for iOS
else if(Theme.of(context).platform == TargetPlatform.fuchsia)
    //even do sth else for Fuchsia OS
Ugurcan Yildirim
  • 5,973
  • 3
  • 42
  • 73
9

you can add this extension file (platform_ext.dart) to the project and call in any object

import 'dart:io';
import 'package:flutter/foundation.dart' show kIsWeb;

extension Target on Object {
  bool isAndroid() {
    return Platform.isAndroid;
  } 
  bool isIOS() {
    return Platform.isIOS;
  } 
  bool isLinux() {
  return Platform.isLinux;
  } 
  bool isWindows() {
  return Platform.isWindows; 
  }
  bool isMacOS() {
  return Platform.isMacOS; 
  }
  bool isWeb() {
  return kIsWeb; 
  }
  // ···
}

just import the file and call it

   import 'platform_ext.dart';
        ....
        @override
          Widget build(BuildContext context) {
            return isAndroid()? Text("Android"):Text("Not Android");
          }
Omar Mahmoud
  • 2,902
  • 1
  • 14
  • 22
  • 1
    This is really an overkill. Why would each and every object knew about Platforms? While it is convenient it is terrible now that your String object will know what platform it is.. Keep this in separate class that you can instantiate when you need this info.. – Martin Berger Nov 29 '22 at 14:20
7

You can use Universal Platform package:

https://pub.dev/packages/universal_platform

import 'package:universal_platform/universal_platform.dart';

bool isIos = UniversalPlatform.isIOS;
bool isAndroid = UniversalPlatform.isAndroid;
bool isWeb = UniversalPlatform.isWeb;
print('iOS: $isIos');
print('Android: $isAndroid');
print('Web: $isWeb');
  • I recommend this... because only after I noticed strange behavior of **Platform.isIOS** on different browsers, I felt this was a package to go to! By the way it does deliver all 7 platforms – Yo Apps Oct 19 '20 at 18:24
  • 2
    universal_platform just uses Platform.isWindows, Platform.isAndroid, etc. under the hood. – spekary Nov 12 '20 at 18:27
7
import 'dart:io' as io;

if(io.Platform.isAndroid){
 doSomething();
}else {
 doSomethingElse();
}
Anuran Barman
  • 109
  • 1
  • 5
6

So here is a little utility I use to detect platforms and os to be reactive as appropriate.

import'dart:io' show Platform;
import 'package:flutter/foundation.dart' show kIsWeb;

class Util {

  os getPlatform() {
    if (kIsWeb) {
      return os.Web;
    } else if (Platform.isIOS) {
      return os.IOS;
    } else if (Platform.isAndroid) {
      return os.Android;
    } else if (Platform.isFuchsia) {
      return os.Fuchsia;
    } else if (Platform.isLinux) {
      return os.Linux;
    } else if (Platform.isMacOS) {
      return os.MacOS;
    } else if (Platform.isWindows) {
      return os.Windows;
    }
    return os.Unknown;
  }

  bool isWeb() {
    return (getPlatform()==os.Web);
  }

  bool isMobile() {
    os platform = getPlatform();
    return (platform == os.Android || platform == os.IOS || platform== os.Fuchsia);
  }

  bool isComputer() {
    os platform = getPlatform();
    return (platform == os.Linux || platform == os.MacOS || platform== os.Windows);
  }

}

enum os { Unknown, Web, Android, Fuchsia, IOS, Linux, MacOS, Windows }

hunterino
  • 134
  • 1
  • 7
4
import 'dart:io' show Platform;

if (Platform.isAndroid) {
  // Android-specific code
} else if (Platform.isIOS) {
  // iOS-specific code
}else if (Platform.isFuchsia) {
  // Fuchsia-specific code
}else if (Platform.isLinux) {
  // Linux-specific code
}else if (Platform.isMacOS) {
  // MacOS-specific code
}else if (Platform.isWindows) {
  // Windows-specific code
}else if (Platform.isWindows) {
  // Windows-specific code
}

for web

import 'package:flutter/foundation.dart' show kIsWeb;

if (kIsWeb) {
  // running on the web!
} else {
  // NOT running on the web! You can check for additional platforms here.
}
Anand
  • 4,355
  • 2
  • 35
  • 45
1

If you just need a string for logging purposes, you can use Platform.operatingSystem, which returns the OS name as a lowercase string.

import 'dart:io';
import 'package:flutter/foundation.dart';

String _getPlatform() {
  if (kIsWeb) return 'web';
  return Platform.operatingSystem;
}
Suragch
  • 484,302
  • 314
  • 1,365
  • 1,393
1
**multiple platform you check and run your code according specific platform **

bool isIOS = Theme.of(context).platform == TargetPlatform.iOS;
bool isAndroid = Theme.of(context).platform == TargetPlatform.android;
bool islinux = Theme.of(context).platform == TargetPlatform.linux;
bool isfuchsia = Theme.of(context).platform == TargetPlatform.fuchsia;
bool isMacOS = Theme.of(context).platform == TargetPlatform.macOS;
bool iswindows = Theme.of(context).platform == TargetPlatform.windows;
mewadaarvind
  • 349
  • 3
  • 9
1

You can add this extensions to your project

import 'package:flutter/material.dart';

extension PlatformExtension on BuildContext {
  bool get isMobile =>
      Theme.of(this).platform == TargetPlatform.iOS ||
      Theme.of(this).platform == TargetPlatform.android;

  bool get isDesktop =>
      Theme.of(this).platform == TargetPlatform.macOS ||
      Theme.of(this).platform == TargetPlatform.windows ||
      Theme.of(this).platform == TargetPlatform.linux;
}

extension TargetPlatformExtension on TargetPlatform {
  bool get isMobile =>
      this == TargetPlatform.iOS || this == TargetPlatform.android;

  bool get isDesktop =>
      this == TargetPlatform.linux ||
      this == TargetPlatform.macOS ||
      this == TargetPlatform.windows;
}

Now you can access the host platform using.

  1. BuildContext => context.isDesktop

  2. TargetPlatform => defaultTargetPlatform.isDesktop

It is recommended to access the platform from context.

To detect if your app is running on browsers, you can easily use the kIsWeb constant from the foundation library.

import 'package:flutter/foundation.dart';

  log('$kIsWeb'); // will print true if the app is running on a browser

Note that if you are running a web app on a desktop, the isDesktop getter will return true, and same thing for mobile platforms. And to avoid that.

import 'package:flutter/foundation.dart';

  if (!kIsWeb && defaultTargetPlatform.isDesktop) {
    // do stuff for desktop apps only
  }

  if (!kIsWeb && defaultTargetPlatform.isMobile) {
    // do stuff for mobile apps only
  }

You can modify the extensions to get your preferred implementation.

0

Checking Host Platform in Dart.

import 'dart:io' as IO;

_checkingHostPlatform(){
    if(IO.Platform.isAndroid){
      //Execute code for android
    }else if(IO.Platform.isIOS){
      //Execute code for iOS
    }else{
      //Execute code for other platforms
    }
  }
0

If you import both "dart:io" and "dart:html", it does not understand which Platform to import and gives error. So import one of them.

import 'dart:io';
Platform.isIOS ? CupertinoWidget() : MaterialWidget()
Yunus Gedik
  • 53
  • 1
  • 9
0

This custom-created class will help you to detect the platform:

import 'package:flutter/foundation.dart'
    show defaultTargetPlatform, kIsWeb, TargetPlatform;

enum Os {
  web,
  android,
  ios,
  macOS,
  linux,
  windows,
  fuchsia,
}

class Platform {
  const Platform();

  /// Platform is Web.
  static bool get isWeb => os == Os.web;

  /// Platform is Android.
  static bool get isAndroid => os == Os.android;

  /// Platform is IOS.
  static bool get isIOS => os == Os.ios;

  /// Platform is Fuchsia.
  static bool get isFuchsia => os == Os.fuchsia;

  /// Platform is Linux.
  static bool get isLinux => os == Os.linux;

  /// Platform is MacOS.
  static bool get isMacOS => os == Os.macOS;

  /// Platform is Windows.
  static bool get isWindows => os == Os.windows;

  /// Platform is Android or IOS.
  static bool get isMobile => isAndroid || isIOS;

  /// Platform is Android or IOS or Fuchsia.
  static bool get isFullMobile => isMobile || isFuchsia;

  /// Platform is Linux or Windows or MacOS.
  static bool get isDesktop => isLinux || isWindows || isMacOS;

  /// Getting the os name.
  static Os get os {
    if (kIsWeb) {
      return Os.web;
    }
    switch (defaultTargetPlatform) {
      case TargetPlatform.android:
        return Os.android;
      case TargetPlatform.iOS:
        return Os.ios;
      case TargetPlatform.macOS:
        return Os.macOS;
      case TargetPlatform.windows:
        return Os.windows;
      case TargetPlatform.fuchsia:
        return Os.fuchsia;
      case TargetPlatform.linux:
        return Os.linux;
    }
  }
}

ahmnouira
  • 1,607
  • 13
  • 8
  • This is problematic, because web isn't entirely a seperate platform. Users can be on Android mobile and look at the site from their browsers, for example. – Valiumdiät May 02 '23 at 14:30