又抛出一个异常:setState() or markNeedsBuild() called during build Error in flutter

Another exception was thrown: setState() or markNeedsBuild() called during build Error in flutter

我是 Flutter 的新手,正在开发电子商务 Flutter 应用程序。当我试图导航到搜索屏幕时,它给出了一些错误。请找到以下代码供您参考并帮助解决。

错误: 在为 SearchProvider 发送通知时抛出以下断言: setState() 或 markNeedsBuild() 在构建期间调用。 此 _InheritedProviderScope 小部件无法标记为需要构建,因为 该框架已经在构建小部件的过程中。一个小部件可以被标记为需要 仅当其祖先之一当前正在构建时,才在构建阶段构建。这个异常 是允许的,因为框架在子部件之前构建父部件,这意味着脏 后代将永远被建造。否则,框架可能不会在此期间访问此小部件 构建阶段。 调用 setState() 或 markNeedsBuild() 的小部件是: _InheritedProviderScope 进行违规调用时当前正在构建的小部件是: 搜索屏幕

代码 搜索屏幕

    class SearchScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    
    Provider.of<SearchProvider>(context, listen: false).cleanSearchProduct();
    Provider.of<SearchProvider>(context, listen: false).initHistoryList();

    return Scaffold(
      backgroundColor: ColorResources.getIconBg(context),
      resizeToAvoidBottomInset: true,
      body: Column(
        children: [
          // for tool bar
          SearchWidget(
            hintText: getTranslated('SEARCH_HINT', context),
            onSubmit: (String text) {
              Provider.of<SearchProvider>(context, listen: false)
                  .searchProduct(text, context);
              Provider.of<SearchProvider>(context, listen: false)
                  .saveSearchAddress(text);
            },
            onClearPressed: () {
              Provider.of<SearchProvider>(context, listen: false)
                  .cleanSearchProduct();
            },
          ),

          Consumer<SearchProvider>(
            builder: (context, searchProvider, child) {
              return !searchProvider.isClear
                  ? searchProvider.searchProductList != null
                      ? searchProvider.searchProductList.length > 0
                          ? Expanded(
                              child: SearchProductWidget(
                                  products: searchProvider.searchProductList,
                                  isViewScrollable: true))
                          : Expanded(
                              child:
                                  NoInternetOrDataScreen(isNoInternet: false))
                      : Expanded(
                          child: ProductShimmer(
                              isHomePage: false,
                              isEnabled: Provider.of<SearchProvider>(context)
                                      .searchProductList ==
                                  null))
                  : Expanded(
                      flex: 4,
                      child: Container(
                        padding:
                            EdgeInsets.all(Dimensions.PADDING_SIZE_DEFAULT),
                        child: Stack(
                          clipBehavior: Clip.none,
                          children: [
                            Consumer<SearchProvider>(
                              builder: (context, searchProvider, child) =>
                                  StaggeredGridView.countBuilder(
                                crossAxisCount: 3,
                                physics: NeverScrollableScrollPhysics(),
                                itemCount: searchProvider.historyList.length,
                                itemBuilder: (context, index) => Container(
                                    alignment: Alignment.center,
                                    child: InkWell(
                                      onTap: () {
                                        Provider.of<SearchProvider>(context,
                                                listen: false)
                                            .searchProduct(
                                                searchProvider
                                                    .historyList[index],
                                                context);
                                      },
                                      borderRadius: BorderRadius.circular(20),
                                      child: Container(
                                        padding: EdgeInsets.only(
                                            left: 10,
                                            right: 10,
                                            top: 2,
                                            bottom: 2),
                                        decoration: BoxDecoration(
                                            borderRadius:
                                                BorderRadius.circular(16),
                                            color: ColorResources.getGrey(
                                                context)),
                                        width: double.infinity,
                                        child: Center(
                                          child: Text(
                                            Provider.of<SearchProvider>(context,
                                                        listen: false)
                                                    .historyList[index] ??
                                                "",
                                            style: titilliumItalic.copyWith(
                                                fontSize:
                                                    Dimensions.FONT_SIZE_SMALL),
                                          ),
                                        ),
                                      ),
                                    )),
                                staggeredTileBuilder: (int index) =>
                                    new StaggeredTile.fit(1),
                                mainAxisSpacing: 4.0,
                                crossAxisSpacing: 4.0,
                              ),
                            ),
                            Positioned(
                              top: -5,
                              left: 0,
                              right: 0,
                              child: Row(
                                mainAxisAlignment:
                                    MainAxisAlignment.spaceBetween,
                                children: [
                                  Text(getTranslated('SEARCH_HISTORY', context),
                                      style: robotoBold),
                                  InkWell(
                                      borderRadius: BorderRadius.circular(10),
                                      onTap: () {
                                        Provider.of<SearchProvider>(context,
                                                listen: false)
                                            .clearSearchAddress();
                                      },
                                      child: Container(
                                          padding: EdgeInsets.all(5),
                                          child: Text(
                                            getTranslated('REMOVE', context),
                                            style: titilliumRegular.copyWith(
                                                fontSize:
                                                    Dimensions.FONT_SIZE_SMALL,
                                                color: Theme.of(context)
                                                    .primaryColor),
                                          )))
                                ],
                              ),
                            ),
                          ],
                        ),
                      ),
                    );
            },
          ),
        ],
        ),
        );
       }
     }

提供商

     void initHistoryList() {
    _historyList = [];
    _historyList.addAll(searchRepo.getSearchAddress());
    notifyListeners();
     }

    void cleanSearchProduct() {
    _searchProductList = [];
    _isClear = true;
    _searchText = '';
    notifyListeners();
     }

尝试在 initState 中使用初始函数调用而不是构建函数

@override
  void initState() {
    WidgetsBinding.instance!.addPostFrameCallback((_) {
    Provider.of<SearchProvider>(context, listen: false).cleanSearchProduct();
    Provider.of<SearchProvider>(context, listen: false).initHistoryList();
    });
    super.initState();
  }