Как мне настроить дерево виджетов во Flutter? - PullRequest
0 голосов
/ 06 августа 2020

Это дерево виджетов моего приложения. Дерево виджетов

В виджете deleteBtn находится кнопка. Если я нажму кнопку, он должен отправить значение false в textVahy и bottomRect . Есть какой-нибудь простой способ сделать это? Может быть, это можно сделать с помощью Inherited Widget, но я не могу использовать этот виджет ... Так вот какой простой способ сделать это?

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Я полностью согласен с Дэвидом в использовании некоторых 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 оно восстановит виджеты. , которые в нее завернуты.

1 голос
/ 07 августа 2020

Я бы посоветовал использовать какое-то управление состоянием, например Blo C или Redux. В случае Redux вы можете обернуть свой «dropDown» внутри StoreProvider, который позволяет вам обрабатывать различные события из различных виджетов. Эти виджеты нужно обернуть внутри StoreConnector. После того, как вы отправите действие редуктору из одного соединителя, скажем, tour "deleteBtn", вы можете определить, как отреагирует другой соединитель. Взгляните на пример здесь .

...