【问题标题】:Error only appears in release mode and not in debug mode错误只出现在发布模式而不是调试模式
【发布时间】:2020-02-23 19:53:21
【问题描述】:

在调试模式下一切正常,但是当我在发布模式下运行应用程序时,它会产生以下屏幕:

当我尝试在 firebase 上托管应用程序时,我得到了这个屏幕:

我不确定如何处理此错误,因为关于此问题的信息不多。但基于“No firebase app”错误,我认为该错误可能在我的 main.dart 中。

main.dart

void main() {
  assert(() {
    fb.initializeApp(
      apiKey: "",
      authDomain: "",
      databaseURL: "",
      projectId: "",
      storageBucket: "",
      messagingSenderId: "",
    );

    return true;
  }());

  WidgetsFlutterBinding.ensureInitialized();
  BlocSupervisor.delegate = GeneralBlocDelegate();

  runApp(MultiRepositoryProvider(
      providers: [
        RepositoryProvider<UserRepository>(
            builder: (context) => UserRepository()),
      ],
      child: MultiBlocProvider(providers: [
        BlocProvider<AuthBloc>(
          builder: (context) => AuthBloc(
              userRepository: RepositoryProvider.of<UserRepository>(context))
            ..add(AppStarted()),
        ),
      ], child: App())));
}

index.html

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>my website</title>
</head>
<body>
  <script src="main.dart.js" type="application/javascript"></script>

  <script src="https://www.gstatic.com/firebasejs/7.2.1/firebase-app.js"></script>
  <script src="https://www.gstatic.com/firebasejs/7.2.1/firebase-auth.js"></script>
  <script src="https://www.gstatic.com/firebasejs/7.2.1/firebase-firestore.js"></script>

  <script src="/__/firebase/7.2.2/firebase-app.js"></script>
  <script src="/__/firebase/7.2.2/firebase-auth.js"></script>
  <script src="/__/firebase/7.2.2/firebase-firestore.js"></script>
  <script src="/__/firebase/init.js"></script>

</body>
</html>

pubspec.yaml

description: A new Flutter project.
version: 1.0.0+1

environment:
  sdk: ">=2.1.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter

  cupertino_icons: ^0.1.2

  firebase: ^6.0.0
  flutter_bloc: ^1.0.0
  equatable: ^0.6.1
  font_awesome_flutter: ^8.5.0

dev_dependencies:
  flutter_test:
    sdk: flutter

flutter:
  uses-material-design: true
  assets:
    - assets/images/

【问题讨论】:

    标签: firebase flutter flutter-web


    【解决方案1】:

    问题一:使用assert()函数初始化应用

    您在assert() 方法中调用fb.initializeApp() 方法,该方法不会在发布版本中调用。 assert 方法在开发过程中非常有用,可以添加一些额外的检查。它不应包含或用于处理任何功能/业务逻辑。查看 Dart 语言之旅的this 部分。它指出断言方法在生产模式下被忽略。

    在生产代码中,断言被忽略,并且断言的参数不被评估。

    问题 2:pupspec.yaml 中缺少资产信息

    在您的index.html 中,我看到您正在尝试加载一些.js 文件,例如/__/firebase/init.js。 Flutter build 不会将其保留在 build 文件夹中,除非您在 pubspec.yaml 中将其标记为资产。

    假设您将应用程序所需的所有 .js 文件放在名为 /js/init.js 的文件夹中,如下所示。

    就我而言,我有与lib/ 平行的js/ 文件夹。这是我的选择,但你可以选择你想要的方式。

    您需要在pubspec.yaml 中输入这样的条目。

    assets:
      - js/init.js
      - js/firebase-app.js
    

    只需像这样包含整个文件夹。

    assets:
      - js/
    

    这同样适用于所有资产,如图像、数据 json 等...查看reference 了解更多详情。

    可能的问题3:在Index.html中错误地引用了本地.js文件

    在您的 index.html 中,您正尝试加载一些本地 .js 文件,如前所述。如果您遵循我建议的文件夹结构,我认为您应该如下所示加载这些文件。您可能应该根据自己的选择对其进行编辑。

    
    <script src="assets/js/init.js" type="application/javascript"></script>
    
    <script src="assets/js/firebase-app.js" type="application/javascript"></script>
    
    

    希望他的帮助。快乐飘飘。

    【讨论】:

    • 我删除了assert,发布模式下的错误与我托管它时的错误相同,当我再次托管它时没有改变。我不确定问题是否与我的“index.html”有关,所以我在问题中添加了该部分
    • 首先您应该在导入main.dart.js 之前导入所有外部脚本,或者至少推迟加载。接下来确保您的外部脚本已加载。您可以通过访问浏览器控制台中的fb 对象来检查这一点。我还看到您正在尝试从文件夹加载相同的脚本。在这种情况下,您应该将它们添加到您的pubspec.yamlassets 部分。
    • 我尝试在main.dart.js 之前导入所有外部脚本,还尝试从index.html 初始化firebase。它不起作用,它产生了没有错误消息的红色错误屏幕。在浏览器控制台中,错误是 Failed to load resource: the server responded with a status of 404 (Not Found)Another exception was thrown: Instance of 'minified:aF&lt;void&gt;'
    • 您应该检查哪个资源没有加载...如果它是一个 javascript 文件,那么您的pubspec.yaml 有问题您也可以发布它吗?
    • 抱歉,我不知道如何通过pubspec.yaml 预加载 javascript。我已经上传了我的pubspec.yaml
    猜你喜欢
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    相关资源
    最近更新 更多