Я новичок во Флаттере и прохожу вводный курс по Udacity. В одной из задач я пытался следовать коду и не могу понять его. Вот код из решения проекта (я вырезал и вставил важные части, а также юридический отказ от ответственности. Мне не принадлежит этот код, он взят из примера проекта Flutter Udacity):
Widget build(BuildContext context) {
final input = Padding(
padding: _padding,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
TextField(...),
_createDropdown(_fromValue.name, _updateFromConversion),
],
),
);
}
void _updateFromConversion(dynamic unitName) {
setState(() {
_fromValue = _getUnit(unitName);
});
if (_inputValue != null) {
_updateConversion();
}
}
Widget _createDropdown(String currentValue, ValueChanged<dynamic> onChanged) {
return Container(
margin: EdgeInsets.only(top: 16.0),
decoration: BoxDecoration(...),
padding: EdgeInsets.symmetric(vertical: 8.0),
child: Theme(...),
child: DropdownButtonHideUnderline(
child: ButtonTheme(
alignedDropdown: true,
child: DropdownButton(
value: currentValue,
items: _unitMenuItems,
onChanged: onChanged,
style: Theme.of(context).textTheme.title,
),
),
),
),
);
}
Вот где я застрял. Для _updateFromConversion требуется входной параметр unitName. Но когда они вызывают это, в _createDropdown они не пропускают ничего. Так как же _updateFromConversion узнать, что такое unitName? Кроме того, выполняется ли _updateFromConversion перед _createDropdown или выполняется, когда установлено свойство onChanged DropdownButton?
Второй вопрос: они передают эту функцию с возвращаемым типом void в _createDropdown, который ожидает ValueChanged. Разве это не должно вызвать ошибку?
Если кто-то может объяснить поток этого кода и то, что мне не хватает, я был бы очень признателен. Спасибо!