Я полностью согласен с Дэвидом в использовании некоторых State Management
, например Providers
, BLoC
. Но если вы используете одностраничное управление состоянием, вы можете пока оставить его, поскольку это сложные темы. Он также требует импорта некоторых пакетов, например providers
, flutter_bloc
et c.
Что вы можете сделать, так это использовать простую версию State Management
, а именно ValueListenableBuilder class .
- Он проверяет значение, которое вы для него определили, то есть в объекте
ValueNotifier
, а затем вы переходите к нему. Это обязательно. - Вы оборачиваете виджет, который будет перестраиваться во время изменения значения, в данном случае
textVahy
и bottomRect
Вы оборачиваете свой виджет в свой ValueListenableBuilder
для textVahy
и bottomRect
Теперь давайте поговорим так, как вы хотите понять.
Мы берем значение bool
, которое должно быть отправлено на два виджета в вашем дереве с помощью ValueNotifier
// taking the initial value as true
ValueNotifier<bool> _myBool = ValueNotifier<bool>(true);
Теперь мы оборачиваем два виджета, на которые влияет только изменение значения.
Обратите внимание: Никакие другие виджеты не должны быть обернуты, которые не нужно менять с помощью bool
ValueListenableBuilder(
// the value is myBool's value only
builder: (BuildContext context, bool value, Widget child) {
// This builder will only get called when _myBool
// is updated.
return Column(
children: <Widget>[
// whatever operation you wanna do based upon your value
// listen to value, since it has a param, it shows text with value
// if the value is false, else show you textVahy and bottomRect
if value ? textVahy : Text('$value'),
if value ? bottomRect : Text('$value')
]
);
},
// passing ValueNotifier object to listen for any changes
valueListenable: _myBool
)
Теперь, когда вы хотите изменить значение _myBool
через deleteBtn
, вы просто делаете это через setState()
RaisedButton(
onPressed: (){
// please note _myBool is the object of ValueNotifier, but _myBool.value has
// the right variable to store the predefined data
setState(() => _myBool.value = false);
},
child: Text('Delete Me!!')
)
. Как только вы нажмете кнопку, значение будет отправлено на ValueListenableBuilder()
, и в соответствии с bool
оно восстановит виджеты. , которые в нее завернуты.