Flutter 小技巧之 3.7 更灵活的编译变量支持

news2024/12/31 6:37:16

今天我们聊个简单的知识点,在 Flutter 3.7 的 release-notes 里,有一个没有出现在 announcement 说明上的 change log ,可能对于 Flutter 团队来说这个功能并不是特别重要,但是对于我个人而言,这是一个十分重要的能力补充:

  • [flutter_tools] Fix so that the value set by --dart-define-from-file can be passed to Gradle by @blendthink in https://github.com/flutter/flutter/pull/114297

翻到这个小功能,纯属是意外之喜。

Dart

在 3.7 版本之前,如果我们需要在编译时动态给 Flutter 添加变量信息,那么我们会用到 --dart-define ,例如:

flutter run --dart-define=APP_CHANNEL=Offical

const APP_CHANNEL = String.fromEnvironment('APP_CHANNEL');

我们可以通过 --dart-define 在命令行指定一个变量,然后在 Flutter 里通过 String.fromEnvironment 读取它,一般场景下它是满足需求的,但是:

  • 如果当你需要定义多个变量时,命令就会变得冗长且不好维护

  • 如果你是混合开发,变量还需要同步修改到原生项目的配置里,就会变得麻烦

在此之前,针对同步修改到不同原生项目的配置,我是通过自定义脚本去实现:

  • Android 上利用 gradle 脚本,参考 RN 上的 dotenv 读取某个脚本配置,修改 project.env
  • iOS 上通过读取脚本配置,然后利用系统的 PlistBuddy 命令在编译时插入和修改某些参数

而现在,从 Flutter 3.7 开始,它变得更简单了,因为你可以使用 --dart-define-from-file

flutter run --dart-define-from-file=config.json

// config.json // 
{
  "TEST_KEY1": "test key 1",
  "TEST_KEY2": "test key 2"
}  

同样是 dart define ,但是 --dart-define-from-file 可以直接从一个 json 文件上读取配置,然后转成一个 Map,之后配置到 Environment 里,同样是可以在 dart 里通过 String.fromEnvironment 去读取参数,而 json 文件的配置方式,可以让你在需要配置多个变量时参数管理变得更好维护。

那到这里就结束了吗?显然不是,前面我们说过同步修改到不同原生项目的配置,而 Flutter 3.7 下官方也正式支持。

Android

首先是 Android ,我们可以在 app/build.gradle 文件下定义一个 dartEnvVar 变量,它主要是用来读取前面 json 文件注入到 project 的参数。

然后我们就可以在 app/build.gradle 下直接通过 dartEnvVar 引用对应参数,比如定义 resValue ,可以看到 dartEnvVar 在编译时,成功读取到 json 文件里的参数。

如下图所示,能通过 project 读取 dart 的环境变量配置之后,我们就可以定义有 resValue 去修改 AndroidManifest 文件,甚至定义插入到 BuildConfig 里在原生代码引用,而对于配置我们只需要维护一份 json 文件即可。

image-20230208182506190

那它是如何实现的?简单来说,在 flutter/packages/flutter_tools/lib/src/build_info.dart 脚本下,之前读取的 json 文件可以得到一个 dartDefineConfigJsonMap 对象,它会被转化为一个 Gradle 参数列表,在之后的 assembleTask 里被作为参数执行。

这里需要注意,定义的 key 不能和与定制的 key 冲突,比如 dart-obfuscation 等。

如下图所示,最终执行的时候就会是 -PTEST_KEY1=test key 1 -PTEST_KEY2=test key 2 这样的效果。

iOS

iOS 上同样也很简单,你只需要在 Info.plist 上定义好 key-value 的引用即可,因为 iOS 上在 --dart-define-from-file 编译时,同样会生成对应的 xcconfig 配置信息。

ios/Flutter 目录下,编译时会产生两个忽略文件,分别是 flutter_export_environment.shGenerated.xcconfig ,可以看到编译后这两个文件下都产生了对应的 key-value 。

这里需要注意,在 iOS 上 xcconfig 格式会将 // 读取为注释分隔符 ,也就是 // 之后的内容会被忽略,也就是说,你不能通过它来传递 url ,比如 https://xxxx ,因为 // 后会被忽略。

