Flutter Bloc 是否适合提供服务,例如 GraphQL 查询和更改?

问题描述

我正在使用 GraphQL、Provider、Bloc 和 Equatable。我的应用程序有一个 PageView,它的孩子们每个人都提出了一个不同的选择题。位于包含小部件中的按钮调用 pageController.nextPage 并触发一个 GraphQL 突变,用答案更新数据库。问题是 Flutter 重建了 PageView,我想那是因为我在它上面使用了 BlocBuilder。

这是附近的 Widget 树的简化视图:

BlocProvider<GraphQLBloc>
└QuestionsWidget
 └BlocBuilder<GraphQLBloc,GraphQLStates>
  └QuestionsstepperWizard
   └PageView

我之所以把 BlocProvider 放在 QuestionsWidget 上面,而把 BlocBuilder 放在 QuestionsstepperWidget 上面,是因为我在构建 PageView 问题列表之前测试了 GraphQL fetch 请求的状态,这似乎是 Bloc 的恰当使用、BlocProvider 和 BlocBuilder:

if (state is HasuraLoadingInProgress) {
  …
} else if (state is HasuraLoadDataFail) {
  …
} else {
  // retrieve the data
  data = (state as HasuraLoadDataSuccess).data['unanswered_questions'];
  if (data != null) {
    …
    // pass the questions to the QuestionsstepperWizard widget
    // where the list of question screens is built 
    // and PageView can page between each
    return QuestionsstepperWizard(
      questions: questions,user: widget.user,show: pushAndPop,);
  }
}

但这显然不是运行突变的好方法,因为我不希望在从更深的小部件(例如 QuestionsstepperWizard)运行 GraphQL 突变的过程中重建小部件树:

if (answer > 0) {
    // the following event redraws all widgets under BlocProvider<GraphQLBloc>
    // NOT what I want
    onpressed: () {
      BlocProvider.of<GraphQLBloc>(context).add(
        MutateGraphQLData(
            query: mutations.addUserAnswer,variables: <String,dynamic>{
              'answer': answer.toString(),'question_id': currentQuestion.guid,'user_id': user.uid,}),);
      pageController.nextPage(
        duration: Duration(milliseconds: 300),curve: Curves.eaSEOut);
    }
}

相反,如果我将 BlocProvider.of(context).add(...) 替换为对简单 GraphQL 服务类的简单调用,则一切正常。数据库已更新,pageController.nextPage 显示一个问题。

我想知道是否可以利用 Bloc 来提供服务,如果可以,如何使用?或者问题是,是否值得创建一个 GraphQLBloc?还是我的代码必须要有 GraphQLBloc 和 GraphQLService,才能在不同的情况下使用?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)