Как создать пользовательский конструктор класса (ElevatedButton) с параметрами, отличными от параметров конструктора родительского класса?

#flutter #dart

Вопрос:

Я пытаюсь создать пользовательский класс кнопок:

 import 'package:flutter/material.dart';

class PlayButton extends ElevatedButton {
  PlayButton(
      {required this.buttonText,
      required this.buttonColor,
      required this.onPress});

  final void Function()? onPress;
  final String buttonText;
  final Color buttonColor;

  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: onPress,
      child: Text(
        buttonText,
        style: TextStyle(fontFamily: 'Verdana'),
      ),
      style: ElevatedButton.styleFrom(
        onPrimary: Colors.white,
        primary: buttonColor,
        shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.circular(50),
        ),
        minimumSize: Size(100, 100),
      ),
    );
  }
}
 

Я получаю сообщение об ошибке со словами The superclass 'ElevatedButton' doesn't have a zero argument constructor.

Try declaring a zero argument constructor in 'ElevatedButton', or explicitly invoking a different constructor in 'ElevatedButton'.

Я могу написать конструктор как что-то вроде:

 PlayButton(
      {required this.buttonText,
      required this.buttonColor,
      required this.onPress})
      : super(child: Text('a'), onPressed: null);
 

и удалите сообщение об ошибке, но все, что отображается, — это кнопка суперкласса по умолчанию (с текстом «а»). Итак, как я могу наследовать конструктор от родительского класса, имея при этом параметры, отличные от родительских?

Ответ №1:

Похоже, вам вообще не нужно наследовать ElevatedButton . В любом случае Флаттер отдает предпочтение композиции, а не наследованию.

Просто удалите extends ElevatedButton и используйте extends StatelessWidget , и все будет в порядке.

Ответ №2:

Передайте свойства дочернего класса родительскому классу следующим образом:

 PlayButton(
      {required this.buttonText,
      required this.buttonColor,
      required this.onPress})
      : super(child: Text(this.buttonText), onPressed: this.onPress);
 

Надеюсь, это должно решить проблему.