[Flutter]环境判断

方式一(推荐)

常量kReleaseMode,它会根据你的应用是以什么模式编译的来获取值。bool.fromEnvironment会从Dart编译时的环境变量中获取值。对于'dart.vm.product'这个特定的环境变量,它是由Dart VM设置的,用来标明当前是否在产品环境下运行。

  • 当应用以Release模式编译时(例如运行flutter build apk或flutter build ios),kReleaseMode会被设置为true。

  • 当应用在Debug模式或Profile模式下运行时,kReleaseMode会被设置为false。

kReleaseMode是foundation库的一部分,这意味着你不需要手动定义它,可以直接使用。这个变量与其他几个常量一起,帮助开发者编写依赖于构建模式的代码:

  • kDebugMode: 当应用在Debug模式下运行时为true。

  • kProfileMode: 当应用在Profile模式下运行时为true。

  • kReleaseMode: 当应用在Release模式下运行时为true。

// const bool kReleaseMode = bool.fromEnvironment('dart.vm.product');
if (kReleaseMode) {print("dart.vm.product-现在是release环境.");
} else {print("dart.vm.product-现在是debug环境.");
}

1.在Main.dart选择Start Debugging运行

还用Android Studio和Xcode运行一样默认会是debug环境

打印结果:

I/flutter (23746): dart.vm.product-现在是debug环境.

2.使用flutter run运行

$ flutter run

打印结果:

I/flutter (24584): dart.vm.product-现在是debug环境.

3.使用flutter run --debug运行

$ flutter run --debug

打印结果:

I/flutter (30485): dart.vm.product-现在是debug环境.

4.在终端使用flutter run --release运行

$ flutter run --release

打印结果:

I/flutter (26343): dart.vm.product-现在是release环境.

5.使用flutter build apk打包安装

$ flutter build apk

提示:

dart.vm.product-现在是release环境.

6.使用flutter build apk --debug打包安装

$ flutter build apk --debug

提示:

dart.vm.product-现在是debug环境.

7.打包debug或release的ipa用Xcode打开项目操作

在Xcode中,默认情况下运行或构建应用会使用Debug配置,这意味着如果你直接通过Xcode的运行按钮(通常是顶部左侧的一个播放按钮)启动应用,它将默认使用Debug模式。这也意味着你的kReleaseMode将会是false。

如果你想要通过Xcode显式地打包一个Debug模式的ipa文件,你可以遵循以下步骤:

  • 打开你的Flutter项目中的ios文件夹。你可以在终端使用open ios/Runner.xcworkspace命令来打开Xcode项目,或者直接在Finder中找到Runner.xcworkspace文件并双击打开。

  • 确保你的设备或者是一个有效的模拟器是当前选中的目标设备。

  • 前往Xcode的顶部菜单栏,选择Product > Scheme > Edit Scheme。

  • 在左侧菜单中选择Archive,然后在右侧的Build Configuration中选择Debug。(左侧选择Run的话,就是修改运行后的安装包环境)

  • 关闭Scheme编辑器,然后去到Product > Archive来创建一个新的归档。   注意:归档操作通常用于准备Release模式的构建,但是你可以改变Scheme设置来创建Debug模式的归档。

  • 一旦归档完成,Xcode的Organizer窗口会打开,显示你的新归档。

  • 在Organizer中,选择你的归档,然后点击右边的Export按钮来导出ipa文件。

  • 在导出流程中,确保选择正确的导出选项,比如Development来保持Debug模式。

在这个过程完成后,你将会得到一个Debug模式的ipa文件,它包含了调试符号和不是针对性能优化的编译。你可以将这个ipa文件安装到你的设备上,用于测试目的。记住Debug模式的构建并不适合发布到App Store或其他分发渠道。

最后,不管是通过Xcode还是通过命令行工具,kReleaseMode的值始终由构建配置来决定,当使用Release配置构建时,kReleaseMode为true;当使用Debug配置构建时,kReleaseMode为false。

注意:经过验证,打包debug环境的ipa,安装到手机上启动不了,打包release安装没问题。

方式二

若你不想用kReleaseMode判断环境,你还可以用“ENV”甚至自定义一个变量来判断环境。

使用String.fromEnvironment('ENV')判断环境时,若编译时没用--dart-define指定环境变量(flutter run --dart-define=ENV=DEBUG 或这样 flutter build apk --dart-define=ENV=RELEASE),默认会返回空字符串。

