Как отправить сигнал «кнопка нажата» в более высокий класс в иерархии дерева виджетов в flutter?

#android #flutter #dart

Вопрос:

В иерархии моего дерева приложений у меня есть виджет с отслеживанием состояния, который представляет элементы списка. Давайте назовем этот предмет класса. Этот виджет содержит изображение, некоторый текст и кнопку удаления, которая должна удалить элемент при его нажатии. Позже в коде у меня есть другой класс с отслеживанием состояния, который содержит представление списка и список элементов, на основе которого создается представление списка.
Моя проблема в том, что onPressed() атрибут каждого элемента помещается в класс элемента, а не в верхний класс (представление списка), в котором должна выполняться операция удаления. Как я могу это исправить? Как я могу посылать сигнал всякий раз, когда кнопка нажата на родительский виджет, чтобы инициировать удаление элемента?

 import 'package:flutter/material.dart';

class Item extends StatefulWidget {
  const Item({ Key? key }) : super(key: key);

  @override
  _ItemState createState() => _ItemState();
}

class _ItemState extends State<Item> {
  @override
  Widget build(BuildContext context) {
    return Container(
        child: Row(children: [
          Image(),
          Text('abc'),
          Text('abc'),
          Text('abc'),
          ElevatedButton(onPressed: ????? , child: Text('RemoveButton'))
        ],),
    );
  }
}


class ListOfItems extends StatefulWidget {
  const ListOfItems({ Key? key }) : super(key: key);

  @override
  _ListOfItemsState createState() => _ListOfItemsState();
}

class _ListOfItemsState extends State<ListOfItems> {

  List<Item> ls = [];
  int numOfItems = 0;


  @override
  Widget build(BuildContext context) {
    return ListView(children: ls,)
  }
}
 

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

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

2. @kzrfaisal Я еще не проверял это. Я приму это после этого. Спасибо за ответ.

Ответ №1:

Попробуй вот так

 import 'package:flutter/material.dart';

class Item extends StatefulWidget {
  final void Function(dynamic data) onPressedHandler;
  const Item({ @required this.onPressedHandler, Key? key }) : super(key: key);

  @override
  _ItemState createState() => _ItemState();
}

class _ItemState extends State<Item> {
  @override
  Widget build(BuildContext context) {
    return Container(
        child: Row(children: [
          Image(),
          Text('abc'),
          Text('abc'),
          Text('abc'),
          ElevatedButton(onPressed: () {
            final data = 'Any additional data you want to paas';
            widget.onPressedHandler(data);
          } , child: Text('RemoveButton'))
        ],),
    );
  }
}


class ListOfItems extends StatefulWidget {
  const ListOfItems({ Key? key }) : super(key: key);

  @override
  _ListOfItemsState createState() => _ListOfItemsState();
}

class _ListOfItemsState extends State<ListOfItems> {

  List<Item> ls = [];

  int numOfItems = 0;

  onPressedHandler(data) {

  }

  @override
  Widget build(BuildContext context) {
    return ListView(children: [
      Item(onPressedHandler: onPressedHandler),
    ],);
  }
}