Skip to content

Instantly share code, notes, and snippets.

@guid-empty
Last active September 29, 2020 22:25
Show Gist options
  • Save guid-empty/b5897f1d7f46c238968e97d85ea82f66 to your computer and use it in GitHub Desktop.
Save guid-empty/b5897f1d7f46c238968e97d85ea82f66 to your computer and use it in GitHub Desktop.
Function Declaration - использование Function без явного определения сигнатуры
Попробуйте задать явным образом тип коллбек-функции с использованием typedef.
Во вкладке solution мы можете увидеть решение проблемы с неявно заданной сигнатурой коллбек функции.
/// Flutter Mobile Developer
/// Function Declaration - использование Function без явного определения сигнатуры
///
/// Вы разработчик класса WidgetState и ожидаете,
/// что снаружи вам передадут callback с сигнатурой (int currentState) {}
/// Этот коллбек вы,как разработчик, планируете использовать для передачи
/// нового состояния вызывающему коду
///
class WidgetState {
Function _afterStateCallback;
int _currentState = 0;
WidgetState(this._afterStateCallback);
void changeState() {
_currentState++;
_afterStateCallback.call(_currentState);
}
}
///
/// В этом коде мы создаем экземпляр класс WidgetState,
/// и начинаем модифицировать его состояние, при этом
/// мы хотим получить получать уведомления о новом состоянии
///
void main() {
final state = WidgetState((int currentState) {
print('current widget state is $currentState');
});
state.changeState();
state.changeState();
// проблема в том, что если вы не знаете сигнатуру коллбека,
// то легко сможете ошибиться, не указав или указав неправильные аргументы
// попробуйте выполнить такой код, вы получите сообщение об ошибке в runtime
// раскомментируйте следующий код >>>>>
// после запуска кода на выполнение мы получим ошибку в runtime
// final otherState = WidgetState(() {
// print('state changed');
// });
// otherState.changeState();
// ======================================================
// = Для решения проблемы посмотрите Hint или Solution. =
// ======================================================
}
/// Flutter Mobile Developer
/// Function Declaration - использование Function без явного определения сигнатуры
/// ===============================================
/// = Для запуска скопируйте код во вкладку Dart. =
/// ===============================================
/// Определяем явным образом контракт (сигнатуру) метода,
/// который будем использовать в качестве
/// коллбек на изменение состояния
typedef StateChangedCallback = void Function(int newState);
///
/// Вы разработчик класса WidgetState и ожидаете,
/// что снаружи вам передадут callback с сигнатурой (int currentState) {}
/// Этот коллбек вы,как разработчик, планируете использовать для передачи
/// нового состояния вызывающему коду
///
class WidgetState {
/// Явным образом указали тип коллбек-функции
StateChangedCallback _afterStateCallback;
int _currentState = 0;
WidgetState(this._afterStateCallback);
void changeState() {
_currentState++;
_afterStateCallback.call(_currentState);
}
}
///
/// В этом коде мы создаем экземпляр класс WidgetState,
/// и начинаем модифицировать его состояние, при этом
/// мы хотим получить получать уведомления о новом состоянии
///
void main() {
final state = WidgetState((int currentState) {
print('current widget state is $currentState');
});
state.changeState();
state.changeState();
// проблема в том, что если вы не знаете сигнатуру коллбека,
// то легко сможете ошибиться, не указав или указав неправильные аргументы
// попробуйте выполнить такой код, вы получите сообщение об ошибке в runtime
// раскомментируйте следующий код -
// вы увидите ошибку на этапе статического анализа кода еще до запуска
final otherState = WidgetState((double a) {
print('state changed');
});
otherState.changeState();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment