簡體   English   中英

Flutter Bloc 在不改變狀態的情況下不斷重建小部件

[英]Flutter Bloc keeps rebuilding widget without state changing

學習 Bloc 模式,我偶然發現了這一點。 在第一頁中,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
        )),


      ],
    );

  }
}

'''

您正在制作無限循環:

在您的構建器中,您正在添加新事件。 解析事件后,它會添加狀態,並且此狀態將傳遞給構建器:

BlocBuilder正在監聽QuestionBloc狀態變化。 使用BlocProvider您正在添加事件,該事件將新狀態添加到BlocBuilder

長話短說,您不應該添加相同類型的 Bloc 事件

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

在同一個 Bloc 構建器中( BlocBuilder<QuestionBloc,QuestionState> )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM