Сброс дочернего виджета из родительского виджета в flutter

#android #flutter #dart

#Android #flutter #dart

Вопрос:

У меня есть дочерний виджет, который полон переменных. Когда я выполняю setState() для моего родительского виджета, я хочу, чтобы он обновил дочерний виджет, чтобы все переменные внутри дочернего виджета были восстановлены. Вот, по сути, что я имею в виду.

Родительский виджет:

 class ParentWidget extends StatefulWidget {

  @override
  _ParentWidgetState createState() => _ParentWidgetState();
}

class _ParentWidgetState extends State<ParentWidget> {
  @override
  Widget build(BuildContext context) {
  return Scaffold(
     body: Column(
           children =[
                   ChildWidget(addAmount: addAmount),
                   RaisedButton(
                    child: Text('Reset Parent'),
                    onPressed: () => setState(){},
           ]
           ),
  );
}
 

И вот дочерний

 class ChildWidget extends StatefulWidget {

  final addAmount;
  ChildWidget({this.addAmount});

  @override
  _ChildWidgetState createState() => _ChildWidgetState();
}

class _ChildWidgetState extends State<ChildWidget> {

  int counter = 0;
  
  increaseCounter() {
     counter = counter   widget.addAmount;
  }

   @override
  Widget build(BuildContext context) {
  return Column(
         children:[
           RaisedButton(
                   child: Text('Add to counter'),
                   onPressed: () {
                       increaseCounter();
                       setState((){});
                      },
           ),
           Text($counter),
          ]
   );
}
}
 

Таким образом, по сути, когда я нажимаю родительскую кнопку сброса, я хочу иметь возможность снова установить счетчик в дочернем виджете на ноль. Но он не сбрасывается на 0, он сохраняет число, которое он суммировал. Как мне сбросить переменные дочернего виджета из родительского?

Ответ №1:

вы должны использовать didUpdateWidget :

 class ChildWidget extends StatefulWidget {

  final addAmount;
  ChildWidget({this.addAmount});

  @override
  _ChildWidgetState createState() => _ChildWidgetState();
}

class _ChildWidgetState extends State<ChildWidget> {

  int counter = 0;

  @override
  void didUpdateWidget(covariant S oldWidget) {
    super.didUpdateWidget(oldWidget);
    counter = 0;
  }
  
  increaseCounter() {
     counter = counter   widget.addAmount;
  }

  return Column(
         children:[
           RaisedButton(
                   child: Text('Add to counter'),
                   onPressed: () {
                       increaseCounter();
                      },
           ),
           Text($counter),
          ]
   );
 

Комментарии:

1. Спасибо за ваш ответ. Я пропустил сборку виджета (BuildContext context context) {… строка в моем вопросе. Повлияет ли это на ваше решение? Вы можете увидеть мой исправленный дочерний виджет в исходном вопросе