错误只出现在发布模式而不是调试模式
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.yaml
的assets
部分。
我尝试在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<void>'
您应该检查哪个资源没有加载...如果它是一个 javascript 文件,那么您的pubspec.yaml
有问题您也可以发布它吗?
抱歉,我不知道如何通过pubspec.yaml
预加载 javascript。我已经上传了我的pubspec.yaml
以上是关于错误只出现在发布模式而不是调试模式的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C++Builder 发布模式下找到异常,但不是调试