您的位置:首页 > 资讯

Flutter不支持反射? 聊聊你不知道的flutter反射

日期:2024-11-01 18:08    点击:63


在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` 生成代码,因此在每次更改反射相关代码后都需要重新运行生成命令。

这种方法的好处是可以减少手动编写的代码量,但也增加了项目的复杂性和构建时间。根据项目需求选择是否使用这种方法。

售前客服
咨询电话
点击查看联系方式