Flutter Bloc在不改变状态的情况下不断重建窗口小部件

问题描述 投票:0回答:1

学习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
        )),


      ],
    );

  }
}

´´´

android flutter dart provider bloc
1个回答
0
投票

您正在进行无限循环:

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

BlocBuilder正在侦听QuestionBloc状态更改。使用BlocProvider,您将添加事件,这会将新状态添加到BlocBuilder

长话短说,您不应添加相同类型的Bloc事件

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

在同一Bloc生成器(BlocBuilder<QuestionBloc,QuestionState>)中。

© www.soinside.com 2019 - 2024. All rights reserved.