Вызов пользовательского метода провайдера внутри setState () вызвал ошибку: или markNeedsBuild (), вызванный во время сборки - PullRequest
0 голосов
/ 01 мая 2020

У меня есть класс состояния виджета флаттера, как показано ниже. Я вызываю Provider.of<AppData>(context, listen: false).recalculateCart(); внутри initState ().

При запуске появляется сообщение об ошибке setState () или markNeedsBuild (), вызываемое во время сборки.

Как мне их устранить?

class CartPageState extends State<CartPage> {
  final TextEditingController _couponController = TextEditingController();

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    Provider.of<AppData>(context, listen: false).recalculateCart();
  }


  @override
  Widget build(BuildContext context) {

    if (Provider.of<AppData>(context, listen: false).selectedStoreId == null){
      Provider.of<AppData>(context, listen: false).setPageAfterStoreSelection('cart');
      return ChooseStorePage(title: 'Choose Store to Continue');
    }
    ...
}

Также вот функция recalculateCart ():

  void recalculateCart() {
   notifyListeners();
  }

1 Ответ

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

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

@override
  void initState() {
    // TODO: implement initState
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) {
       Provider.of<AppData>(context, listen: false).recalculateCart();
    });
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...