Flutter get_it服务定位器如何注册抽象类?StreamSubscription注入报错解决
问题根因
你报错的核心原因是不需要将StreamSubscription作为Bloc的构造参数从外部注入:StreamSubscription是你在Bloc内部调用Stream.listen()方法后才会生成的运行时实例,它和当前Bloc的生命周期绑定,不属于提前初始化的全局依赖,GetIt自然找不到未注册的对应类型,且StreamSubscription本身是抽象类,也无法直接实例化后注册为全局单例。
修复方案
- 修正
CoinWatcherBloc的构造函数,删除StreamSubscription类型的入参
修改前的构造函数:
CoinWatcherBloc(this._repository, this._coinStreamSubscription) : super(CoinWatcherState.initial());
修改后的构造函数:
CoinWatcherBloc(this._repository) : super(CoinWatcherState.initial());
你在类内部已经声明了可空的_coinStreamSubscription变量,默认初始值为null,完全不需要从外部传入。
- 删除你之前添加的
StreamSubscription注册代码,该类型不需要注入。StreamSubscription是每个Bloc实例独立持有、自己管理生命周期的对象,注册为全局单例反而会导致多个业务逻辑复用同一个订阅实例,出现订阅被提前取消、数据接收错乱的问题。
现有逻辑验证
你当前在Bloc的close()方法中取消订阅的逻辑是正确的,Bloc销毁时会自动调用close()方法,订阅资源会被正常释放,不会出现内存泄漏问题,不需要额外修改。
内容的提问来源于stack exchange,提问作者Muhammad Adnan
相关产品推荐
相关产品推荐

