#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) {… строка в моем вопросе. Повлияет ли это на ваше решение? Вы можете увидеть мой исправленный дочерний виджет в исходном вопросе