将我的 bloc 应用程序迁移到空安全。错误:“AssignmentBloc”不符合类型参数“B”的绑定“BlocBase<AssignmentState>”

Posted

技术标签:

【中文标题】将我的 bloc 应用程序迁移到空安全。错误:“AssignmentBloc”不符合类型参数“B”的绑定“BlocBase<AssignmentState>”【英文标题】:Migrating my bloc app to null safety. error: 'AssignmentBloc' doesn't conform to the bound 'BlocBase<AssignmentState>' of the type parameter 'B' 【发布时间】:2022-01-07 13:59:26 【问题描述】:

我正在将我的 Flutter 应用程序迁移到 null-safety,我在 BlocProvider 和 BlocBuilder 上收到此错误。

'AssignmentBloc' doesn't conform to the bound 'BlocBase<AssignmentState>' of the type parameter 'B'.
Try using a type that is or is a subclass of 'BlocBase<AssignmentState>'.

我已经检查了类似问题的解决方案,在我看来,我已经按照他们的建议做了。不过,我可能遗漏了一些东西,我需要帮助。

小部件。

class _AssignmentScreenWidgetState extends State<_AssignmentScreenWidget> 
  AssignmentBloc? _bloc;
  bool assignmentAdd = false;

  @override
  void initState() 
    super.initState();
    _bloc = BlocProvider.of<AssignmentBloc>(context)
      ..add(FetchEvent(widget.courseId, widget.assignmentId));
  

  final GlobalKey<AssignmentDraftWidgetState> assignmentDraftWidgetState =
      GlobalKey<AssignmentDraftWidgetState>();

  @override
  Widget build(BuildContext context) 
    return BlocListener<AssignmentBloc, AssignmentState>( // where the errors are
      bloc: _bloc,
      listener: (BuildContext context, AssignmentState state) 
        if (state is CacheWarningAssignmentState) 
          showDialog(
              context: context, builder: (context) => WarningLessonDialog());
        
      ,
      child: BlocBuilder<AssignmentBloc, AssignmentState>( // where the errors are
          builder: (context, state) 
        return Scaffold(
        ...


集团。

class AssignmentBloc extends Bloc<AssignmentEvent, AssignmentState?> 
  final AssignmentRepository _assignmentRepository;
  final CacheManager cacheManager;

  AssignmentBloc(this._assignmentRepository, this.cacheManager) : super(null);

  @override
  AssignmentState get initialState => InitialAssignmentState();
  ...

国家。

@immutable
abstract class AssignmentState 

class InitialAssignmentState extends AssignmentState 

class LoadedAssignmentState extends AssignmentState 
    final AssignmentResponse assignmentResponse;

    LoadedAssignmentState(this.assignmentResponse);


class ErrorAssignmentState extends AssignmentState 
class CacheWarningAssignmentState extends AssignmentState 

拜托,非常感谢我能得到的所有帮助。

【问题讨论】:

【参考方案1】:

您的 _bloc 变量实际上不可为空。它只是在构造函数中不可用。

所以将其设为late 而不是可为空的:

late AssignmentBloc _bloc;

这应该可以解决您的问题,因为现在您的 bloc 的类型参数不再是 AssignmentBloc? 而是真正的 AssignmentBloc

【讨论】:

以上是关于将我的 bloc 应用程序迁移到空安全。错误:“AssignmentBloc”不符合类型参数“B”的绑定“BlocBase<AssignmentState>”的主要内容,如果未能解决你的问题,请参考以下文章

我迁移到空安全,我无法运行“flutter pub run build_runner build”而不抛出错误

生成器无法定位尚未迁移到空安全的库

迁移到空安全版本 Provider 5.0.0 后对 Stream Provider 的更改

空安全迁移:如何使用 intl 包迁移应用程序?

从 v7.2.1 迁移到 flutter_bloc v 8.0.0 后不会触发 flutter_bloc 事件

Flutter - Scoped BloCs 问题