Передайте обратный вызов в раскрывающуюся кнопку на измененном свойстве

#flutter #dart

Вопрос:

Я создаю новый виджет без состояния для последующего повторного использования

 import 'package:flutter/material.dart';

class JumpDropdown extends StatelessWidget {
  final int val;
  final Function callback;
  const JumpDropdown({Key? key, required this.val, required this.callback})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    return DropdownButton<int>(
      value: val,
      onChanged: (int? newValue) {},
    );
  }
}
 

Однако, когда я попытался передать callback onChanged свойство, оно не позволит сказать
The argument type 'Function' can't be assigned to the parameter type 'void Function(int?)?'.

 return DropdownButton<int>(
      value: val,
      onChanged: callback,
    );
 

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

1. можете ли вы попробовать изменить обратный вызов функции на обратный вызов VoidCallback

2. Попробовал VoidCallback, и он говорит The argument type 'void Function()' can't be assigned to the parameter type 'void Function(int?)?'.

Ответ №1:

Я думаю, что что-то подобное должно сработать:

 class JumpDropdown extends StatelessWidget {
  final int val;
  final void Function(int?)? callback;
  const JumpDropdown({Key? key, required this.val, required this.callback})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    return DropdownButton<int>(
      value: val,
      onChanged: callback,
    );
  }
}
 

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

 class JumpDropdown extends StatelessWidget {
  final int val;
  final VoidCallaback callback;
  const JumpDropdown({Key? key, required this.val, required this.callback})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    return DropdownButton<int>(
      value: val,
      onChanged: (int? v) => callback(),
    );
  }
}