问题描述
我正在使用 GraphQL、Provider、Bloc 和 Equatable。我的应用程序有一个 PageView,它的孩子们每个人都提出了一个不同的选择题。位于包含小部件中的按钮调用 pageController.nextPage 并触发一个 GraphQL 突变,用答案更新数据库。问题是 Flutter 重建了 PageView,我想那是因为我在它上面使用了 BlocBuilder。
这是附近的 Widget 树的简化视图:
BlocProvider<GraphQLBloc>
└QuestionsWidget
└BlocBuilder<GraphQLBloc,GraphQLStates>
└QuestionsstepperWizard
└PageView
我之所以把 BlocProvider 放在 QuestionsWidget 上面,而把 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 (将#修改为@)