在Flutter开发中,--dart-define是一个命令行标志,它允许开发者在编译时向 Dart 代码注入环境变量或配置数据。这使得你可以在不同的开发环境中(如开发、测试、生产)指定不同的变量值,而无需更改源代码。

下面的代码中,我们通过判断environment是否等于’DEBUG’,让环境默认为Release环境。

// 在你的代码中,确保 environment 声明前面有 const 关键字。如果没有 const,则不会在编译时查找环境变量的值,而是会默认为空字符串。
const String environment = String.fromEnvironment('ENV');
if (environment == 'DEBUG') {print("ENV-现在是debug环境. environment = $environment");
} else {print("ENV-现在是release环境. environment = $environment");
}

这种劣势也比较明显,因为需要编译时手动指定环境,开发时忘记指定--dart-define=ENV=DEBUG时,就容易误入release环境。比如你在release环境中有埋点,误入后就会制造出很多垃圾数据。

1.使用flutter run --dart-define=ENV=DEBUG运行

$ flutter run --dart-define=ENV=DEBUG
// 或者
$ flutter run --dart-define="ENV=DEBUG"

打印结果:

I/flutter (29771): ENV-现在是debug环境. environment = DEBUG

2.使用flutter build apk --dart-define=ENV=RELEASE打包安装

$ flutter build apk --dart-define=ENV=RELEASE

提示:

ENV-现在是release环境. environment = RELEASE

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/776817.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【更新中】Leetcode中遇到的最短路径算法

dijsktra算法模板: def dijkstra(x):#x表示出发点dis[inf]*n #dis记录从x出发到各个点的最短距离,初始化为infdis[x]0 #源点到自己的距离为0vis[False]*n #检查各个点是否访问过for _ in range(n-1): #检查除了源点的其他n-1个点,更新dis…

【Android 源码】Android源码下载指南

文章目录 前言安装Repo初始化Repo选择分支没有梯子替换为清华源 有梯子 下载源码下载开始参考 前言 这是关于Android源码下载的过程记录。 环境:Windows上通过VMware安装的Ubuntu系统 安装Repo 创建Repo文件目录 mkdir ~/bin PATH~/bin:$PATH下载Repo工具&#…

快速排序三路划分

C 以下是C语言实现的快速排序的三路划分版本的代码&#xff1a; #include <stdio.h>// 交换两个元素的值 void swap(int* a, int* b) {int temp *a;*a *b;*b temp; }// 快速排序的三路划分 void quickSort(int* nums, int left, int right) {if (left > right) ret…

回文子串 每日温度 接雨水

647. 回文子串 力扣题目链接 如果s【i】和s【j】相同 dp【i1】【j-1】也是回文串的话 &#xff08;等于true&#xff09; 那么dp【i】【j】也是回文串 true 定义一个bool二维数组 遍历顺序是从下到上 从左到右 因为dp【i】【j】是通过dp【i1】【j-1】推出来的 i从最后一…

【漏洞复现】用友U8Cloud nc.bs.sm.login2.RegisterServlet SQL注入漏洞

0x01 产品简介 用友U8 Cloud是用友推出的新一代云ERP,主要聚焦成长型、创新型企业,提供企业级云ERP整体解决方案 0x02 漏洞概述 用友U8Cloud nc.bs.sm.login2.RegisterServlet接口处存在SQL注入漏洞,未授权的攻击者可通过此漏洞获取数据库权限,从而盗取用户数据,造成用…

OpenGL 实现“人像背景虚化“效果

手机上的人像模式,也被人们称作“背景虚化”或 ”双摄虚化“ 模式,也称为 Bokeh 模式,能够在保持画面中指定的人或物体清晰的同时,将其他的背景模糊掉。突出画面的主体部分,主观上美感更强烈。 人像模式的一般实现原理是,利用双摄系统获取景深信息,并通过深度传感器和图…

WorkPlus智能AI助理:定制化部署,拓展企业协作新境界

近年来&#xff0c;随着人工智能技术不断发展&#xff0c;智能助理在企业管理中发挥着日益重要的作用。其中&#xff0c;WorkPlus智能AI助理作为一款支持私有化部署的新一代智能助理软件&#xff0c;为企业内部协作场景带来了全新的可能性。通过结合企业自身的行业知识和应用场…

英伟达推出“地表最强AI芯片”

