【问题标题】:Unsupported operation: Platform._operatingSystem不支持的操作:Platform._operatingSystem
【发布时间】:2023-03-24 16:30:02
【问题描述】:

我的颤振代码没有在网络上运行。

我发现“bool kisweb”可以用来检测平台。但我的代码在“FirebaseAuth.instance”处失败。这是否意味着我不能在网络上使用 Firebaseauth,因为它可能取决于 dart:io?

在调试模式下在 Chrome 上启动 lib\main.dart... 调试服务 收听 ws://127.0.0.1:54007/NghsYaNRLKE= 为网络编译══╡ 小部件库捕获的异常 ╞═════════════════════════════════════════════════ ══════════ 在构建 MultiProvider 时引发了以下 UnsupportedError: 不支持的操作:Platform._operatingSystem 相关 导致错误的小部件是:MultiProvider org-dartlang-app:///packages/My_App/main.dart:30:10 时出现异常 被抛出,这是堆栈: 包:build_web_compilers/src/dev_compiler/dart_sdk.js 3996:11
throw_ 包:build_web_compilers/src/dev_compiler/dart_sdk.js 57810:17 _operatingSystem 包:build_web_compilers/src/dev_compiler/dart_sdk.js 57859:27 得到 操作系统 包:build_web_compilers/src/dev_compiler/dart_sdk.js 57772:27 得到 _operatingSystem 包:build_web_compilers/src/dev_compiler/dart_sdk.js 5020:17 得到 包:build_web_compilers/src/dev_compiler/dart_sdk.js 57796:26 得到 isIOS包:build_web_compilers/src/dev_compiler/dart_sdk.js 5020:17 获取包:firebase_core/src%5Cfirebase_app.dart 15:16
获取默认应用名称 包:build_web_compilers/src/dev_compiler/dart_sdk.js 5020:17 得到 包:firebase_core/src%5Cfirebase_app.dart 51:57 得到 实例包:build_web_compilers/src/dev_compiler/dart_sdk.js 5020:17 获取包:firebase_auth/src%5Cfirebase_auth.dart 25:67
获取实例包:build_web_compilers/src/dev_compiler/dart_sdk.js 5020:17 获取内部回调 ══════════════════════════════════════════════════ ══════════════════════════════════════════════════ 退出

请帮我解决这个问题。

【问题讨论】:

标签: flutter flutter-web


【解决方案1】:

我遇到了同样的问题。在网络中,您必须设置元数据并使用 putData 而不是 putFile:

final metadata = firebase_storage.SettableMetadata(
    contentType: 'image/jpeg',
    customMetadata: {'picked-file-path': file.path});

if (kIsWeb) {
  uploadTask = ref.putData(await file.readAsBytes(), metadata);
} else {
  uploadTask = ref.putFile(io.File(file.path), metadata);
}

你可以在https://pub.dev/packages/firebase_storage/example看到完整的例子

【讨论】:

    【解决方案2】:

    您必须在 web/index.html 文件和 main.dart 文件中初始化 Firebase。

    web/index.html 文件中,在 body 标签后面添加这段代码

    <body>
    <script src="https://www.gstatic.com/firebasejs/8.6.1/firebase-app.js"></script>
    <script>
      const firebaseConfig = {
        apiKey: "YOUR_API_KEY",
        authDomain: "domain.firebaseapp.com",
        projectId: "your_project_id",
        storageBucket: "your.appspot.com",
        messagingSenderId: "1777...",
        appId: "1:1674...appId"
      };
    
      // Initialize Firebase
      firebase.initializeApp(firebaseConfig);
    </script>
    

    更多信息https://firebase.flutter.dev/docs/installation/web/

    同时修改ma​​in.dart文件

    //import the dependencie 
    import 'package:firebase_core/firebase_core.dart';
    
    //modify the main method
    void main() async {
      WidgetsFlutterBinding.ensureInitialized();
      await Firebase.initializeApp();
      runApp(const MyApp());
    }
    

    【讨论】:

      【解决方案3】:

      当您首先在 if 条件下检查网络时不会出错,请尝试以下方式,对我有用。

      if (kIsWeb) {
            //running on web
      } else if (Platform.isAndroid || Platform.isIOS) {
            //running on android or ios device
      }
      

      或者如果你想使用,你可以添加try catch块。

      try {
         if (Platform.isAndroid || Platform.isIOS) {
            //running on android or ios device
         }
      } catch (e) {
         if (kIsWeb) {
            //running on web
         }
      }
      

      【讨论】:

        【解决方案4】:

        不,Flutter Web 绝不支持 FlutterFire 插件组。它们依赖于特定于平台的 API,目前仅针对 Android 和 iOS 实现。

        2021 年 5 月更新:正如 Moslem Deris 所指出的,FlutterFire 现已在网络上得到正式支持:https://firebase.flutter.dev/docs/installation/web/

        【讨论】:

        【解决方案5】:

        我重新打开这个问题是为了给出一个更合适的答案,现在可以在原生的 Flutter 中找到:

        import 'package:flutter/foundation.dart';
        if ((defaultTargetPlatform == TargetPlatform.iOS) || (defaultTargetPlatform == TargetPlatform.android)) {
            // Some android/ios specific code
        }
        else if ((defaultTargetPlatform == TargetPlatform.linux) || (defaultTargetPlatform == TargetPlatform.macOS) || (defaultTargetPlatform == TargetPlatform.windows)) {
            // Some desktop specific code there
        }
        else {
            // Some web specific code there
        }
        

        【讨论】:

        • 谢谢!其他答案并没有为我解决问题。
        • 对我来说也是最佳答案。谢谢!
        【解决方案6】:

        我花了 4 个小时研究这个问题。所有已经提到的都是正确的。不过,我很高兴我也找到了一个适用于 Web 的解决方案:universal_io package。

        请记住不要使用 1.0.1 版本,因为 v1.0.1 和其他版本无法正确检测 iOS。我只需降级到 0.2.0 版本就可以摆脱它。当您阅读这篇文章时,它可能已经修复,请在此处查看问题状态:https://github.com/dint-dev/universal_io/issues/8

        实现(超级简单)

        导入'package:universal_io/io.dart';

        然后只需使用Platform.operatingSystem 例如

        print('OS: ${Platform.operatingSystem}');
        

        【讨论】:

          【解决方案7】:

          对我来说,转移到开发频道可以使用 flutter channel dev

          网络支持现在可用于大多数 firebase 插件。

          【讨论】:

            【解决方案8】:

            您可以使用try-catch 块来防止异常中断流程:

            bool kisweb;
            try{
                if(Platform.isAndroid||Platform.isIOS) {
                    kisweb=false;
                } else {
                    kisweb=true;
                }
            } catch(e){
                kisweb=true;
            }
            

            【讨论】:

            • 这有点危险,因为 kisweb 是一种众所周知的关键字,用于检测当前平台是否为 web,而您的代码没有这样做。事实上,Platform.isAndroid 在移动浏览器上是正确的。见api.flutter.dev/flutter/foundation/kIsWeb-constant.html
            • 这个答案是错误的。正如@MappaM 提到的,Platform.isAndroidPlatform.isIOS 在移动浏览器上是正确的。
            猜你喜欢
            • 2021-10-01
            • 2020-06-09
            • 2021-12-23
            • 2017-11-09
            • 1970-01-01
            • 1970-01-01
            • 2015-11-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多