Как родительский компонент flutter вызывает дочерний компонент?

#dart #flutter

#dart #flutter

Вопрос:

Как родительский компонент запускает методы дочернего компонента? Как мне запустить метод щелчка сына в fathor? Как показано ниже:

введите описание изображения здесь

введите описание изображения здесь

Комментарии:

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

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

Ответ №1:

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

Вы сохраните функцию как переменную-член, и при нажатии на ваш дочерний компонент вы вызовете эту функцию. Функция будет вызываться в вашем родительском элементе, вы можете передавать любые данные, которые хотите, обратно родительскому элементу, точно так же, как при вызове обычной функции.

Вот некоторый псевдокод, который вы можете использовать для настройки

 class son extends StatelessWidget {
  Function onClicked;

  son({this.onClicked});

  Widget build(...) {
    return GestureDetector(
      child: Container(...),
      onTap: onClicked
    )
  }
}

class father extends StatelessWidget {
  Widget build(...) {
    return Container(
      child:son(onClicked: _clicked)
    )
  }

  void _clicked() {
    print('clicked');
  }
}
 

Кроме того, обязательно измените имена своих классов, чтобы они начинались с заглавной буквы.

Комментарии:

1. Хотя вы не решили мою проблему, я очень ценю ваш ответ.

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

3. я думал, что OP хочет вызвать дочернюю функцию из родительского виджета? что это делает, так это вызывает функцию родительского виджета, а не дочернего.

Ответ №2:

 class Father extends StatelessWidget {
  var child;

  @override
  Widget build(BuildContext context) {
    child = son();
    
    return Scaffold(
      body: child,
      floatingActionButton: FloatingActionButton(
        onPressed: () => child?.childFunction(),
      ),
    );
  }
}

class Son extends StatelessWidget {
  void childFunction() => print('called in child widget');

  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.red,
    );
  }
}
 

Комментарии:

1. Это решает вашу проблему, но son будет создаваться снова и снова в функции сборки. При навигации, при изменении состояния, при горячей перезагрузке. Убедитесь, что вы не идете вразрез с тем, как приложения flutter «должны быть созданы».

2. @FilledStacks есть какие-либо предложения, чтобы избежать этого?

3. @FilledStacks Сначала я собирался опубликовать ответ, который вы сделали, но потом я увидел, что OP хочет пойти другим путем. Не знаю, почему. Итак, я написал этот код и нахожу странным работать таким образом.

4. @Doc да. Передайте нужное состояние в свой StatelessWidget от родительского. Зависит от того, чего OP хочет достичь с помощью этой функциональности. Если они хотят вызвать вызов в дочернем компоненте, который изменяет его состояние, это состояние может быть определено родительским компонентом и передано через конструктор в функции сборки.

5. @Doc вы были правы, просто ответив на вопрос 🙂 Сначала я тоже собирался это сделать, но это не очень хороший шаблон для реализации.