Не удается отобразить пользовательский виджет Flutter

#flutter #dart #flutter-layout

#флаттер #dart #flutter-layout

Вопрос:

Я новичок в Flutter и Dart и пытаюсь создать класс контейнера с возможностью просмотра, основанный на классе GestureDetector. Мой код для моего контейнера показан ниже:

 class CustomWidget extends GestureDetector
{
   final aTitle;

   CustomWidget(this.aTitle)
   {
     onTap() {
       print("$aTitle was pressed!");
     }

     child: new Container(
       padding: const EdgeInsets.all(8),
       child: Text(aTitle),
       color: Colors.blueGrey[200],
     );
   }
}
  

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

   body: CustomScrollView(
    primary: false,
    slivers: <Widget>[
      SliverPadding(
        padding: const EdgeInsets.all(20),
        sliver: SliverGrid.count(
          crossAxisSpacing: 10,
          mainAxisSpacing: 10,
          crossAxisCount: 2,
          children: <Widget>[
            CustomWidget('Test Display'),
          ],
        ),
      ),
    ],
  ),
  

Кажется, у меня две проблемы: (1) моя среда разработки сообщает мне, что мой метод onTap () «не используется», что указывает на то,
что он не будет захватывать события касания, и (2) это, похоже, не имеет большого значения, потому что экземпляр CustomWidget, который я
создаю в виджете приложения, являетсяне отображается на моем экране.

Я явно что-то упускаю. Может кто-нибудь помочь мне исправить мой код, чтобы мой пользовательский виджет отображался и обрабатывал события onTap?

Ответ №1:

Вообще говоря, CustomWidget — хорошая идея, но наследование — неправильная реализация. Flutter сильно предпочитает композицию наследованию.

Ваш пользовательский виджет, использующий композицию:

 class CustomWidget extends StatelessWidget {
  final String title;
  
  const CustomWidget(this.title);
  
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
       print("$title was pressed!");
      },
     child: new Container(
       padding: const EdgeInsets.all(8),
       child: Text(title),
       color: Colors.blueGrey[200],
     ));
  }
}