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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:09:02