Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Flatter Bloc在不改变状态的情况下不断重建小部件_Android_Flutter_Dart_Provider_Bloc - Fatal编程技术网

Android Flatter Bloc在不改变状态的情况下不断重建小部件

Android Flatter Bloc在不改变状态的情况下不断重建小部件,android,flutter,dart,provider,bloc,Android,Flutter,Dart,Provider,Bloc,在学习集团模式时,我无意中发现了这一点。在第一页中,ExamBloc处理获取检查和显示。一旦用户选择了考试,将使用所选考试调用测验页面。QuestionBloc获取问题并将其传递给有状态小部件以显示问题。问题显示正确 但是,整个页面会无缘无故地不断重建。我尝试了QuizScreen小部件的状态和无状态小部件,但仍然无法停止重建。感谢您的帮助 ' class _QuizScreenState extends State<QuizScreen> { @override Widg

在学习集团模式时,我无意中发现了这一点。在第一页中,ExamBloc处理获取检查和显示。一旦用户选择了考试,将使用所选考试调用测验页面。QuestionBloc获取问题并将其传递给有状态小部件以显示问题。问题显示正确

但是,整个页面会无缘无故地不断重建。我尝试了QuizScreen小部件的状态和无状态小部件,但仍然无法停止重建。感谢您的帮助

'

 class _QuizScreenState extends State<QuizScreen> {
  @override
  Widget build(BuildContext context) {
    final QuestionBloc questionBloc = context.bloc<QuestionBloc>();
    questionBloc.add(FetchQuestion(widget.selectedExam));

    return
       BlocBuilder<QuestionBloc,QuestionState>(
         bloc: questionBloc,
         builder: (context, state) {
           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
        )),


      ],
    );

  }
}
class\u QuizScreenState扩展状态{
@凌驾
小部件构建(构建上下文){
final QuestionBloc QuestionBloc=context.bloc();
添加(FetchQuestion(widget.selectedExam));
返回
BlocBuilder(
集团:问题集团,
生成器:(上下文、状态){
打印('entry'+state.toString());
如果(状态为问题加载)
返回中心(子项:CircularProgressIndicator());
如果(状态为QuestionIsLoaded){
最终QuizBrain QuizBrain=QuizBrain(州问题列表);
List ql=state.questionList;
返回脚手架(
正文:选择(quizBrain:quizBrain,问题列表:ql));}
},
);
}
}
类选择扩展了StatefulWidget{
选项({@required this.quizBrain,@required this.questionList});
最终清单问题清单;
最终的基兹伯兰基兹伯兰;
@凌驾
_ChoiceState createState();
}
类_ChoiceState扩展状态{
变量选择;
onChangedRB(字符串值){setState((){u selection=value;});
打印(“单击一次更改”);
印刷品(价值);
widget.quizBrain.nextQuestion();
}
@凌驾
小部件构建(构建上下文){
返回列(
mainAxisAlignment:mainAxisAlignment.center,
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:[
正文(
widget.quizBrain.getNextQuestion().content,
textAlign:textAlign.center,
溢出:TextOverflow.省略号,
样式:TextStyle(fontWeight:fontWeight.bold),
),
容器(子项:RB(选项:widget.quizBrain.getNextQuestion()。内容,值:'A',组值:\ u选择,onChanged:onChangedRB
)),
],
);
}
}

''''

您正在进行无限循环:

 class _QuizScreenState extends State<QuizScreen> {
  @override
  Widget build(BuildContext context) {
    final QuestionBloc questionBloc = context.bloc<QuestionBloc>();
    questionBloc.add(FetchQuestion(widget.selectedExam));

    return
       BlocBuilder<QuestionBloc,QuestionState>(
         bloc: questionBloc,
         builder: (context, state) {
           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
        )),


      ],
    );

  }
}
在生成器中,您正在添加新事件。解析事件后,它将添加状态,并将此状态传递给生成器:

BlocBuilder正在侦听问题Bloc状态更改。使用BlocProvider可以添加事件,从而向BlocBuilder添加新状态

简而言之,您不应该添加相同类型的集团事件

BlocProvider.of(context.add)(FetchQuestion(widget.selectedExam))


在同一个Bloc builder(
BlocBuilder
)中。

您正在进行无限循环:

在生成器中,您正在添加新事件。解析事件后,它将添加状态,并将此状态传递给生成器:

BlocBuilder正在侦听问题Bloc状态更改。使用BlocProvider可以添加事件,从而向BlocBuilder添加新状态

简而言之,您不应该添加相同类型的集团事件

BlocProvider.of(context.add)(FetchQuestion(widget.selectedExam))


在同一个Bloc builder(
BlocBuilder
)中。

我做了您建议的更改,我收到了此错误。使用不包含类型为Question Bloc的Bloc的上下文调用BlocProvider.of()。从传递给toBlocProvider的上下文开始,找不到祖先。Provider必须是您从中调用questionBloc的小部件的父级。addI进行了您建议的更改,我收到此错误。使用不包含类型为Question Bloc的Bloc的上下文调用BlocProvider.of()。从传递给toBlocProvider的上下文开始,找不到祖先。必须是从中调用questionBloc.add的小部件的父级