当然,如果你需要默认值,那么你也可以在 ios/Flutter 目录下的 Debug.xcconfigRelease.xcconfig 上进行定制配置。

和 Android 一样, iOS 在编译时会对 --dart-define-from-file 的参数进行转化变成 xcconfig 参数,从而实现 dart 和 iOS 端公用一份变量配置的效果。

最后

可以看到 --dart-define-from-file 的使用和实现并不复杂,在没有它之前我们也可以通过一些手段来实现类似的效果。

但是 --dart-define-from-file 命令的出现简化了整个构建流程,让编译动态配置的链条变得更加灵活可靠,所以它无疑是 3.7 里最容易被忽略的实用更新。

不得不说,Flutter 3.7 给我们带来了不少的惊喜,例如 toImageSync 和 background isolate 都是期待已久的功能,而类似 --dart-define-from-file 的支持,也在不断完善 Flutter 的开发体验。

最后,从 3.7 开始的小版本更新有两个特征:

  • 1、impeller 确实还有不少问题
  • 2、impeller 真的来了,就算预览功能也要 fix 到稳定分支

期待下个版本 impeller 能给我们带来更好的体验。

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

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

相关文章

什么是模板方法模式?

在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。例如,去…

阿里云国际服务器ECS特性与优势

阿里云国际服务器的 ECS 作为一种安全、可靠、灵活、可扩展的云计算服务,不仅可以减少运行和维护,而且可以提高运行和维护效率,使用户关注核心业务的创新。 阿里云国际服务器ECS优势一:产品丰富 阿里云国际云服务器 ECS 可以提供…

《MySql学习》 SQL 语句的更新过程