B站&#xff1a;啥都会一点的研究生公众号&#xff1a;啥都会一点的研究生 近期AI相关资讯&#xff0c;一起看看吧~ Neuralink首位脑芯片患者用意念下棋 埃隆-马斯克&#xff08;Elon Musk&#xff09;的脑芯片初创公司 Neuralink 展示了其首位脑芯片患者仅用意念下棋的情景…

VMware vSAN OSA存储策略 - 基于虚拟机的分布式对象存储

简介 博客&#xff1a;https://songxwn.com/ 存储策略 (Storage Policy) 是管理员定义的一组规则&#xff0c;这组规则定义了数据对象在 vSAN 存储上是如何保存的&#xff0c;存储策略定义了数据存储的可靠性、访问性能等特性。vSAN 提供了基于存储策略的存储管理 SPBM (Stor…

共享旅游卡2024年未来发展趋势

共享旅游卡2024年未来发展趋势分析 共享旅游卡&#xff0c;作为一种创新的旅游服务方式&#xff0c;正在逐步改变传统的旅游消费模式。它将各类旅游资源进行有机整合&#xff0c;为游客提供了更加便捷、灵活的旅游体验。 随着共享经济的日益深入&#xff0c;共享旅游卡在2024…

ssh连接

Telne服务使用很方便&#xff0c;但是它是通过明文传递信息&#xff0c;所有安全性就不高&#xff0c;目前普遍使用的SSH(SecureShell)来进行远程管理 。SSH协议有SSH1和SSH2两个版本&#xff0c;他们使用管理不同的协议和实现&#xff0c;二者互不兼容。SSH2比SSH1在安全性&am…

基于java实现的高校二手交易平台

开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclip…

无服务数据库是未来的趋势吗?

无服务数据库是未来的趋势吗&#xff1f; 无服务器数据库是未来的趋势吗&#xff1f;无服务器数据库与传统云数据库有何不同&#xff1f; Amazon Aurora Serverless&#xff08;如下图所示&#xff09;是 Amazon Aurora 的一种配置方式&#xff0c;可以按需自动扩展。 Aurora…

自学算法:03 一维动态规划

有些递归在展开计算时&#xff0c;总是重复调用同一个子问题的解&#xff0c;这种重复调用的递归变成动态规划会很有收益&#xff0c;而如果每次展开都是不同的解&#xff0c;或者重复调用的现象很少&#xff0c;那么没有改动态规划的必要。 所以任何动态规划问题都一定对应着一…

针对ETC系统的OBE-SAM模块设计方案

ETC系统组成及工作原理 ETC系统由前端系统和后台数据库系统组成&#xff0c;总体的架构如下图所示&#xff1a; 前端系统包含安装在汽车挡风玻璃上的车载单元&#xff08;On Board Unit&#xff0c;简称OBU&#xff09;、路侧单元&#xff08;Roadside Unit&#xff0c;简称RS…

深入解析Spring MVC: 原理、流程【面试版】

什么是SpringMV? 1.是一个基于MVC的web框架&#xff1b; 2.是spring的一个模块&#xff0c;是spring的子容器&#xff0c;子容器可以拿父容器的东西&#xff0c;但是反过来不可&#xff1b; 2.SpringMVC的前端控制器是DispatcherServlet&#xff0c;用于分发请求。使开发变…

python--切片

1.切片&#xff1a; 切片是编程语言为有序序列&#xff08;sequence&#xff09;准备的&#xff0c;用来切割或者截取某个片段 一个完整的切片是包含三个参数和两个冒号" : " ,用于分隔三个参数(start_index、end_index、step)。当只有一个“:”时&#xff0c;默认第…

Java语法之参数设置

PathVariable 路径参数 须在请求路径加上 Param 参数说明&#xff1a;便于配置很多条件 RequestBody 前端传json 通过该注解可以转成Java对象&#xff08;实体类&#xff09; RequestParam 获取查询参数&#xff1a;通过指定参数名称&#xff0c;RequestParam注解可以从请求…

深度学习(三)vscode加jupyter notebook插件使用

0.前言 哎呀&#xff0c;我本次的实验是在新电脑上使用的&#xff0c;之前的笔记本上的环境什么的我都是很久以前弄好了的&#xff0c;结果到了新电脑上我直接忘了是该怎么配的了&#xff0c;不过万幸&#xff0c;花了点时间&#xff0c;查查补补&#xff0c;现在总算是可以了。…