错误只出现在发布模式而不是调试模式

Posted

技术标签:

【中文标题】错误只出现在发布模式而不是调试模式【英文标题】: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/

【问题讨论】:

【参考方案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

以上是关于错误只出现在发布模式而不是调试模式的主要内容,如果未能解决你的问题,请参考以下文章

Thinkphp怎么开启详细错误提示而不是出现哭脸

避免在调试模式 Access 97 时因错误而停止

如何在 C++Builder 发布模式下找到异常,但不是调试

在调试模式而不是默认模式下运行 docker sonarqube

从发布模式更改为调试模式时出现“调试断言失败”错误

预处理器定义在发布模式下工作,而不是调试