【问题标题】:你如何从 Dart 代码中检测宿主平台?
【发布时间】:2018-02-06 01:07:05
【问题描述】:

对于应该在 iOSAndroid 上略有不同的 UI,即在 不同的平台 上,必须有一种检测应用程序正在运行的方法,但我在文档中找不到它。这是什么?

【问题讨论】:

    标签: dart flutter


    【解决方案1】:
    import 'dart:io' show Platform;
    
    if (Platform.isAndroid) {
      // Android-specific code
    } else if (Platform.isIOS) {
      // iOS-specific code
    }
    

    所有选项包括:

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

    您还可以使用kIsWeb 检测您是否在网络上运行,这是一个全局常量,指示应用程序是否已编译为在网络上运行:

    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.
    }
    

    【讨论】:

    • Undefined name 'Platform'.dart(undefined_identifier) 使用Platform 是否有任何先决条件?
    • 我已更新我的答案以包含所需的导入。
    • @NatoBoram 你必须在类的方法中调用 Platform.isAndroid,在类中直接调用不起作用
    • 请注意,这不适用于 Flutter Web。由于依赖 dart:io 引发异常
    • @Srikanth 如果您在检查其他平台之前检查kIsWeb,就像我的回答显示的那样,它会正常工作。我刚刚在 Dartpad 网站上验证了这一点。
    【解决方案2】:

    感谢Collin,最终的答案是:

    bool isIOS = Theme.of(context).platform == TargetPlatform.iOS;
    

    【讨论】:

    • 只有这个答案是最新的 Flutter 框架。其余答案没有错,但 defaultTargetPlatform 似乎不再是框架的一部分
    • 此解决方案允许您在测试期间更改平台,这是我无法使用 Platform.isIOS
    【解决方案3】:
    import 'dart:io' show Platform;  //at the top
    
    String os = Platform.operatingSystem; //in your code
    print(os);
    

    【讨论】:

    • 请注意,这不适用于 Flutter Web。由于依赖 dart:io 而抛出异常
    【解决方案4】:

    虽然defaultTargetPlatform 可以,但我建议使用Theme.of(context).targetPlatform。这可以测试 iOS 行为(因为 defaultTargetPlatform 在测试中始终是 TargetPlatform.android)。它还允许您的小部件的祖先通过将其包装在 Theme 小部件中来覆盖其目标平台。

    【讨论】:

    • 请问提议的和这个if (Platform.isIOS) {//my iOS widgets}有什么区别@
    • Platform.isIOSdefaultTargetPlatform 有同样的问题。它在测试中不起作用,并且不能被 Theme 小部件覆盖。
    • 现在您可以使用 debugDefaultTargetPlatformOverride api.flutter.dev/flutter/foundation/… 覆盖单元测试中的 defaultTargetPlatform
    【解决方案5】:

    很简单,只需要导入io库

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

    或者以非常简单的方式

    Platform.isIOS ? someThing() : anOther(),
    

    【讨论】:

    • 这是正确答案。您只需从代码中删除任何 dart:HTML 导入,因为它会导致错误。
    【解决方案6】:
    if (Platform.isAndroid) {
      // Android-specific code/UI Component
    } else if (Platform.isIOS) {
      // iOS-specific code/UI Component
    }
    

    别忘了导入 IO 库。

    import 'dart:io';
    

    如果您也在同一个文件中使用import 'dart:html';,那么您必须指定平台定义,因为两个库都有“平台”的定义

    在这种情况下,请使用以下平台特定代码:

    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
    }
    

    如果您正在正确研究平台集成,我建议在 Flutter 网站上使用完整示例: https://flutter.dev/docs/development/platform-integration/platform-channels

    【讨论】:

      【解决方案7】:

      大多数“颤振”的答案如下:

      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
      

      【讨论】:

        【解决方案8】:

        你可以的

        defaultTargetPlatform == TargetPlatform.iOS
                  ? kIOSTheme
                  : kDefaultTheme,
        

        来自import 'package:flutter/foundation.dart';

        【讨论】:

        • 它不再起作用了。我未能获得 defaultTargetPlatform。
        • 可能与您昨天添加到帖子中的导入有关。 :D
        【解决方案9】:

        对于网络和应用程序更简单的方法。试试这个

        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());
        

        【讨论】:

          【解决方案10】:

          您可以将此扩展文件添加到项目中并调用任何对象

          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; 
            }
            // ···
          }
          

          只需导入文件并调用它

          @override
            Widget build(BuildContext context) {
              return isAndroid()? Text("Android"):Text("Not Android");
            }
          

          【讨论】:

            【解决方案11】:
            import 'dart:io' as io;
            
            if(io.Platform.isAndroid){
             doSomething();
            }else {
             doSomethingElse();
            }
            

            【讨论】:

              【解决方案12】:

              您可以使用通用平台包:

              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');
              

              【讨论】:

              • 我推荐这个...因为只有在我注意到 Platform.isIOS 在不同浏览器上的奇怪行为之后,我才觉得这是一个可以使用的包!顺便说一句,它确实提供了所有 7 个平台
              • universal_platform 只是在底层使用 Platform.isWindows、Platform.isAndroid 等。
              【解决方案13】:

              所以这里有一个小实用程序,我用来检测平台和操作系统是否适当地反应。

              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 }
              
              

              【讨论】:

                【解决方案14】:

                如果您只需要一个字符串来记录日志,您可以使用Platform.operatingSystem,它将操作系统名称作为小写字符串返回。

                import 'dart:io';
                import 'package:flutter/foundation.dart';
                
                String _getPlatform() {
                  if (kIsWeb) return 'web';
                  return Platform.operatingSystem;
                }
                

                【讨论】:

                  猜你喜欢
                  • 2019-06-06
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-05-18
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-03-25
                  • 1970-01-01
                  相关资源
                  最近更新 更多