《MySql学习》 SQL 语句的更新过程 一.SQL查询语句的执行过程 上一篇博文记录了SQL查询语句的执行过程,首先客户端通过TCP三次握手与Server层的连接器建立连接(短连接与长链接),缓存权限。然后去查询缓存(8.0后移除&…

联想服务器双品牌的思考:融合化、场景化、订阅化、绿色化,打造全栈新算力基础设施

联想集团执行副总裁兼中国区总裁刘军:智能化转型是中国企业未来十年穿越经济周期的利器,智能化生产力水平决定了企业发展的速度与高度。 联想创新性提出融合化、场景化、订阅化及绿色化的“四维算力”,致力于成为中国领先的智能IT基础设施提供…

微服务--Feign学习

Feign远程调用: RestTemplate发起远程调用的代码: 存在下面的问题 代码可读性差,编程体验不统一参数复杂URL难以维护 Feign的介绍:Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/…

论文文献引用规范和标准(国标GBT7714)@endnote国标样式

文章目录论文文献引用规范和标准(国标GBT7714)国标GBT7714-2015endnote stylerefs简述国标GBT7714条目的组织格式Noteword中的文献交叉引用超链接文献引用示例endNote资源和基本使用endnote或其他文献引用工具下载word中的其他引文技巧知网国标格式引文引…

谈谈Java Optional的坑

开端: 大家好,我是老白。昨天朋友提出的java8后出来的自带的对象判定方式Optional.ofNullable(),后来查询了一些资料和自己试验了一些demo资料,在这里记录分享个大家 作用:判断对象是否为空,是则重新创建一个新对象&…

ABAP 搜索帮助带出多个字段描述 更新屏幕字段

文章目录需求解析1-DYNP_GET_STEPL2-F4IF_INT_TABLE_VALUE_REQUEST3-获取返回值4-把相应字段更新到内表5-DYNP_VALUES_UPDATE代码需求 如图,当我点击责任工序的搜说帮助时, 同时会把责任人员的描述带出来. 解析 1-DYNP_GET_STEPL 这个方法就是获取当前的循环步骤 2-F4IF_I…

浏览器中的 JavaScript 执行机制

思维导图 本文为反复学习极客时间-《浏览器的工作原理与实践》-浏览器中的 JavaScript 执行机制章节中的一些思考与记录。 一些重要概念 变量提升 所谓的变量提升,是指在 JavaScript 代码执行过程中,JavaScript 引擎把变量的声明部分和函数的声明部分…

你可能还不知道的 console.log 替代品

通过使用 javascript 对象的破坏能力,您可以这样做:const{ log } console; log("hi"); log("testing");你可以将log函数更改为您想要的任何其他名称,如下所示:const{log: myLog } console; myLog("hi&qu…

vue插槽 Slots

一、插槽是什么&#xff1f; 插槽就是子组件中的提供给父组件使用的一个占位符&#xff0c;用<slot></slot> 表示, 父组件可以在这个占位符中填充任何模板代码&#xff0c;如 HTML、组件等&#xff0c;填充的内容会替换子组件的<slot></slot>标签。 简…

OpenSergo Spring Cloud Alibaba 带来的服务治理能力

作者&#xff1a;十眠、牧思 Spring Cloud 应用为何需要服务治理 随着微服务技术的发展&#xff0c;微服务(MicroServices) 的概念早已深入人心&#xff0c;越来越多的公司开始使用微服务架构来开发业务应用。 如果采用得当&#xff0c;微服务架构可以带来非常大的优势。微服…

IDEA与eclipse桌面配置基础(笔记)

在eclipse中配置jdk Window–>Preferences–>java–>installed JREs–>add–>Standard VM–>选择jdk安装路径就好了 设置字符集编码为utf-8&#xff0c;防止中文乱码 设置字符集编码为UTF-8&#xff1a;Window–>Preferences–>General–>Workspace…

第四次工业革命新十年:看跨越智能化鸿沟的联想范式

十年前&#xff0c;GE推出全球第一个工业互联网平台Predix&#xff1b;同年&#xff0c;在2013汉诺威工业博览会上&#xff0c;德国正式推出工业4.0概念。由此&#xff0c;全球开启了以工业4.0和工业互联网为核心的第四次工业革命浪潮&#xff0c;智能技术成为了第四次工业革命…

4N25光耦合器:简单的应用电路

4N25光耦合器&#xff1a;简单的应用电路 介绍 4N25是一款6引脚光电晶体管耦合器。本文根据其传动特性介绍了 4N25 的非线性和线性应用。 4N25概述 光电耦合器4N25的内部电路结构如图1所示。 图1.4N25内部电路结构 该芯片为双列直插式器件&#xff0c;外引线为6根&#xff0…

Dart语法学习-基础-类

Classes Using constructors 使用构造函数创建对象。 构造函数名称可以是 ClassName 或 ClassName.identifier。 例如&#xff0c;以下代码使用 Point() 和 Point.fromJson() 构造函数创建 Point 对象&#xff1a; class Point {var x;var y;Point(int this.x, int this.y);…

Java --- Integer.parseInt()

parseInt() 方法是java.lang 包下Integer 类的一个方法。 Java Integer parseInt() 方法共有三种不同类型&#xff0c;可以根据其参数进行区分。 用法: 以下是 parseInt() 方法的声明&#xff1a; public static int parseInt (String s) public static int parseInt (Strin…

捐赠物品管理系统-php mysql

目 录 第一章 引言 1 1.1研究背景 1 1.2研究现状 1 1.3 系统相关技术与环境简介 1 1.3.1 PHP 1 1.3.2 Apache 2 1.3.3 MySQL数据库 2 1.3.4 运行环境 Windows 3 1.3.5 appserv 3 1.3.6 Dreamweave8 3 1.3.7 EditPlus 4 第二章 需求分析…

前端必备开发编译器详解

一、前言 前端开发编译器有很多&#xff0c;例如&#xff1a;WebStorm、VS Code、HBuilder X、Sublime Text等等。在这里就不一一介绍了&#xff0c;这里主要讲解VS Code和HBuilder X 编译器。 二、VS Code Visual Studio Code (简称 VS Code) 是一款免费开源的现代化轻量级…

论文阅读:Tube Convolutional Neural Network (T-CNN) for Action Detection in Videos

Tube Convolutional Neural Network (T-CNN) for Action Detection in Videos 文章目录Tube Convolutional Neural Network (T-CNN) for Action Detection in Videos摘要及贡献相关工作Generalizing R-CNN from 2D to 3D框架结构Tube Proposal Network&#xff08;TPN&#xff…