Разбивайте диалоги в собственном файле или классе

У меня вопрос для новичков. Очень просто разбить виджет на собственный класс. Как столбец с кнопками в виджете без состояния, который принимает некоторые функции и некоторые строки в конструкторе. Затем я могу включить и использовать это с любого экрана и виджета в моем приложении.

Но как этого добиться с помощью диалогов? Если я создаю диалог, я хотел бы иметь его в отдельном файле, чтобы я мог просто импортировать его, а затем передавать в него функции и тексты.

Прямо сейчас я пытаюсь вывести диалог выбора из пакета flutter_picker . На одном из моих экранов это:

        void _showTimeDialog() {
    Picker(
      adapter: NumberPickerAdapter(data: <NumberPickerColumn>[
        NumberPickerColumn(begin: 0, end: 60, initValue: _minutes),
        NumberPickerColumn(begin: 0, end: 60, initValue: _seconds),
      ]),
      delimiter: <PickerDelimiter>[
        PickerDelimiter(
          child: Container(
            width: 30.0,
            alignment: Alignment.center,
            child: Text(':'),
          ),
        )
      ],
      builderHeader: (context) {
        return Padding(
          padding: const EdgeInsets.symmetric(vertical: 20),
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: [
              Text('MINUTES'),
              Container(
                width: 30,
              ),
              Text('SECONDS'),
            ],
          ),
        );
      },
      hideHeader: false,
      confirmText: 'OK',
      diameterRatio: 1.3,
      magnification: 1.3,
      height: 100,
      squeeze: 1,
      title: Center(child: const Text('DURATION')),
      selectedTextStyle: TextStyle(color: Theme.of(context).primaryColor),
      onConfirm: (Picker picker, List<int> value) {
        onConfirmDurationPicker(picker, value);
      },
    ).showDialog(context);
  }

  void onConfirmDurationPicker(Picker picker, List<int> value) {
    setState(() {
      _minutes = picker.getSelectedValues()[0];
      _seconds = picker.getSelectedValues()[1];
    });
  }

Я бы хотел, чтобы это было в отдельном файле. И затем я хочу передать функцию onConfirmDurationPicker(которая будет меняться на разных экранах) и некоторые другие значения для установки этого сборщика. Но я не хочу дублировать весь этот код на каждом отдельном экране, для которого нужен такой диалог выбора.

Какой кошерный способ разбить подобные вещи в его собственных классах / файлах? Дайте мне знать, если что-то неясно в моем вопросе.

1 ответ

Вы на правильном пути! Действительно, лучше всего разделить ваше приложение на значимые части, чтобы избежать шаблонного кода. В вашем случае просто создайте новый файл и создайте там виджет без сохранения состояния. Этот виджет без сохранения состояния должен возвращать ваш Picker и может принимать аргументы через свой конструктор. Затем вы можете вызывать свой класс с помощью .showDialog(context) где угодно!

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