Flutter - вызов методов из одного дочернего класса в другой дочерний класс - PullRequest
0 голосов
/ 04 марта 2019

Я только что вызвал методы из дочернего класса, работающего с помощью кого-то в этой теме .

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

Итак, визуально:

Parent class
  - Method()
      ^
      |
  Child class

Выше я могу легко получить доступ к методу класса Parent из дочернего класса.используя функцию обратного вызова в приведенной выше ссылке.

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

      Parent class
      |           |
Child class 1    Child class 2 
     - Method()  <-- callback

По-разному ли обрабатывается процедура для этой структуры?Возможно ли это, или вы можете когда-либо вызывать только родительский метод?

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Принцип работы флаттер-виджетов заключается в том, что дочерние виджеты в вашем случае находятся в дереве виджетов родителей.При обратном вызове дочернего класса 2 вы можете использовать setState, чтобы перестроить вашего родителя и, таким образом, перестроить любого из его потомков, например, изменив значение параметра в дочернем классе 1

.
0 голосов
/ 04 марта 2019

Хотя я думаю, что во флаттере было бы лучше использовать изменения состояния для обновления / запуска вызовов в виджетах пользовательского интерфейса, но для вашего конкретного случая delegate pattern может работать.Вот пример того, как я это сделаю.

abstract class TheTrigger { // you can use VoidCallback or whatever, this is just for the demo
  void triggerMe(); 
}

class ChildOneWidget extends StatelessWidget with TheTrigger {
  @override
  Widget build(BuildContext context) {
    return Container(); // add the content of the child one
  }

  @override
  void triggerMe() {
    // TODO: implement triggerMe 
  }
}

class ChildTwoWidget extends StatelessWidget {
  final TheTrigger trigger;

  const ChildTwoWidget({Key key, this.trigger}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      //something here that will trigger "the trigger"
      child: RaisedButton(onPressed: () {
        trigger?.triggerMe(); // you should use the "?" this will allow a bit more customisation on your widgets, you might want to use it without listener.
      }),
    );
  }
}

class ParrentWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    ChildOneWidget childOneWidget = ChildOneWidget();
    ChildTwoWidget childTwoWidget = ChildTwoWidget(trigger: childOneWidget); // here you set the "delegate"

    return ListView(
      children: <Widget>[childOneWidget, childTwoWidget], 
    );
  }
}

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

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