использовать метод setState для метода возвращаемого значения PopupMenuButton на флаттере - PullRequest
0 голосов
/ 02 мая 2020

если я разделил widgetful (PopupMenuButton) в другом файле дротика, я не могу использовать метод установки состояния?

хотя PopupMenuButton является подклассом насыщенного виджета, я не могу использовать setState?!

код:

PopupMenuButton<String> appBarMenu(BuildContext context, RateMyApp _rateMyApp) {
  return PopupMenuButton<String>(
      itemBuilder: (BuildContext context) {
        return choicesMenuBtn.map((String choice) {
          return PopupMenuItem<String>(
            child: Text('RateUS'),
          );
        }).toList();
      },
      onSelected: (val) {
        if (val == rateUsMenuBtn) {
          _rateMyApp.showStarRateDialog(
            context,
            actionsBuilder: (_, count) {
              final Widget cancelButton = RateMyAppNoButton(
                _rateMyApp,
                text: 'CANCEL',
                      //here is the problem
                callback: () => setState(() {}),
              );
            },
          );
        }
      });
}

1 Ответ

1 голос
/ 02 мая 2020

метод state и setState доступны только внутри класса, который расширяет класс StatefullWidget, ваш код - это функция (метод), которая возвращает виджет. следовательно, метод setState недоступен.

одним из решений является создание этого метода внутри statefullwidget, который вы используете

class Example extends StatefullWidet {
  @override
  createState() => _ExamleState();
}

class _ExampleState extends State<Example> {
 PopupMenuButton<String> appBarMenu(BuildContext context, RateMyApp _rateMyApp) {
  return PopupMenuButton<String>(
      itemBuilder: (BuildContext context) {
        return choicesMenuBtn.map((String choice) {
          return PopupMenuItem<String>(
            child: Text('RateUS'),
          );
        }).toList();
      },
      onSelected: (val) {
        if (val == rateUsMenuBtn) {
          _rateMyApp.showStarRateDialog(
            context,
            actionsBuilder: (_, count) {
              final Widget cancelButton = RateMyAppNoButton(
                _rateMyApp,
                text: 'CANCEL',
                      //here is the problem
                callback: () => setState(() {}),
              );
            },
          );
        }
      });
}

// other code inside the widget

}

или

, вы можете ожидать функцию в качестве параметра если вы хотите использовать функцию внутри больше, чем виджеты

PopupMenuButton<String> appBarMenu(BuildContext context, RateMyApp _rateMyApp, Function onPress) {
  return PopupMenuButton<String>(
      itemBuilder: (BuildContext context) {
        return choicesMenuBtn.map((String choice) {
          return PopupMenuItem<String>(
            child: Text('RateUS'),
          );
        }).toList();
      },
      onSelected: (val) {
        if (val == rateUsMenuBtn) {
          _rateMyApp.showStarRateDialog(
            context,
            actionsBuilder: (_, count) {
              final Widget cancelButton = RateMyAppNoButton(
                _rateMyApp,
                text: 'CANCEL',
                      //here is the problem
                callback: onPress,
              );
            },
          );
        }
      });
}

// and whenever you call it you pass the onClick to the method.
...