【问题标题】:The method 'bloc' isn't defined for the type 'BuildContext'没有为“BuildContext”类型定义方法“bloc”
【发布时间】:2021-09-17 15:35:03
【问题描述】:
 Widget build(BuildContext context) {
    final appBar = AppBar(
      title: Text(
        "Romantic Comedy",
      ),
      actions: [
        IconButton(
          icon: Icon(Icons.search),
          onPressed: () {
            showSearch(
                context: context,
                delegate: MaterialSearch(_pagingController.itemList));
          },
        ),
      ],
    );

    return Scaffold(
        backgroundColor: Colors.black,
        appBar: appBar,
        body: BlocConsumer<MovieBloc, MovieState>(
            listener: (context, movieState) {

            },
            builder: (context, movieState) {
              if (movieState is MovieSuccessState) {
                movieBloc.movies.addAll(movieState.movies);
              }
              return GridView.builder(
                  controller: _scrollController
                    ..addListener(() {
                      if (_scrollController.offset ==
                          _scrollController.position.maxScrollExtent) {
                        context.bloc<MovieBloc>()
                          ..isFetching = true
                          ..add(Fetch());
                      }
                    }),
                  padding: EdgeInsets.only(left: 12.0, right: 12.0),
                  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                      crossAxisCount: 3),
                  itemBuilder: (context, index) => MovieTile(_movies[index]));
            }));
  }

【问题讨论】:

  • 您使用的是什么版本的flutter_bloc?在v6.1.0 之后,context.bloccontext.repository 都被弃用了,取而代之的是 context.readcontext.watch 结帐migration guide
  • flutter_bloc: ^7.0.1
  • 好的@Adnan alshami,您可以将此作为答案,我会将其标记为正确答案。

标签: flutter dart bloc flutter-bloc


【解决方案1】:

在 v6.1.0 之后,context.bloccontext.repository 均已弃用,而代之以 context.readcontext.watch。查看migration guide 了解更多信息。

【讨论】:

    【解决方案2】:

    我认为您使用的以下代码意味着将使用 BlocProvider 定义的父小部件中的 bloc。但是因为看起来你在这个小部件中有一个 bloc 实例,所以你只使用那个实例。

    // with extensions
    context.bloc<BlocA>();
    
    // without extensions
    BlocProvider.of<BlocA>(context)
    

    因为您在MovieSuccessState 状态下使用了movieBloc, 我认为您可以使用movieBloc 而不是context.bloc&lt;MovieBloc&gt;() 来参考isFetchingadd 方法。

    return GridView.builder(
                      controller: _scrollController
                        ..addListener(() {
                          if (_scrollController.offset ==
                              _scrollController.position.maxScrollExtent) {
                            //context.bloc<MovieBloc>()
                            //  ..isFetching = true
                            //  ..add(Fetch());
                            movieBloc.isFetching = true;
                            movieBloc.add(Fetch());
                          }
                        }),
    

    【讨论】:

    • 对不起,我需要从父母那里访问 bloc
    • 通过'movieBloc.movi​​es.addAll(movieState.movi​​es);',我认为这个小部件中已经有一个bloc实例。根据您的 bloc 版本和 Adnan Alshami 的评论,您似乎需要迁移。
    猜你喜欢
    • 2021-09-01
    • 2021-07-26
    • 2021-04-15
    • 1970-01-01
    • 2021-06-19
    • 2021-02-11
    • 2021-03-13
    • 2021-09-02
    • 2022-11-21
    相关资源
    最近更新 更多