学习Bloc模式,我迷失了这个。在第一页中,ExamBloc处理获取考试和显示内容。一旦用户选择了考试,就会调用所选考试的测验页面。 QuestionBloc提取问题并将其传递给有状态的小部件以显示问题。问题显示正确。
但是,整个页面无缘无故地不断重建。我尝试了QuizScreen小部件的有状态和无状态小部件,但仍然无法停止重建。感谢任何帮助。
´´´
class QuizScreen extends StatefulWidget {
static const String id="QuizScreen";
final selectedExam;
QuizScreen(this.selectedExam);
@override
_QuizScreenState createState() => _QuizScreenState();
}
class _QuizScreenState extends State<QuizScreen> {
@override
Widget build(BuildContext context) {
return
BlocProvider(
create: (context) => QuestionBloc(),
child: BlocBuilder<QuestionBloc,QuestionState>(
builder: (context, state) {
BlocProvider.of<QuestionBloc>(context).add(FetchQuestion(widget.selectedExam));
print('entrance'+state.toString());
if (state is QuestionIsLoading)
return Center(child: CircularProgressIndicator());
if (state is QuestionIsLoaded){
final QuizBrain quizBrain =QuizBrain(state.questionList);
List<QuestionModel> ql=state.questionList;
return Scaffold(
body: Choices(quizBrain: quizBrain, questionList: ql));}
},
),
);
}
}
class Choices extends StatefulWidget {
Choices({@required this.quizBrain,@required this.questionList});
final List<QuestionModel> questionList;
final QuizBrain quizBrain;
@override
_ChoicesState createState() => _ChoicesState();
}
class _ChoicesState extends State<Choices> {
var _selection;
onChangedRB(String value) { setState(() { _selection = value; });
print('onchange clicked');
print(value);
widget.quizBrain.nextQuestion();
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Text(
widget.quizBrain.getNextQuestion().content,
textAlign: TextAlign.center,
overflow: TextOverflow.ellipsis,
style: TextStyle(fontWeight: FontWeight.bold),
),
Container(child: RB(choice:widget.quizBrain.getNextQuestion().content,value:'A',groupValue:_selection,onChanged:onChangedRB
)),
],
);
}
}
´´´
您正在进行无限循环:
在您的构建器中,您正在添加新事件。解析事件后,它将添加状态,并将此状态传递给builder:
BlocBuilder正在侦听QuestionBloc状态更改。使用BlocProvider,您将添加事件,这会将新状态添加到BlocBuilder。
长话短说,您不应添加相同类型的Bloc事件
([BlocProvider.of<QuestionBloc>(context).add(FetchQuestion(widget.selectedExam))
)
在同一Bloc生成器(BlocBuilder<QuestionBloc,QuestionState>
)中。