Flutter Blo c продолжает перестраивать виджет без изменения состояния - PullRequest
0 голосов
/ 24 марта 2020

Learning Blo c шаблон, и я наткнулся на это. На первой странице ExamBlo c обрабатывает выбор экзаменов и отображение. После того, как пользователь выбрал экзамен, открывается страница викторины с выбранным экзаменом. QuestionBlo c извлекает вопросы и передает их виджету с сохранением состояния для отображения вопросов. Вопрос отображается правильно.

Однако вся страница непрерывно перестраивается без причины. Я попробовал виджет с полным состоянием и без состояния виджета 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
        )),


      ],
    );

  }
}

´´´

1 Ответ

1 голос
/ 24 марта 2020

Вы делаете бесконечным l oop:

В вашем строителе вы добавляете новое событие. После анализа события оно добавляет состояние, и это состояние передается разработчику:

BlocBuilder прослушивает QuestionBlo c изменения состояния. С BlocProvider вы добавляете событие, которое добавляет новое состояние к BlocBuilder .

Короткая история, вы не должны добавлять тот же тип Blo c событий

(BlocProvider.of<QuestionBloc>(context).add(FetchQuestion(widget.selectedExam)))

в том же Blo c строителе (BlocBuilder<QuestionBloc,QuestionState>).

...