在flutter的早期版本中不支持反射,后来的`dart:mirrors`只支持dart语言,不支持flutter, 这在我们使用flutter进行APP开发时,无法使用反射这一有利工具来提高效率。
为此官方创建了 `reflectable` 库, 通过自动生成代码来实现反射,首先在项目中添加 `reflectable` 库的依赖,并进行一些配置。`reflectable` 库允许你在 Dart 中使用反射功能,但需要通过代码生成来实现。
以下是如何使用 `reflectable` 来改写这段代码的一个示例:
首先,确保在 `pubspec.yaml` 中添加 `reflectable` 依赖:
```yaml
dependencies:
reflectable: ^2.2.0
dev_dependencies:
build_runner: ^2.1.0
reflectable: ^2.2.0
```
创建一个新的文件 `reflector.dart`,用于定义反射器:
```dart
import 'package:reflectable/reflectable.dart';
class JsonReflector extends Reflectable {
const JsonReflector()
: super(invokingCapability, declarationsCapability, typeCapability);
}
const jsonReflector = JsonReflector();
```
在你的 `models.dart` 文件中,使用 `reflectable`:
```dart:lib/lsp/models.dart
import 'reflector.dart';
import 'package:reflectable/reflectable.dart';
@jsonReflector
class ServiceOrderDto {
// ... existing fields ...
ServiceOrderDto.fromJson(Map<String, dynamic> order) {
var instanceMirror = jsonReflector.reflect(this);
var classMirror = instanceMirror.type;
for (var field in classMirror.declarations.values) {
if (field is VariableMirror) {
var fieldName = field.simpleName;
if (order.containsKey(fieldName)) {
instanceMirror.invokeSetter(fieldName, order[fieldName]);
}
}
}
}
}
```
运行 `build_runner` 来生成反射代码:
```bash
flutter pub run build_runner build
```
这段代码使用 `reflectable` 库来动态地从 JSON 中为类的字段赋值。请注意,`reflectable` 需要通过 `build_runner` 生成代码,因此在每次更改反射相关代码后都需要重新运行生成命令。
这种方法的好处是可以减少手动编写的代码量,但也增加了项目的复杂性和构建时间。根据项目需求选择是否使用这种方法。