阅读 285

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 的基本方法,和分别返回 StreamFuture 的两个辅助方法。因为 Selectable 类自带转换为 StreamFuture 的方法,所以后面两个方法只是为了向后兼容。当此标志可用时, 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 语句。 函数如 highlightbm25 也是可用的。

  • 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 文件。例如:如果在同一个工程中,使用 driftbuilt_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

文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