Flutter持久化库drift - 高级特性 - 构建器选项
构建器选项
应用于编写自动生成代码的高级选项
drift_dev
包支持一系列选项来控制代码如何生成。大多数情况下,默认设定应该是够用。但是如果想要试验一下新特性或者配置看看生成的代码是什么样子,可以使用下面列出的可用选项。也可以参考建议选项的部分看下使用哪些选项的建议。
要使用这些选项,需要在工程的根目录下创建一个 build.yaml
文件(和 pubspec.yaml 同目录)
# build.yaml # 这个文件相当强大,参考 https://pub.dev/packages/build_config targets: $default: builders: drift_dev: options: compact_query_methods: true 复制代码
可用选项
当下时间点, drift 支持下面这些选项:
write_from_json_string_constructor
逻辑值。 向生成的数据类中添加一个
.fromJsonString
工厂构造方法。默认只会写入.fromJson
构造方法,带一个Map
参数。override_hash_and_equals_in_result_sets
逻辑值。当 drift 生成其它的类来保有生成的 select 查询的结果时,此标志会控制 drift 是否在这些类中覆写操作符
==
和hashCode
。在最近的版本中,如果该选项可用也会覆写toString
。compact_query_methods(默认为 true )
对于
@DriftDatabase
或@DriftAccessor
注解中声明的查询, drift 原来生成三个方法:一个返回Selectable
的基本方法,和分别返回Stream
或Future
的两个辅助方法。因为Selectable
类自带转换为Stream
或Future
的方法,所以后面两个方法只是为了向后兼容。当此标志可用时, drift 不会写入这些方法。这个标志在 moor 3.0 和 drift 中默认可用,但是也可以禁用。skip_verification_code
生成的表中包含一些有意义的大块代码,这些代码用于确认插入数据的整合性,并在违反整合性时报告详细的错误。如果只是使用 sql 来插入数据,或者不需要此功能,将此标志设为可用可以帮助减少生成的代码数量。
use_data_class_name_for_companions
默认情况下,姊妹类的名称基于表名(例:一个
@DataClassName('Users') class UsersTable extends Table
会生成UsersTableCompanion
)。用此选项,姊妹类的名称会基于数据类(此例中为UsersCompanion
)。use_column_name_as_json_key_when_defined_in_moor_file
(默认为 true ):当把在
.moor
(或.drift
) 文件中声明的列序列化为 json 或从 json 序列化时,使用它们的 sql 名称代替生成的 Dart getter 名称(这样的话,命名为user_name
的列会也使用user_name
作为 json 键,而不是userName
)。也可以使用JSON_KEY
的列约束覆写 json 键(例如:user_name VARCHAR NOT NULL JSON KEY userName
)。generate_connect_constructor
生成必要的代码以支持 isolate 运行时。这作为一个构建选项,是因为 isolate 还是一个试验性的特性。最终会为成为默认选项。
sqlite_modules
这个列表用来使 sqlite 扩展可用,如用于 json 或者全文搜索的扩展。模块必须明确是可用的,因为它们不支持所有平台。详细内容参考以下部分。
eagerly_load_dart_ast
无论何时遇到 Dart 文件,drift 的构建器都会加载解析后的抽象语法树,代替读取表时的懒加载。这用来调查罕见的构建器崩溃。
data_class_to_companions
(默认为 true)控制 drift 是否要将
toCompanion
方法写入到生成的数据类中。mutable_classes
(默认为 false )默认情况下,生成的数据类、九妹类、结果集类中的字段都是 final 的。可以通过设置
mutable_classes: true
将它们生成为可变的。raw_result_set_data
生成器会为生成的结果集类暴露底层的
QueryRow
。apply_converters_on_variables
在编译后的语句中对变量使用类型转换器。
generate_values_in_copy_with
为可空列生成一个
Value
代替T?
用于copyWith
。这允许设置列回退为 null (通过使用Value(null)
)。之前传递null
会被忽略,这会使把列设置为 null 变得不可能。named_parameters
在 sql 查询中为命名的变量生成命名的参数。
named_parameters_always_required
在 Dart 中所有命名的参数(如果
named_parameters
选项为 true )都是 required (必需的)。new_sql_code_generation
从转换的抽象语法树生成 sql 语句,而不是替换字符串。这会移除多余的空格和注释。如果使此选项可用破坏了你的查询,请提出 issue !
scoped_dart_components
为 sql 中的 Dart 占位符生成一个函数参数。这个函数有一个参数,对应查询中的每个可用的表,当使用 Dart 占位符时,更易于使别名正确。
假定的 sqlite 环境
可以配置假定的 sqlite 版本和可用的扩展。这些选项只用在分析过程中,而且对运行时真实的 sqlite 版本没有影响。
可用扩展
要定义使用的 sqlite 版本,将 sqlite.version
属性设置为 major.minor
(主.副)版本。
targets: $default: builders: drift_dev: options: sqlite: version: "3.34" 复制代码
用此选项,当使用更新的 sqlite 版本时,生成器会发出警告。例如:在 3.34 版本中不支持使用 插更子句 ,如果有地方使用的话,会报告一个错误。现在,对于低于 3.34 的版本,生成器还不能提供兼容性检查,所以 3.34 是此选项所需的最低版本。
建议选项
注: 此选项只会使 用于自定义查询的分析器中的扩展 可用。例如:当 json1
扩展可用时, json
函数能在 drift 文件中使用。这并不必然意味着这些函数在运行时也被支持。在 iOS 11 或更高版本中,两者都是可用的。在 Android 上,只在使用 NativeDatabase
时可用。
targets: $default: builders: drift_dev: options: sqlite: modules: - json1 - fts5 - moor_ffi 复制代码
现在支持以下扩展:
json1
在 moor 文件中为
json_
函数支持静态分析。fts5
为
fts5
表和MATH
操作符支持CREATE VIRTUAL TABLE
语句。 函数如highlight
或bm25
也是可用的。moor_ffi
仅当使用
NativeDatabase
时,对函数的支持能可用。这包括pow
(乘方)、sqrt
(求平方根)和大量的三角函数。在这里有这些函数的详细。math
假定 sqlite3 用 数学函数 编译。这个模块和
moor_ffi
模块大部分不兼容。
在其它构建器中使用 drift 类
也可以在其它构建器中使用 drift 生成的类。由于 Dart 的构建系统和 source_gen
相关的技术细节,这种方式需要一个自定义的配置和少量的代码修改。把下面的内容放到名为 build.yaml
文件中,该文件和 pubspec.yaml
在同一目录。
targets: $default: # 禁用默认的生成器,这里只使用 non-shared 的 drift 生成器 auto_apply_builders: false builders: drift_dev|not_shared: enabled: true # 如果需要,可以如下配置 builder (构建器) # options: # skip_verification_code: true # use_experimental_inference: true # 这个 builder (构建器) 对于 drift 文件的预处理是必要的。 # 如果没有在 .drift 文件中使用类型转换器,可以禁用此项。 drift_dev|preparing_builder: enabled: true run_built_value: dependencies: ['your_package_name'] builders: # 禁用 drift 构建器。默认情况下,这些(构建器)会在每个目标上都运行。 drift_dev: enabled: false drift_dev|preparing_builder: enabled: false # 不需要禁用 drift|not_shared ,它是默认禁用的。 复制代码
在所有使用生成的 drift 代码的文件中,需要将 part 'filename.g.dart'
替换为 part 'filename.drift.dart'
。如果在同一个文件里同时使用 drift (的构建器) 和 其它构建器,需要把 .g.dart
和 .drift.dart
都作为 part 文件。
drift 仓库里有一个可用的完整示例。
如果用这种方式碰到了任何问题,尽管在 drift 上开 issue 。
术语、解释
几乎所有的代码生成包使用 source_gen
提供的称做 "shared part file" 的方式。这是一个能用的协议,允许不相关的构建器写入相同的 .g.dart
文件。为了让这种方式正常运转,每种构建器会首先写一个带名字的 .part
文件。例如:如果在同一个工程中,使用 drift
和 built_value
,这些 part 文件会被称作 .drift.part
和 .built_value.part
。之后,通用的 source_gen
包会把这些 part 文件合并到一个 .g.part
文件中。
大多数情况,这种方式会很好地运转。但是有一个缺点是每种构建器无法看到最终的 .g.dart
文件、或使用在里面定义的任何类和方法。为了改正这一点, drift 提供了一个可选的构建器 - drift_dev|not_shared
- 这会生成一个独立的 part 文件,里面只包含 drift 生成的代码。这样大部分的工作主要是禁用 drift 的默认生成器和使用 non-shared 生成器来代替。
最后,首先需要让构建系统运行 drift ,然后运行所有其它的构建器。这是为什么我们将构建器分割为了多个目标。第一个目标只运行 drift,第二个目标有对第一个目标的依赖,然后会运行所有其它的构建器。
伪原创工具 SEO网站优化 https://www.237it.com/
作者:bettersun
链接:https://juejin.cn/post/7036022642595332133