如何修改rsocket-dart中依赖dart:mirrors的代码以适配Flutter?
移除dart:mirrors依赖的修改方案
原代码的核心作用是:从传入的实例所属类中,获取类上标注的RSocketService注解实例。由于Flutter禁用了dart:mirrors反射,我们可以用两种替代方案实现相同功能:
方案一:手动类型映射(适合小型项目)
直接维护一个类型与注解实例的映射表,替代反射查找:
import '../rsocket.dart'; // 全局维护类型与RSocketService注解的映射 final Map<Type, RSocketService> _serviceAnnotations = {}; // 初始化时注册服务类和对应的注解 void registerRSocketService(Type serviceType, RSocketService annotation) { _serviceAnnotations[serviceType] = annotation; } RSocketService? getRSocketServiceAnnotation(dynamic instance) { final annotation = _serviceAnnotations[instance.runtimeType]; if (annotation == null) { print('Annotation is not on this class'); return null; } return annotation; }
使用方式
在服务类初始化时手动注册对应关系:
// 示例服务类 @RSocketService('chat-service') class ChatRSocketService { // ...服务方法 } // 注册注解与类的关联 registerRSocketService(ChatRSocketService, RSocketService('chat-service'));
方案二:代码生成(适合大型项目,自动化程度高)
利用Dart的source_gen和build_runner工具,自动生成类型映射代码,避免手动维护的繁琐:
步骤1:添加开发依赖
在pubspec.yaml中添加:
dev_dependencies: build_runner: ^2.4.0 source_gen: ^1.4.0
步骤2:定义注解生成器
创建rsocket_service_generator.dart文件:
import 'package:source_gen/source_gen.dart'; import 'package:build/build.dart'; import '../rsocket.dart'; class RSocketServiceGenerator extends GeneratorForAnnotation<RSocketService> { @override String generateForAnnotatedElement( Element element, ConstantReader annotation, BuildStep buildStep) { if (element is! ClassElement) return ''; final className = element.name; final serviceName = annotation.read('name').stringValue; // 生成自动注册代码 return ''' void register$className() { registerRSocketService($className, RSocketService('$serviceName')); } '''; } }
步骤3:配置生成器
创建build.yaml文件:
targets: $default: builders: your_package_name|rsocket_service_generator: enabled: true
步骤4:生成代码
运行命令自动生成注册代码:
flutter pub run build_runner build
步骤5:使用生成的代码
在项目初始化时调用生成的注册方法:
void main() { registerChatRSocketService(); // 自动生成的注册方法 // ...其他初始化逻辑 }
两种方案都能完全替代原反射代码的功能,且兼容Flutter环境。
内容的提问来源于stack exchange,提问作者Too
相关产品推荐
相关产品推荐

