【问题标题】:Adding event does not update BlocBuilder添加事件不会更新 BlocBuilder
【发布时间】:2020-10-25 10:13:09
【问题描述】:

第一次加载页面时,我正在使用flutter_bloc 模式进行 api 调用。我在initState 中添加事件,一切正常。我也在尝试添加一个刷新按钮。我做的事情和我在initState 做的事情完全一样。但它不会触发blocBuilder 中的重建。这是表示层。

class OtherPage extends StatefulWidget {
  @override
  _OtherPageState createState() => _OtherPageState();
}

class _OtherPageState extends State<OtherPage> {
  EngageBloc engageBloc;
  int count = 0;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          actions: <Widget>[
            IconButton(
              icon: Icon(Icons.refresh),
              onPressed: () {
                engageBloc.add(FetchEngageEvent());
              },
            ),
          ],
        ),
        body: BlocBuilder<EngageBloc, EngageState>(builder: (context, state) {
          if (state is EngageInitialState) {
            return CircularProgressIndicator();
          }
          if (state is EngageLoadingState) {
            return CircularProgressIndicator();
          }
          if (state is EngageLoadedState) {
            final courses = state.courses;
            return buildUi(courses);
          }
          if (state is EngageErrorState) {
            return buildErrorUi(state.message);
          }
          return Container();
        }));
  }

  Widget buildLoading() {
    return Center(
      child: CircularProgressIndicator(),
    );
  }

  Widget buildErrorUi(String message) {
    return Center(
      child: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Text(
          message,
          style: TextStyle(color: Colors.red),
        ),
      ),
    );
  }

  Widget buildUi(AvailableCourseBoxset courses) {
    return Text('It works!!');
  }

  @override
  void initState() {
    engageBloc = BlocProvider.of<EngageBloc>(context);
    engageBloc.add(FetchEngageEvent());
    super.initState();
  }
}

有什么明显的我做错了。当我单击刷新按钮时,会进行 api 调用。日志中没有出现错误。我正在使用跟踪状态转换的观察者。输出:

flutter: onTransition Transition { currentState: EngageLoadedState, event: FetchEngageEvent, nextState: EngageLoadingState }
flutter: onTransition Transition { currentState: EngageLoadingState, event: FetchEngageEvent, nextState: EngageLoadedState 

}

EngageLoadingState 被调用,但 ui 甚至没有为此更新。正如我所说的 initState 有效,但对刷新按钮执行相同操作却没有。我很感激我可能需要添加更多代码...问一下,我会发布您的要求..谢谢。

【问题讨论】:

  • 能否也分享一下bloc本身的代码

标签: flutter flutter-bloc


【解决方案1】:

您不应该将 bloc 类存储在变量中。您应该为它提供一个BlocProvider,然后使用BlocProvider.of&lt;EngageBloc&gt;(context).add(FetchEngageEvent()); 来向这个集团添加事件。

这是因为可以在整个应用中设置不同的块,因此您希望使用提供者/消费者模型来管理它们。

为了使其工作,尽管您必须将 BlocProvider 放在您的 Scaffold 之前,以便能够在您的 appBar 中访问它。

【讨论】:

  • 他似乎已经在使用 blocpprovider 提供集团
  • 是的,但不是他试图进入集团的地方的祖先。再加上他没有使用正确的方法来获得集团
猜你喜欢
  • 2021-04-21
  • 2019-12-28
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
相关资源
最近更新 更多