Flutter MultiProvider Consumer触发器-如何防止多重重建?

问题描述

Widget build(BuildContext context) {
repo = Provider.of<ProductSessionRepository>(context);
shopInfoRepository = Provider.of<ShopInfoRepository>(context);
psValueHolder = Provider.of<PsValueHolder>(context,listen: false);

final Widget _ExpansionTileTitleWidget = Text(
    Utils.getString(context,'detail_info_tile__session_info'),style: Theme.of(context).textTheme.subtitle1);

return MultiProvider(
    providers: <SingleChildWidget>[
      ChangeNotifierProvider<RegisteredProductSessionProvider>(
          lazy: false,create: (BuildContext context) {
            final RegisteredProductSessionProvider provider =
                RegisteredProductSessionProvider(
                    repo: repo,userId: psValueHolder.loginUserId);
            if (widget.isNavRegistered) {
              provider.getRegisteredProductSessionList(widget.productId);
            }
            return provider;
          }),ChangeNotifierProvider<EnrolledProductSessionProvider>(
          lazy: false,create: (BuildContext context) {
            final EnrolledProductSessionProvider provider =
                EnrolledProductSessionProvider(
                    repo: repo,userId: psValueHolder.loginUserId);
            if (!widget.isNavRegistered) {
              provider.getEnrolledProductSessionList(widget.productId);
            }
            return provider;
          }),ChangeNotifierProvider<ProductSessionProvider>(
          lazy: false,create: (BuildContext context) {
            final ProductSessionProvider provider = ProductSessionProvider(
                repo: repo,userId: psValueHolder.loginUserId);
            productSessionProvider = provider;
            return provider;
          }),ChangeNotifierProvider<ShopInfoProvider>(
          lazy: false,create: (BuildContext context) {
            final ShopInfoProvider provider = ShopInfoProvider(
                repo: shopInfoRepository,psValueHolder: psValueHolder,ownerCode: 'HomeDashboardViewWidget');
            provider.loadShopInfo();
            return provider;
          }),],child: Consumer3<ShopInfoProvider,EnrolledProductSessionProvider,RegisteredProductSessionProvider>(
        builder: (context,shopInfoProvider,enrolledProductSessionProvider,registeredProductSessionProvider,Widget child) {
      if (widget.isNavRegistered) {
        sessionList = registeredProductSessionProvider
            .registeredProductSessionList.data;
      } else {
        sessionList =
            enrolledProductSessionProvider.enrolledProductSessionList.data;
      }
      sessionList.sort((a,b) => a.compareto(b));

      //added future builder to wait for the session status update
      return FutureBuilder<List<Session>>(
        future: WidgetUtils.checkAndUpdateSessionStatus(sessionList,productSessionProvider,shopInfoProvider.shopInfo.data),builder:
            (BuildContext context,AsyncSnapshot<List<Session>> snapshot) {
          if (snapshot.hasData) {
            //if (snapshot.connectionState != ConnectionState.waiting &&!snapshot.hasError) {
            sessionList = snapshot.data; //consolidated sessionList

            if (sessionList.length > 0) {
              return Card(
                elevation: 0.0,child: PsExpansionTile(
                  initiallyExpanded: false,title: _ExpansionTileTitleWidget,children: <Widget>[
                    Padding(
                      padding: const EdgeInsets.only(
                          bottom: PsDimens.space10,left: PsDimens.space10,right: PsDimens.space10),child: sessionList.length > 0
                          ? Column(
                              crossAxisAlignment:
                                  CrossAxisAlignment.stretch,children: <Widget>[
                                Center(
                                    child: _buildSessionDataTable(context)),)
                          : Container(child: Text('None')),)
                  ],),);
            } else {
              return Container();
            }
          } else {
            return Container();
          }
        },);
    }));

如上所述,我的MultiProvider消费者很少。在Consumer3代码块中,我具有FutureBuilder,因为我具有异步会话状态更新方法checkAndUpdateSessionStatus()。消费者3代码块被多次触发,我认为这是MultiProvider消费者模型的本质。问题是,现在checkAndUpdateSessionStatus()也被多次调用,而我希望被调用一次。我可以使用StreamBuilder,但仍然需要异步checkAndUpdateSessionStatus()。

我很陌生。我已经看到许多关于如何防止多重构建的东西的StackOverFow项,但它们都没有解决我的核心问题(我需要MultiProvider,但不想多次触发使用者,并且在使用者内部,我有一个异步过程,该过程不应与多个消费者触发器)。

任何解决方案或替代解决方案都会对我有帮助,并在此先感谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)