Виджет Flutter Card onTap(), чтобы открыть Sliable

У меня есть виджет Slidable с ребенком Card, и мне интересно, могу ли я открыть Slidable, когда я нажимаю на Card? Я пробовал использовать SlidableController, но этот класс кажется глючным, поскольку он продолжает возвращать мне ноль. Кроме того, я также пробовал использовать свойство groupTag в Slidable, но оно также не работало в моем проекте. Ниже приведен пример кода и надеюсь, что кто-нибудь сможет помочь:

Slidable(
  endActionPane: ActionPane(motion: const DrawerMotion(), children: [
    Expanded(
        child: Container(
            decoration: BoxDecoration(
                borderRadius: BorderRadius.only(
                    topRight: smallCircularRadius,
                    bottomRight: smallCircularRadius),
                gradient: customColors.progressBarGradient),
            child: ContactOptions(
                contact: data.getContact(), email: data.email)))
  ]),
  child: CustomCard(
      onTap: () {
        Slidable.of(context)!.openEndActionPane();
      },
      child: ListTile(
          dense: true,
          leading: Icon(Icons.supervised_user_circle, size: 50),
          title:
              Text('KOO KIAN KEAT'),
          subtitle: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Text('----',
                    style: customTextStyles.bodySmall)
              ]))))
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
150
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Следуя документации:

Вы можете сделать что-то вроде

final controller = SlidableController();

// Open the actions
void _handleOpen() {
  controller.openEndActionPane();
  // OR
  //controller.openStartActionPane();
}

// ...

child: Slidable(
    controller: controller,
    endActionPane: ActionPane(
      motion: const DrawerMotion(),
      ...
))

Итак, поместите свою карту в виджет Inkwell.

child: InkWell(
  onTap: _handleOpen,
  child: const Card(
    margin: EdgeInsets.zero,
    elevation: 0,
    child: ListTile(
      dense: true,
      leading: Icon(Icons.supervised_user_circle, size: 50),
      title: Text('KOO KIAN KEAT'),
      subtitle: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [Text('----')],
      ),
    ),
  ),
),

Я попробовал первый упомянутый метод, но не могу создать SlidableController в своем проекте.

Leong 21.03.2024 04:16

@Leong «Не могу создать SlidableController». Какую ошибку вы получаете?

Wh1t3rabbit 21.03.2024 05:05

«1 позиционный аргумент ожидается SlidableController.new, но найдено 0. Попробуйте добавить недостающий аргумент».

Leong 21.03.2024 05:13

я пробовал так: late SlidableController controller = SlidableController(this);, тогда мне удалось создать контроллер, но когда я применяю controller!.openEndActionPane(), он всегда возвращает мне нулевое значение

Leong 21.03.2024 05:19

вы сделали горячую перезагрузку после создания поздней переменной?

Emanoel Aleixo 21.03.2024 13:13
Ответ принят как подходящий

Пожалуйста, замените вашего ребенка на код ниже

Slidable(
     endActionPane: ActionPane(motion: const DrawerMotion(), 
     children: [
      Expanded(
        child: Container(
            decoration: BoxDecoration(
                borderRadius: BorderRadius.only(
                    topRight: smallCircularRadius,
                    bottomRight: smallCircularRadius),
                gradient: customColors.progressBarGradient),
            child: ContactOptions(
                contact: data.getContact(), email: data.email)))
  ]),
  child: CardWidget()
) 


 class CardWidget extends StatelessWidget {
    const CardWidget({
        Key? key,
      }) : super(key: key);
    
  final Color color;
  final String text;

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        Slidable.of(context)!.openEndActionPane();
      },
      child: Card(
        margin: EdgeInsets.zero,
        elevation: 0,
        child: ListTile(
          onTap: () {
            Slidable.of(context)!.openEndActionPane();
          },
          leading: Icon(Icons.supervised_user_circle, size: 50),
          title: Text('KOO KIAN KEAT'),
          subtitle: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [Text('----')],
          ),
        ),
      ),
    );
  }
}

Могу ли я узнать, какую версию/какую библиотеку вы использовали в классе SlidableState?

Leong 21.03.2024 04:58

@Leong Пожалуйста, проверьте ответ выше, я отредактировал некоторый код

Naman R. 21.03.2024 06:43

Slidable.of(context)!.openEndActionPane() выдаст мне «Нулевая проверка, использованная для нулевого значения»...

Leong 21.03.2024 07:11

Используйте приведенный выше код для вашего дочернего виджета и превратите этот дочерний элемент в конкретный виджет без сохранения состояния.

Naman R. 21.03.2024 07:20

Я использую его в своем дочернем виджете, и это виджет без сохранения состояния.

Leong 21.03.2024 07:22

Можете ли вы предоставить мне снимок вашего кода, чтобы я мог помочь вам больше в вашей проблеме?

Naman R. 21.03.2024 07:35

Я уже обновил свой код в вопросе

Leong 21.03.2024 07:51

вместо вашего кода используйте CardWidget в дочернем коде

Naman R. 21.03.2024 07:54

CustomCard в моем коде по сути то же самое, что и ваш CardWidget (Card, завернутый в GestureDetector)

Leong 21.03.2024 08:01

Пожалуйста, проверьте ответ выше, я отредактировал некоторый код

Naman R. 21.03.2024 08:07

пока я вызываю строку Slidable.of(context)!.openEndActionPane();, мне будет предложено «Нулевая проверка используется для нулевого значения». Я думаю, это потому, что Slidable.of(context) продолжает возвращать мне нулевое значение...

Leong 21.03.2024 08:10

Замените приведенный выше код на свой код

Naman R. 21.03.2024 08:16

Могу ли я узнать, в чем проблема с моим кодом?

Leong 21.03.2024 08:27

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