Flutter - установка значения переменной одного виджета с отслеживанием состояния из другого виджета с отслеживанием состояния - PullRequest
0 голосов
/ 18 апреля 2020

Я новичок во флаттере, и это может быть очень непростой вопрос, но я хочу установить состояние переменной одного виджета с состоянием из другого виджета с состоянием.

Совместное использование небольшого фрагмента, который воспроизводит проблему, с которой я столкнулся .

FirstWidget.dart

class FirstWidget extends StatefulWidget {
  @override
  _FirstWidgetState createState() => _FirstWidgetState();
}

class _FirstWidgetState extends State<FirstWidget> {

bool _isDisabled = true; 

 @override
  Widget build(BuildContext context) {
    return Container(
               // Doing Something with the flag isDisabled
);
  }
}

SecondWidget.dart

class SecondWidget extends StatefulWidget {
  @override
  _SecondWidgetState createState() => _SecondWidgetState();
}

class _SecondWidgetState extends State<SecondWidget> {

 @override
  Widget build(BuildContext context) {
    return Container(
        // Here I want to update the isDisabled Flag of the First Widget. 
);

  }
}

Я просто хочу знать, как обновить значение переменной одного виджета из другой виджет.

Спасибо

1 Ответ

1 голос
/ 18 апреля 2020

Для этого вы можете использовать GlobalKey. GlobalKey используются для идентификации указанного c виджета в дереве виджетов.

Пример использования:

В файле FirstWidget.dart:

class FirstWidget extends StatefulWidget {
  @override
  FirstWidgetState createState() => FirstWidgetState();
}

// Make sure your FirstWidgetState class is not private!
class FirstWidgetState extends State<FirstWidget> {

  bool _isDisabled = true;

  void enable(bool value) {
    setState(() => _isDisabled = !value);
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      // Doing Something with the flag isDisabled
    );
  }
}

В файле SecondWidget.dart (я немного изменил этот файл, чтобы показать использование GlobalKey):

final GlobalKey<FirstWidgetState> firstWidgetGlobalKey = new GlobalKey<FirstWidgetState>();

class SecondWidget extends StatefulWidget {
  @override
  _SecondWidgetState createState() => _SecondWidgetState();
}

class _SecondWidgetState extends State<SecondWidget> {

 @override
  Widget build(BuildContext context) {
    return Container(
      child: Column(
        children: <Widget>[
          FirstWidget(
            key: firstWidgetGlobalKey,
          ),
          RaisedButton(
            onPressed: () {
              firstWidgetGlobalKey.currentState.enable(true);
            },
            child: Text("Enable First Widget"),
          ),
        ],
      ),
    );
  }
}

EDIT

Экземпляр GlobalKey должен быть уникальным во всем приложении. Поэтому более разумный способ использовать глобальные ключи - хранить их все в отдельном файле (например, keys.dart). В этом файле вы можете иметь firstWidgetGlobalKey и secondWidgetGlobalKey в качестве конечных переменных и просто импортировать файл для их использования.

Недостатком (но это предполагаемое поведение) является то, что GlobalKey может только будет использоваться, когда идентифицируемый виджет в настоящее время присутствует в дереве виджетов , в противном случае вы получите нулевую ссылку на currentState.

Другой способ получить доступ к состоянию виджета из другой - использовать InheritedWidget . Так как это требует больше усилий, есть большое и простое руководство, показывающее использование: InheritedWidget Tutorial на Medium .

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...