Как передать обратный вызов во Flutter

Код все объяснит:

    class ResultOverlay extends StatefulWidget {
    
      final bool _isCorrect;
      VoidCallback _onTap;
    
      ResultOverlay(this._isCorrect, this._onTap);
      ......
      ......
}

Его государственный класс:

class ResultOverlayState extends State<ResultOverlay>{
@override
  Widget build(BuildContext context) {
    ........
      child: new InkWell(
        onTap: () => widget._onTap,
.....
.....
}

Передача функции обратного вызова:

new ResultOverlay(isCorrect, () {
                        () => CallAnswerPage();
                      })

Что мне здесь не хватает?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
25
0
34 938
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Все хорошо, кроме того, как ты им пользуешься.

Изменять

    onTap: () => widget._onTap,

к

    onTap: widget._onTap,

внутри вашего класса State

Ответ принят как подходящий

Я неправильно передавал обратный вызов. Вот правильный синтаксис: -

new ResultOverlay(isCorrect, 
                      () => callAnswerPage()
                    )

Такая глупая ошибка :)

Это более общий ответ для будущих зрителей.

Типы обратного звонка

Есть несколько различных типов предопределенных обратных вызовов:

final VoidCallback myVoidCallback = () {};
final ValueGetter<int> myValueGetter = () => 42;
final ValueSetter<int> myValueSetter = (value) {};

Заметки:

  • VoidCallback - анонимная функция, которая не принимает аргументов и не возвращает значения.
  • ValueGetter - это анонимная функция, которая возвращает значение, которое вы предоставляете тому, кто хочет его получать.
  • ValueSetter - это анонимная функция, которая принимает значение в качестве аргумента, которое вы можете использовать для набор некоторого другого значения.

Подробнее см. этот ответ.

Способы написать обратный звонок

Хорошо

Когда вас просят предоставить обратный вызов API, вы можете напрямую написать обратный вызов:

onPressed: () {},

Или вы можете указать имя переменной обратного вызова (без скобок):

onPressed: myVoidCallback,

Менее хорошо

Было бы излишне многословно использовать обе формы (но вы могли бы, если бы вы добавили круглые скобки после имени переменной):

onPressed: () {
  myVoidCallback();
},

Это эквивалентно (но также излишне многословно):

onPressed: () => myVoidCallback(),

Просто используйте одну из «Хороших» форм сверху.

Все еще хорошо

Исключение было бы, если бы вы хотели сделать что-то вроде вызова установщика значения, когда параметр запрашивает только обратный вызов void:

onPressed: () => myValueSetter(42),

Другие вопросы по теме