使用injectable注册带泛型参数的类时如何自定义指定类型?
泛型类直接标注@injectable时,injectable代码生成器无法推导具体的泛型参数,会默认生成dynamic类型的注册规则。要实现自定义泛型类型注册,可按以下方案操作:
方法1:通过自定义Module手动注册具体泛型实例
这是最常用的稳定方案,操作步骤如下:
- 去掉
ViewBloc类上的@injectable注解,避免默认生成的dynamic类型注册规则冲突 - 新建自定义注册模块,为你需要用到的每一种泛型类型单独声明注册规则:
@module abstract class ViewBlocRegisterModule { // 注册泛型类型为User的ViewBloc @factory ViewBloc<User> provideUserViewBloc() => ViewBloc<User>(); // 注册泛型类型为Product的ViewBloc @factory ViewBloc<Product> provideProductViewBloc() => ViewBloc<Product>(); }
- 重新运行injectable代码生成命令:
flutter pub run build_runner build,生成的注册代码就会对应你指定的泛型类型,不会再默认使用dynamic。
方法2:同泛型类多实例区分
如果你需要在项目中注入多个不同泛型的ViewBloc实例,可以通过@Named注解做标识区分:
@module abstract class ViewBlocRegisterModule { @factory @Named('userBloc') ViewBloc<User> provideUserBloc() => ViewBloc<User>(); @factory @Named('productBloc') ViewBloc<Product> provideProductBloc() => ViewBloc<Product>(); }
注入时搭配@Named注解指定要使用的实例即可:
@injectable class UserPage extends StatelessWidget { final ViewBloc<User> bloc; const UserPage(@Named('userBloc') this.bloc); }
运行时动态指定泛型方案
如果需要在运行时才确定泛型类型,可以直接从DI容器实例中手动获取对应类型的实例:
final userBloc = getIt<ViewBloc<User>>();
内容的提问来源于stack exchange,提问作者Nebex Elias
相关产品推荐
相关产品推荐

