You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 11:27:28