Last active
September 29, 2020 22:25
-
-
Save guid-empty/b5897f1d7f46c238968e97d85ea82f66 to your computer and use it in GitHub Desktop.
Function Declaration - использование Function без явного определения сигнатуры
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Попробуйте задать явным образом тип коллбек-функции с использованием typedef. | |
Во вкладке solution мы можете увидеть решение проблемы с неявно заданной сигнатурой коллбек функции. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// 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. = | |
// ====================================================== | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// 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