Функция обратного вызова Flutter - PullRequest
0 голосов
/ 10 июля 2020

У меня есть количество, которое нужно обновить в родительском виджете. Количество необходимо обновить при нажатии значка + или - в дочернем виджете. Я передал функцию обратного вызова дочернему виджету без сохранения состояния, но он не работает. Вместо этого я получаю сообщение об ошибке setstate () или markneedsbuild (), вызванное во время сборки.

Это родительский виджет

class Wash extends StatefulWidget {
  @override
  _WashState createState() => _WashState();
}

class _WashState extends State<Wash> {
   int quantity = 0;

   void updateQuantity(command) {
     if (command == 'add') {
       setState(() {
        quantity++;
       });
     } else {
      setState(() {
       quantity--;
     });
    }  
   }

 @override
 Widget build(BuildContext context) {
   return Scaffold(
    body: OrderTile(
          imgPath: 'shorts',
          itemType: 'Shorts',
          quantityCallBack: updateQuantity,
        ),
   );
 }

Это дочерний виджет

class OrderTile extends StatelessWidget {
OrderTile({this.itemType, this.imgPath, this.quantityCallBack});

final String imgPath;
final String itemType;
final Function quantityCallBack;

@override
Widget build(BuildContext context) {
return Padding(
  padding: EdgeInsets.all(12.0),
  child: Row(
    children: <Widget>[
      Expanded(
        flex: 1,
        child: CircleAvatar(
          backgroundImage: AssetImage('images/${imgPath}.jpg'),
          radius: 30.0,
        ),
      ),
      Expanded(
        flex: 3,
        child: _Description(
          title: itemType,
        ),
      ),
      GestureDetector(
        onTap: quantityCallBack('add'),
        child: Icon(
          Icons.add,
          size: 24.0,
        ),
      ),
      SizedBox(
        width: 14,
      ),
      Text('1'),
      SizedBox(
        width: 14,
      ),
      GestureDetector(
        onTap: quantityCallBack('remove'),
        child: Icon(
          Icons.remove,
          size: 24.0,
        ),
      ),
    ],
  ),
);
}
}

Правильно ли я поступаю для реализации обратного вызова функции?

1 Ответ

2 голосов
/ 10 июля 2020

Вы неправильно вызываете свою функцию обратного вызова внутри своего onTap обратного вызова. Изменение:

onTap: quantityCallBack('add'),

для

onTap: () => quantityCallBack('add'),

Вы можете передать функцию тем же способом, который вы передали, только если они имеют тот же тип. В этом случае onTap равно void function(), у него нет аргументов.

Кроме того, вы не передаете обновленное значение quantity вашему Text Widget

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...